初始化项目:添加后端代码、ThinkPHP框架、前端资源

This commit is contained in:
amb
2026-09-03 12:42:39 +08:00
commit 482bece22e
3726 changed files with 416708 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
<?php
namespace app\common\model\goods;
use think\Model;
use app\common\exception\Exception;
/**
* 商品-课程
*/
class Course extends Model
{
protected $model;
public function __construct($data = [])
{
$this->model = new \app\admin\model\course\Course();
$this->columnBindModel = new \app\admin\model\course\ColumnBind();
$this->groupBindModel = new \app\admin\model\course\GroupBind();
}
/**
* 获取课程详情
* @param $id
* @return mixed
*/
public function getDetail($id){
$row = $this->model->field(['id','name','cover','status','price','price_marking','pay_type','sales','type','sales_type'])->find($id);
if (!$row) {
return false;
}
return $row;
}
}
+28
View File
@@ -0,0 +1,28 @@
<?php
namespace app\common\model\goods;
use think\Model;
use think\Db;
/**
* 商品信息调度器
*/
class Goods extends Model
{
public function getTypeList(){
return [
'article' => __('Article'),
'goods' => __('Goods'),
'physical' => __('Physical'),
'video' => __('Video'),
'audio' => __('Audio'),
'live' => __('Live'),
'column' => __('Column'),
'vipcard' => __('Vipcard'),
'activity' => __('Activity'),
'exercises' => __('Exercises')
];
}
}
+278
View File
@@ -0,0 +1,278 @@
<?php
namespace app\common\model\goods;
use think\Model;
use think\Db;
/**
* 商品信息调度器
*/
class Handle extends Model
{
/**
* 获取商品详情
* @param $goodsId 商品ID
* @param $type 商品类型
* @param $count 数量
* @param $extend 额外信息
* @return void
*/
public static function getGoodsDetail($goodsId,$type='course',$count=1,$extend=''){
$result = false;
//提前适配
//未来会添加其他类型的商品 如实物、卡密等等
//要考虑积分商品
switch ($type){
case 'vipcard':
$result = (new \app\api\model\app\vip\Card())->getPayDetail($goodsId);
break;
case 'live_gift':
$result = (new \app\admin\model\live\GiftOptions())->getPayDetail($goodsId);
break;
case 'exercises':
$result = (new \app\api\model\app\exam\Exercises())->getPayDetail($goodsId);
break;
case 'activity':
$result = (new \app\api\model\app\activity\Activity())->getPayDetail($goodsId,$count,$extend);
break;
case 'physical':
$result = (new \app\api\model\app\physical\Goods())->getPayDetail($goodsId,$count,$extend);
break;
case 'composite':
if (!\app\admin\library\project\App::isInstall('composite')) {
$result = false;
break;
}
$result = (new \app\common\model\goods\Composite())->getPayDetail($goodsId,$count,$extend);
break;
default:
$result = (new \app\common\model\goods\Course())->getDetail($goodsId);
if($result){
\app\common\model\course\Course::checkSalesType($result);
}
break;
}
return $result;
}
/**
* 获取商品列表
* @param $where
* @param $sort
* @param $order
* @param $limit
* @return \think\db\Query
*/
public static function getGoodsQuery($where = [],$sort='id', $order = 'desc',$limit = 10){
$field = [
'id'=>'id',
'name'=>"name",
'cover'=>'cover',
'createtime'=>'createtime',
'views'=>"views",
'type'=>'type',
'status'=>'status',
'sales'=>"null as `sales`",
'hide'=>"0 as `hide`",
'sales_type'=>"'alone' as `sales_type`",
'briefing'=>"null as `briefing`",
'uniacid'=>'uniacid',
'price'=>"0 as `price`",
'pay_type'=>"'pay' as `pay_type`",
];
$query1 = Db::table(\app\common\model\course\Course::getTable())->field(array_values(array_merge($field,['price'=>'price','pay_type'=>'pay_type','briefing'=>'briefing','type'=>'type','hide'=>'hide','sales_type'=>'sales_type','sales'=>'sales','hide'=>'hide'])))->where([
'uniacid'=>UNIACID
])->buildSql();
$query2 = Db::name("app_activity")->field(array_values(array_merge($field,['price'=>"price",'type'=>"'activity' as `type`"])))->where([
'uniacid'=>UNIACID
])->buildSql();
$query3 = Db::table(\app\common\model\app\exam\Exercises::getTable())->field(array_values(array_merge($field,['price'=>"`pay_price` as `price`",'hide'=>'hide','type'=>"'exercises' as `type`",'pay_type'=>"CASE sales_type WHEN 1 THEN 'free' WHEN 2 THEN 'pay' WHEN 3 THEN 'bind_course' END as `pay_type`",'sales_type'=>'sales_type'])))->where([
'uniacid'=>UNIACID
])->buildSql();
$vipIcon = request()->domain().'/assets/image/vip.png';
$query4 = Db::name("app_vip_card")->field(array_values(array_merge($field,['price'=>"price",'briefing'=>"`subtitle` as `briefing`",'name'=>"`title` as `name`",'cover'=>"'".$vipIcon."' as cover",'views'=>"0 as `views`",'type'=>"'vipcard' as `type`"])))->where([
'uniacid'=>UNIACID
])->buildSql();
$query5 = Db::table(\app\admin\model\app\physical\Goods::getTable())->field(array_values(array_merge($field,['name'=>'name','price'=>'price','type'=>"'physical' as `type`",'hide'=>"'is_hide' as `hide`"])))->where([
'uniacid'=>UNIACID,
'status'=>1
])->buildSql();
$sql = "{$query1} UNION {$query2} UNION {$query3} UNION {$query4} UNION {$query5}";
if (\app\admin\library\project\App::isInstall('composite')) {
$query6 = Db::table(\app\admin\model\app\composite\Goods::getTable())->field(array_values(array_merge($field,[
"name"=>"name",
"price"=>"min_price as price",
"type"=>"'composite' as `type`",
//组合商品封面取 images 字段(JSON 数组)的第一张图
"cover"=>"COALESCE(JSON_UNQUOTE(JSON_EXTRACT(images, '$[0]')), '') as cover",
"hide"=>"0 as `hide`",
"pay_type"=>"'pay' as `pay_type`"
])))->where([
'uniacid'=>UNIACID,
'status'=>1,
'is_show'=>1
])->buildSql();
$sql .= " UNION {$query6}";
}
if(\app\admin\library\project\App::isInstall('test')){
$query6 = Db::table(\app\admin\model\app\test\Test::getTable())->field(array_values(array_merge($field,['price'=>"'0' as `price`",'views'=>"'0' as `views`",'type'=>"'test' as `type`"])))->where([
'uniacid'=>UNIACID
])->buildSql();
$sql .= " UNION {$query6}";
}
return Db::table("({$sql})". ' as goods');
}
/**
* 获取不同商品类型在列表中展示的额外字段,如价格,支付方式
* @param $id
* @param $type
* @return array
*/
public static function parseGoodsExtendInfo($id,$type){
$item = [];
$item['pay_type'] = 'free';
$item['price'] = 0;
$item['price_marking'] = 0;
switch ($type){
case 'exercises':
//作业考试
$extendInfo = \app\common\model\app\exam\Exercises::where([
'id'=>$id
])->field(['sales_type','pay_price'])->find();
if($extendInfo){
$item['pay_type'] = $extendInfo['sales_type'] == 1 ? 'free' : ($extendInfo['sales_type'] == 2 ? 'pay' : 'bind_course');
if($item['pay_type'] == 'pay'){
$item['price'] = $extendInfo['pay_price'];
}else{
$item['price'] = 0;
}
}
break;
case 'live_gift':
//直播礼物
break;
case 'test':
//考试
$item['pay_type'] = 'bind_course';
break;
case 'vipcard':
if(\app\common\library\Platform::getSystemType() == 'single'){
$item['cover'] = MODULE_URL.'/assets/image/vipcard.png';
}else{
$item['cover'] = MODULE_URL.'/public/assets/image/vipcard.png';
}
$extendInfo = \app\common\model\app\vip\Card::where([
'id'=>$id
])->field(['sku'])->find();
if($extendInfo){
$extendInfo['sku'] = json_decode($extendInfo['sku'],true);
if($extendInfo['sku']){
$item['pay_type'] = 'pay';
$item['price'] = $extendInfo['sku'][0]['price'];
}
}
//付费会员卡
break;
case 'activity':
$extendInfo = \app\common\model\app\activity\Activity::where([
'id'=>$id
])->field(['location','activity_start_time'])->find();
if($extendInfo){
$extendInfo = $extendInfo->toArray();
$item = array_merge($item,$extendInfo);
$ticketPrice = \app\common\model\app\activity\Ticket::where([
'activity_id'=>$id
])->field(['price'])->order("price","asc")->find();
if($ticketPrice){
$item['pay_type'] = 'pay';
$item['price'] = $ticketPrice['price'];
}
}
//活动
break;
case 'physical':
$extendInfo = \app\common\model\app\physical\Goods::where([
'id'=>$id
])->field(['id','spec_type','cover as image'])->find();
if($extendInfo){
$extendInfo = $extendInfo->toArray();
$item = array_merge($item,$extendInfo);
$item['cover'] = $extendInfo['image'] ?? '';
$skuPriceQuery = \app\admin\model\app\physical\SkuPrice::where([
'goods_id'=>$id,
'uniacid'=>UNIACID
]);
if($extendInfo['spec_type'] == 'single'){
$skuPrice = $skuPriceQuery->order('id','asc')->find();
}else{
$skuPrice = $skuPriceQuery->order('price','asc')->find();
}
if($skuPrice){
$item['pay_type'] = 'pay';
$item['price'] = $skuPrice['price'];
$item['price_marking'] = $skuPrice['original_price'] ?: $skuPrice['price'];
}
}
break;
case 'composite':
if (\app\admin\library\project\App::isInstall('composite')) {
$extendInfo = \app\admin\model\app\composite\Goods::where(['id'=>$id])->field(['id','name','min_price','images'])->find();
if ($extendInfo) {
$extendInfo = $extendInfo->toArray();
$item['pay_type'] = 'pay';
$item['price'] = $extendInfo['min_price'] ?? 0;
$images = $extendInfo['images'] ?? [];
if (is_string($images)) {
$images = json_decode($images, true) ?: [];
}
$item['cover'] = $images[0] ?? '';
}
}
break;
default:
//图文、视频、音频、直播、专栏课程
$extendInfo = \app\common\model\course\Course::where([
'id'=>$id
])->field(['price_marking','price','pay_type'])->find();
if($extendInfo){
$extendInfo = $extendInfo->toArray();
$item = array_merge($item,$extendInfo);
}
break;
}
return $item;
}
public function withagentgoods()
{
return $this->belongsTo('\app\common\model\app\agent\Goods', 'goods_id', 'id', [], 'RIGHT')->setEagerlyType(0);
}
}