- 框架初始化
 - 安装插件
 - 修复PHP8.4报错
This commit is contained in:
2025-04-19 17:21:20 +08:00
commit c6a4e1f5f6
5306 changed files with 967782 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
<?php
namespace app\admin\validate\shopro;
use think\Validate;
class Category extends Validate
{
/**
* 验证规则
*/
protected $rule = [
'name' => 'require',
'style' => 'require',
];
/**
* 提示消息
*/
protected $message = [
'name.require' => '请填写自定义分类名称',
'style.require' => '请选择分类样式',
];
/**
* 验证场景
*/
protected $scene = [
'add' => ['name', 'style'],
'edit' => ['name', 'style'],
];
}

View File

@@ -0,0 +1,44 @@
<?php
namespace app\admin\validate\shopro;
use think\Validate;
use app\admin\validate\shopro\traits\CustomRule;
class Coupon extends Validate
{
use CustomRule;
protected $rule = [
'name' => 'require',
'type' => 'require',
'use_scope' => 'require',
'items' => 'requireIfAll:use_scope,goods,disabled_goods,category', // 当 use_scope 在 goods,disabled_goods,category 时items 必填
'amount' => 'require',
'enough' => 'require',
'stock' => 'require',
'get_time' => 'require',
'use_time_type' => 'require',
'use_time' => 'requireIf:use_time_type,range', // 固定区间时必填
'days' => 'requireIf:use_time_type,days', // 相对天数时必填
];
protected $message = [
'name.require' => '请填写优惠券名称',
'type.require' => '请选择优惠券类型',
'use_scope.require' => '请选择可用范围',
'items.requireIfAll' => '请选择可用范围值',
'amount.require' => '请填写优惠券面额',
'enough.require' => '请填写优惠券消费门槛',
'stock.require' => '请填写优惠券发放数量',
'get_time.require' => '请选择优惠券发放时间',
'use_time_type.require' => '请选择优惠券使用时间类型',
'use_time.requireIf' => '请选择优惠券可使用时间',
'days.requireIf' => '请填写优惠券有效天数',
];
protected $scene = [
'add' => ['name', 'type', 'use_scope', 'items', 'amount', 'enough', 'stock', 'get_time', 'use_time_type', 'use_time', 'days'],
];
}

View File

@@ -0,0 +1,71 @@
<?php
namespace app\admin\validate\shopro;
use think\Validate;
class PayConfig extends Validate
{
protected $rule = [
'name' => 'require',
'type' => 'require',
'params' => 'require|array',
'mode' => 'require', // 模式必选
'mch_id' => 'require',
'mch_secret_key' => 'require',
'mch_secret_cert' => 'require',
'mch_public_cert_path' => 'require',
'sub_mch_id' => 'requireIf:mode,2',
'app_id' => 'requireIf:mode,2', // 这个支付宝也用这个 app_id 参数名,这里有点问题,支付宝普通模式如果不填这里验证拦不住
'sub_mch_secret_key' => 'requireIf:mode,2',
'sub_mch_secret_cert' => 'requireIf:mode,2',
'sub_mch_public_cert_path' => 'requireIf:mode,2',
// 支付宝参数校验
'service_provider_id' => 'requireIf:mode,service',
'alipay_public_cert_path' => 'require',
'app_public_cert_path' => 'require',
'alipay_root_cert_path' => 'require',
'private_key' => 'require',
];
protected $message = [
'name.require' => '请填写支付配置名称',
'type.require' => '请选择支付配置类型',
'params.require' => '请填写正确的支付参数',
'params.array' => '请填写正确的支付参数',
// 微信支付参数校验
'mode.require' => '请选择商户类型',
'app_id.requireIf' => '请填写商户相关 AppId', // 这个支付宝也用这个 app_id 参数名
'mch_id.require' => '请填写商户 ID',
'mch_secret_key.require' => '请填写商户密钥',
'mch_secret_cert.require' => '请上传商户 key 证书',
'mch_public_cert_path.require' => '请上传商户证书',
'sub_mch_id.requireIf' => '请填写子商户 ID',
'sub_mch_secret_key.requireIf' => '请填写子商户密钥',
'sub_mch_secret_cert.requireIf' => '请上传子商户 key 证书',
'sub_mch_public_cert_path.requireIf' => '请上传子商户证书',
// 支付宝参数校验
'service_provider_id.requireIf' => '请填写主商户 ID',
'alipay_public_cert_path.require' => '请上传支付宝公钥证书',
'app_public_cert_path.require' => '请上传应用公钥证书',
'alipay_root_cert_path.require' => '请上传支付宝根证书',
'app_secret_cert.require' => '请填写支付宝私钥',
];
protected $scene = [
'add' => ['name', 'type', 'params'],
'wechat' => ['mode', 'mch_id', 'mch_secret_key', 'mch_secret_cert', 'mch_public_cert_path', 'app_id', 'sub_mch_id'],
'alipay' => ['mode', 'service_provider_id', 'app_id', 'alipay_public_cert_path', 'app_public_cert_path', 'alipay_root_cert_path', 'app_secret_cert'],
];
}

View File

@@ -0,0 +1,30 @@
<?php
namespace app\admin\validate\shopro\activity;
use think\Validate;
class Activity extends Validate
{
protected $rule = [
'title' => 'require',
'type' => 'require',
'start_time' => 'require',
'end_time' => 'require',
'rules' => 'require|array',
];
protected $message = [
'title.require' => '请填写活动标题',
'type.require' => '活动类型不正确',
'start_time.require' => '请选择活动开始时间',
'end_time.require' => '请选择活动结束时间',
'rules.require' => '缺少活动规则',
'rules.array' => '活动规则不正确',
];
protected $scene = [
'add' => ['title', 'type', 'start_time', 'end_time', 'rules'],
];
}

View File

@@ -0,0 +1,27 @@
<?php
namespace app\admin\validate\shopro\chat;
use think\Validate;
class ScoreShop extends Validate
{
protected $rule = [
'goods_id' => 'require',
'sku_prices' => 'require|array',
];
protected $message = [
'goods_id.require' => '请选择要添加的商品',
'sku_prices.require' => '请填写积分商品规格',
'sku_prices.array' => '请填写积分商品规格',
];
protected $scene = [
'add' => ['goods_id', 'sku_prices'],
'edit' => ['sku_prices']
];
}

View File

@@ -0,0 +1,25 @@
<?php
namespace app\admin\validate\shopro\chat;
use think\Validate;
class CommonWord extends Validate
{
protected $rule = [
'room_id' => 'require',
'name' => 'require',
'content' => 'require',
];
protected $message = [
'room_id.require' => '客服房间号必须填写',
'name.require' => '常用语名称必须填写',
'content.require' => '常用于内容必须填写',
];
protected $scene = [
'add' => ['room_id', 'name', 'content']
];
}

View File

@@ -0,0 +1,29 @@
<?php
namespace app\admin\validate\shopro\chat;
use think\Validate;
class CustomerService extends Validate
{
protected $rule = [
'name' => 'require',
'avatar' => 'require',
'room_id' => 'require',
'auth' => 'require',
'auth_id' => 'require',
];
protected $message = [
'name.require' => '客服名称必须填写',
'avatar.require' => '客服头像必须上传',
'room_id.require' => '客服房间号必须填写',
'auth.require' => '客服所属身份必须选择',
'auth_id.require' => '客服所属身份必须选择',
];
protected $scene = [
'add' => ['name', 'avatar', 'room_id', 'auth', 'auth_id']
];
}

View File

@@ -0,0 +1,25 @@
<?php
namespace app\admin\validate\shopro\chat;
use think\Validate;
class Question extends Validate
{
protected $rule = [
'room_id' => 'require',
'title' => 'require',
'content' => 'require',
];
protected $message = [
'room_id.require' => '客服房间号必须填写',
'title.require' => '猜你想问标题必须填写',
'content.require' => '猜你想问内容必须填写',
];
protected $scene = [
'add' => ['room_id', 'title', 'content']
];
}

View File

@@ -0,0 +1,36 @@
<?php
namespace app\admin\validate\shopro\data;
use think\Validate;
class FakeUser extends Validate
{
protected $rule = [
'username' => 'require|alphaDash|length:5,20',
'nickname' => 'require|chsDash|length:2,15',
'mobile' => 'regex:/^1[3-9]\d{9}$/',
'avatar' => 'require',
'email' => 'email',
'password' => 'length:6,16',
];
protected $message = [
'username.require' => '用户名必须填写',
'username.alphaDash' => '用户名只能是字母和数字下划线_及破折号-',
'username.length' => '用户名长度必须在 5-20 位',
'nickname.require' => '昵称必须填写',
'nickname.chsDash' => '昵称名称只能是汉字、字母、数字和下划线_及破折号-',
'nickname.length' => '昵称长度必须在 2-15 位',
'mobile.regex' => '手机号格式不正确',
'avatar.require' => '头像必须上传',
'email.email' => '邮箱格式不正确',
'password.length' => '密码长度必须在 6-16 位',
];
protected $scene = [
'add' => ['username', 'nickname', 'mobile', 'password', 'avatar', 'email'],
'edit' => ['username', 'nickname', 'mobile', 'password', 'avatar', 'email'],
];
}

View File

@@ -0,0 +1,33 @@
<?php
namespace app\admin\validate\shopro\data;
use think\Validate;
class Faq extends Validate
{
/**
* 验证规则
*/
protected $rule = [
'title' => 'require',
'content' => 'require',
'status' => 'require',
];
/**
* 提示消息
*/
protected $message = [
'title.require' => '请填写 Faq 标题',
'content.require' => '请填写 Faq 内容',
'status.require' => '请选择 Faq 状态',
];
/**
* 验证场景
*/
protected $scene = [
'add' => ['title', 'content', 'status'],
'edit' => ['title', 'content', 'status'],
];
}

View File

@@ -0,0 +1,41 @@
<?php
namespace app\admin\validate\shopro\dispatch;
use think\Validate;
class Dispatch extends Validate
{
protected $rule = [
'name' => 'require',
'express' => 'array',
'autosend' => 'array',
// express 表数据
'type' => 'require',
'first_num' => 'require',
'first_price' => 'require',
'additional_num' => 'require',
'additional_price' => 'require',
];
protected $message = [
'name.require' => '请填写自定义分类名称',
'express.array' => '请填写正确的模板规则',
'autosend.array' => '请填写正确的自动发货规则',
'type.require' => '请选择计价方式',
'first_num.require' => '请填写初始计价数量',
'first_price.require' => '请填写初始配送价格',
'additional_num.require' => '请填写追加计价数量',
'additional_price.require' => '请填写追加计价价格',
];
protected $scene = [
'add' => ['name', 'express'],
'express' => ['type', 'first_num', 'first_price', 'additional_num', 'additional_price'],
'autosend' => ['type', 'content']
];
}

View File

@@ -0,0 +1,30 @@
<?php
namespace app\admin\validate\shopro\goods;
use think\Validate;
class Comment extends Validate
{
protected $rule = [
'goods_id' => 'require',
'user_id' => 'require',
'level' => 'require|number|between:1,5',
'content' => 'require',
];
protected $message = [
'goods_id.require' => '请选择商品',
'user_id.require' => '请选择用户',
'level.require' => '请选择评价星级',
'level.number' => '请选择评价星级',
'level.between' => '请选择评价星级',
'content.require' => '请填写内容',
];
protected $scene = [
'add' => ['goods_id', 'user_id', 'level', 'content'],
'reply' => ['content'],
];
}

View File

@@ -0,0 +1,45 @@
<?php
namespace app\admin\validate\shopro\goods;
use think\Validate;
use app\admin\validate\shopro\traits\CustomRule;
class Goods extends Validate
{
use CustomRule;
protected $rule = [
'title' => 'require',
// 'subtitle' => 'require',
'category_ids' => 'require',
'image' => 'require',
'images' => 'require|array',
'is_sku' => 'require',
// 'cost_price' => 'require',
// 'original_price' => 'requireIf:is_sku,0',
'price' => 'requireIf:is_sku,0',
'dispatch_id' => 'requireIfAll:dispatch_type,express,autosend',
];
protected $message = [
'title.require' => '请填写商品标题',
// 'subtitle.require' => '请填写商品副标题',
'category_ids.require' => '请选择商品分类',
'image.require' => '请选择商品封面图',
'images.require' => '请选择商品轮播图',
'images.array' => '请选择商品轮播图',
// 'cost_price.require' => '请填写商品成本价',
// 'original_price.require' => '请填写商品原价',
'price.requireIf' => '请填写商品现价',
'dispatch_id.requireIfAll' => '请选择配送模板',
];
protected $scene = [
'add' => ['title', 'image', 'images', 'price', 'dispatch_id'],
'sku_params' => ['price']
];
}

View File

@@ -0,0 +1,21 @@
<?php
namespace app\admin\validate\shopro\goods;
use think\Validate;
class Service extends Validate
{
protected $rule = [
'name' => 'require',
];
protected $message = [
'name.require' => '请填写服务保障名称',
];
protected $scene = [
'add' => ['name']
];
}

View File

@@ -0,0 +1,23 @@
<?php
namespace app\admin\validate\shopro\goods;
use think\Validate;
class StockWarning extends Validate
{
protected $rule = [
'stock' => 'require|integer|gt:0',
];
protected $message = [
'stock.require' => '请填写补货数量',
'stock.integer' => '请填写补货数量',
'stock.gt' => '请填写正确的补货数量'
];
protected $scene = [
'add_stock' => ['stock']
];
}

View File

@@ -0,0 +1,29 @@
<?php
namespace app\admin\validate\shopro\order;
use think\Validate;
class Aftersale extends Validate
{
protected $rule = [
'refuse_msg' => 'require',
'refund_money' => 'require|float|gt:0',
'content' => 'require'
];
protected $message = [
'refuse_msg.require' => '请输入拒绝原因',
'refund_money.require' => '请输入正确的退款金额',
'refund_money.float' => '请输入正确的退款金额',
'refund_money.gt' => '请输入正确的退款金额',
'content.require' => '请输入留言内容',
];
protected $scene = [
'refuse' => ['refuse_msg'],
'refund' => ['refund_money'],
'add_log' => ['content'],
];
}

View File

@@ -0,0 +1,75 @@
<?php
namespace app\admin\validate\shopro\order;
use think\Validate;
class Order extends Validate
{
protected $rule = [
'order_id' => 'require',
'order_item_ids' => 'require',
'custom_type' => 'require',
'custom_content' => 'require',
'pay_fee' => 'require|float|gt:0',
'change_msg' => 'require',
// 编辑订单收货地址
'consignee' => 'require',
'mobile' => 'require',
'province_name' => 'require',
'city_name' => 'require',
'district_name' => 'require',
'address' => 'require',
'province_id' => 'require',
'city_id' => 'require',
'district_id' => 'require',
// 编辑卖家备注
'memo' => 'require',
// 订单退款
'refund_money' => 'require|float|gt:0'
];
protected $message = [
'order_id' => '参数错误',
'order_item_ids' => '参数错误',
'custom_type' => '请选择发货内容类型',
'custom_content' => '请填写发货内容',
'pay_fee.require' => '请输入正确的应支付金额',
'pay_fee.float' => '请输入正确的应支付金额',
'pay_fee.gt' => '请输入正确的应支付金额',
'change_msg.require' => '请输入改价备注',
// 编辑订单收货地址
'consignee.require' => '请填写收货人信息',
'mobile.require' => '请填写手机号',
'province_name.require' => '请选择省份',
'city_name.require' => '请选择城市',
'district_name.require' => '请选择地区',
'address.require' => '请填写详细收货信息',
'province_id.require' => '请选择省份',
'city_id.require' => '请选择城市',
'district_id.require' => '请选择地区',
// 编辑卖家备注
'memo.require' => '请输入卖家备注',
// 订单退款
'refund_money.require' => '请输入正确的退款金额',
'refund_money.float' => '请输入正确的退款金额',
'refund_money.gt' => '请输入正确的退款金额',
];
protected $scene = [
'custom_dispatch' => ['order_id', 'order_item_ids', 'custom_type', 'custom_content'],
'change_fee' => ['pay_fee', 'change_msg'],
'edit_consignee' => ['consignee', 'mobile', 'province_name', 'city_name', 'district_name', 'address', 'province_id', 'city_id', 'district_id'],
'edit_memo' => ['memo'],
'refund' => ['refund_money'],
];
}

View File

@@ -0,0 +1,31 @@
<?php
namespace app\admin\validate\shopro\traits;
/**
* 自定义验证规则
*/
trait CustomRule
{
/**
* requireIf 的扩展, 可以同时验证多个值
*
* @param mixed $value
* @param mixed $rule
* @param array $data
* @return bool
*/
protected function requireIfAll($value, $rule, $data = [])
{
$ruleArr = explode(',', $rule);
$ifField = $ruleArr[0];
unset($ruleArr[0]);
if (in_array($data[$ifField], $ruleArr)) {
return $value ? true : false;
} else {
return true;
}
}
}

View File

@@ -0,0 +1,130 @@
<?php
namespace app\admin\validate\shopro\user;
use think\Validate;
use think\Db;
use think\Loader;
use think\exception\ClassNotFoundException;
class User extends Validate
{
protected $regex = [
'password' => '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]+\S{5,12}$/',
'notPureNumber' => '^[a-zA-Z][a-zA-Z0-9_]{4,15}$',
'mobile' => '/^1[3456789]\d{9}$/',
];
protected $rule = [
'username' => 'alphaDash|length:5,12|unique:user|regex:notPureNumber',
'nickname' => 'require|length:1,10',
'mobile' => 'regex:mobile',
'password' => 'length:6,16|regex:password',
'oldPassword' => 'require',
'newPassword' => 'require|length:6,16|regex:password',
'avatar' => 'require',
'email' => 'email|unique:user',
'code' => 'require',
'gender' => 'in:0,1'
];
protected $message = [
'username.require' => '用户名必须填写',
'username.alphaDash' => '用户名只能包含字母,数字,_和-',
'username.length' => '用户名长度必须在 5-12 位',
'username.unique' => '用户名已被占用',
'username.regx' => '用户名需以字母开头',
'nickname.require' => '昵称必须填写',
'nickname.chsDash' => '昵称只能包含汉字,字母,数字,_和-',
'nickname.length' => '昵称长度必须在 2-10 位',
'mobile.require' => '手机号必须填写',
'mobile.regex' => '手机号格式不正确',
'mobile.unique' => '手机号已被占用',
'password.require' => '请填写密码',
'password.length' => '密码长度必须在 6-16 位',
'password.regx' => '密码必须包含字母和数字',
'oldPassword.require' => '请填写旧密码',
'newPassword.require' => '请填写新密码',
'newPassword.length' => '密码长度必须在 6-16 位',
'newPassword.regx' => '密码必须包含字母和数字',
'avatar.require' => '头像必须上传',
'email.email' => '邮箱格式不正确',
'email.unique' => '邮箱已被占用',
'code.require' => '请填写验证码',
'gender.in' => '请选择性别'
];
protected $scene = [
'edit' => ['username', 'nickname', 'mobile', 'password', 'avatar', 'gender', 'email', 'status']
];
/**
* 验证是否唯一
* @access public
* @param mixed $value 字段值
* @param mixed $rule 验证规则 格式:数据表,字段名,排除ID,主键名
* @param array $data 数据
* @param string $field 验证字段名
* @return bool
*/
public function unique($value, $rule, $data = [], $field = '')
{
if (is_string($rule)) {
$rule = explode(',', $rule);
}
if (false !== strpos($rule[0], '\\')) {
// 指定模型类
$db = new $rule[0];
} else {
try {
$db = Loader::model($rule[0]);
} catch (ClassNotFoundException $e) {
$db = Db::name($rule[0]);
}
}
$key = $rule[1] ?? $field;
$map = [];
if (strpos($key, '^')) {
// 支持多个字段验证
$fields = explode('^', $key);
foreach ($fields as $key) {
if (isset($data[$key])) {
$map[$key] = ['=', $data[$key]];
}
}
} elseif (isset($data[$field])) {
$map[$key] = ['=', $data[$field]];
} else {
$map = [];
}
$pk = !empty($rule[3]) ? $rule[3] : $db->getPk();
if (is_string($pk)) {
if (isset($rule[2])) {
$map[$pk] = ['neq', $rule[2]];
} elseif (isset($data[$pk])) {
$map[$pk] = ['neq', $data[$pk]];
}
}
if ($db->where($map)->field($pk)->find()) {
return false;
}
return true;
}
}