作者 zhl

Merge remote-tracking branch 'origin/dev' into zhl

正在显示 60 个修改的文件 包含 2290 行增加760 行删除
... ... @@ -89,22 +89,22 @@ final class Code extends Enum implements LocalizedEnum
511 => 'Network Authentication Required', // RFC6585
];
//成功
const SUCCESS = 200;
const SUCCESS = 'A0000';
//用户行为大大类
const USER_ERROR = 202;
const USER_ERROR = 'A0010';
//用户错误大类
const USER_REGISTER_ERROE = 203;
const USER_REGISTER_ERROE = 'A0100';
//用户登陆错误大类
const USER_LOGIN_ERROE = 204;
const USER_LOGIN_ERROE = 'A1000';
//用户权限错误大类
const USER_PERMISSION_ERROE = 205;
const USER_PERMISSION_ERROE = 'A0200';
//用户请求参数错误大类
const USER_PARAMS_ERROE = 206;
const USER_PARAMS_ERROE = 'A0300';
//模型资源未找到
const USER_MODEL_NOTFOUND_ERROE = 207;
const USER_MODEL_NOTFOUND_ERROE = 'A0400';
//用户上传异常大类
const USER_UPLOAD_ERROE = 'A0500';
... ...
... ... @@ -9,6 +9,7 @@ use App\Utils\EncryptUtils;
use App\Utils\LogUtils;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Route;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
... ... @@ -112,12 +113,7 @@ class Handler extends ExceptionHandler
$code = $exception->getCode();
} elseif ($exception instanceof ValidationException) {
$code = Code::USER_PARAMS_ERROE();
} elseif ($exception instanceof \RedisException) {
$code = Code::SERVER_REDIS_ERROR();
} elseif ($exception instanceof \PDOException) {
$code = Code::SERVER_MYSQL_ERROR();
} elseif ($exception instanceof ModelNotFoundException) {
$code = Code::USER_MODEL_NOTFOUND_ERROE();
$message = Arr::first(Arr::first($exception->errors()));
} elseif ($exception instanceof NotFoundHttpException || $exception instanceof MethodNotAllowedHttpException) {
return response('404 Not Found', 404);
} else {
... ... @@ -135,6 +131,7 @@ class Handler extends ExceptionHandler
//开启debug 错误原样输出
$debub = config('app.debug');
$message = $debub ? $message : ($code->description ?? $message);
$response = [
'code' => $code,
'message' => $message
... ...
<?php
namespace App\Helper;
/**
* 数组类函数
* Class Arrays
* @package App\Helper
* @author zbj
* @date 2023/4/15
*/
class Arr extends \Illuminate\Support\Arr
{
/**
* 把返回的数据集转换成Tree
* @param $list
* @param string $pk
* @param string $pid
* @param string $child
* @param int $root
* @return array
* @author zbj
* @date 2023/4/13
*/
public static function listToTree($list, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0)
{
// 创建Tree
$tree = array();
if (is_array($list)) {
// 创建基于主键的数组引用
$refer = array();
foreach ($list as $key => $data) {
$refer[$data[$pk]] = &$list[$key];
}
foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = $data[$pid];
if ($root == $parentId) {
$tree[] = &$list[$key];
} else {
if (isset($refer[$parentId])) {
$parent = &$refer[$parentId];
$parent[$child][] = &$list[$key];
}
}
}
}
return $tree;
}
/**
* 分隔字符串成数组并按照指定的函数过滤数组
* @param string $string
* @param string $filters
* @param string $delimiter
* @return array|false|string[]
* @author zbj
* @date 2023/4/13
*/
public static function splitFilterToArray($string, $filters = 'trim', $delimiter = ',')
{
if (!$string) {
return [];
}
$data = !is_array($string) ? explode($delimiter, $string) : $string;
$filters = explode(',', $filters);
if (!$filters) {//没有值或者没有过滤函数
return $data;
}
//过滤
foreach ($filters as $fun) {
if (!function_exists($fun)) {
continue;
}
$data = array_map($fun, $data);
}
return $data;
}
/**
* 只保留指定的key 最多支持二维数组
* @param array $rows 需要过滤的数组
* @param array $keepKeys 需要保留的键名
* @return array|array[]|mixed
* @author zbj
* @date 2023/4/15
*/
public static function twoKeepKeys(array $rows, array $keepKeys)
{
if (!$rows || !$keepKeys) {
return $rows;
}
//第一维有字符串键名 就过滤第一维
$signle = false;
$keys = array_keys($rows);
foreach ($keys as $k) {
if (!is_numeric($k)) {
$signle = true;
$rows = [$rows];
break;
}
}
//将数组将非法的键去掉
$rows = array_map(function ($item) use ($keepKeys) {
if (!is_array($item)) {
return $item;
}
$illegalKeys = array_diff(array_keys($item), $keepKeys);//获取非法键名
if ($illegalKeys) {
foreach ($illegalKeys as $key) {
unset($item[$key]);
}
}
return $item;
}, $rows);
return $signle ? $rows[0] : $rows;
}
}
... ...
<?php
/**
* 生成路由标识
* @param $string
* @return string
* @author zbj
* @date 2023/4/15
*/
function generateRoute($string){
return trim(strtolower(preg_replace( '/[\W]+/', '-', trim($string))), '-');
}
... ...
... ... @@ -16,13 +16,13 @@ class BaseController extends Controller
protected $param = [];//所有请求参数
protected $token = ''; //token
protected $request = [];//助手函数
protected $allCount = 0;//总条数
protected $p = 1;//当前页
protected $row = 20;//每页条数
protected $header = [];//设置请求头参数
protected $order = 'id';
protected $map = [];//处理后的参数
protected $uid = 0;
protected $user = [];//当前登录用户详情
/**
* 获取所有参数
*/
... ... @@ -44,6 +44,7 @@ class BaseController extends Controller
public function auth_token(){
$info = Cache::get($this->token);
if(isset($info) && !empty($info)){
$this->user = $info;
$this->uid = $info['id'];
}
}
... ... @@ -74,7 +75,7 @@ class BaseController extends Controller
$response = [
'p' => (new EncryptUtils())->openssl_en($response, $k, $i)];
}
return response()->json($response)->header($this->header);
return response()->json($response,200,$this->header);
}
/**
... ... @@ -99,12 +100,12 @@ class BaseController extends Controller
case 'row':
$this->row = $v;
break;
case "create_at":
case "created_at":
$this->_btw[0] = $v;
$this->_btw[1] = date('Y-m-d H:i:s',time());
$this->map['create_at'] = ['between', $this->_btw];
break;
case "update_at":
case "updated_at":
$this->_btw[1] = $v;
$this->map['update_at'] = ['between', $this->_btw];
break;
... ... @@ -132,30 +133,29 @@ class BaseController extends Controller
];
$this->header['Content-Type'] = $type;
$this->header['token'] = $this->token;
$response = Response::create(json_encode($result),$code,$this->header);
$response = response($result,$result_code,$this->header);;
throw new HttpResponseException($response);
}
/**
* 方法请求输出数据(带分页参数)
* @param $data
* @return
*/
protected function result($lists) {
$data['data'] = $lists;
$data['page'] = $this->setPages();
$this->response('success', 200, $data);
}
/**
* 设置分页返回参数()
* @name :上传图片
* @return void
* @author :liyuhang
* @method
*/
protected function setPages() {
$page_count = $this->allCount > $this->row ? ceil($this->allCount / $this->row) : 1;
$this->header['Total-Count'] = $this->allCount; //总条数
$this->header['Page-Count'] = $page_count; //总页数
$this->header['Current-Page'] = $this->p; //当前页数
$this->header['Per-Page'] = $this->row; //每页条数
return $this->header;
public function uploads(){
$files = $this->request->file('file');
if(empty($files)){
return $this->response('没有上传文件',Code::USER_ERROR);
}
$url = './uploads/images/';
$param = $this->request->post();
if($this->request->hasFile('image') && $files->isValid()){
$filename = date('ymdHis').rand(10000,99999).$this->request->file('image');
$this->request->file('image')->move('./uploads/images/',$filename);
}else{
return false;
}
return $url.$filename;
}
}
... ...
... ... @@ -5,8 +5,8 @@ namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Http\Controllers\Controller;
use App\Utils\EncryptUtils;
use \Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Support\Facades\Cache;
... ... @@ -31,22 +31,15 @@ class BaseController extends Controller
$this->request = $request;
$this->param = $this->request->all();
$this->token = $this->request->header('token');
$this->get_param();
$this->auth_token();
}
/**
* @name
* @return void
* @author :liyuhang
* @method
*/
public function auth_token(){
if(!empty($this->token) && !empty(Cache::get($this->token))){
$info = Cache::get($this->token);
if(isset($info) && !empty($info)){
$this->user = $info;
$this->uid = $info['id'];
$this->param['project_id'] = $this->user['project_id'];
}else{
return response(['code'=>Code::USER_ERROR,'msg'=>'当前用户未登录']);
}
$this->get_param();
}
/**
* 成功返回
... ... @@ -68,16 +61,9 @@ class BaseController extends Controller
'data' => $data,
'msg' => $code->description,
];
//加密-返回数据
if (config('app.params_encrypt')) {
$k = config('app.params_encrypt_key');
$i = config('app.params_encrypt_iv');
$response = [
'p' => (new EncryptUtils())->openssl_en($response, $k, $i)];
}
$this->header['token'] = $this->token;
return response()->json($response,200,$this->header);
}
/**
* @name 参数过滤
* @return void
... ... @@ -100,12 +86,12 @@ class BaseController extends Controller
case 'row':
$this->row = $v;
break;
case "create_at":
case "created_at":
$this->_btw[0] = $v;
$this->_btw[1] = date('Y-m-d H:i:s',time());
$this->map['create_at'] = ['between', $this->_btw];
break;
case "update_at":
case "updated_at":
$this->_btw[1] = $v;
$this->map['update_at'] = ['between', $this->_btw];
break;
... ... @@ -120,44 +106,41 @@ class BaseController extends Controller
}
/**
* @name 统一返回参数
* @return void
* @return JsonResponse
* @author :liyuhang
* @method
*/
public function response($msg,$code = 200,$data = [],$result_code = null,$type = 'application/json'){
$result_code === null && $result_code = $code;
public function response($msg = null,string $code = Code::SUCCESS,$data = [],$result_code = 200,$type = 'application/json'): JsonResponse
{
$code = Code::fromValue($code);
$result = [
'msg' =>$msg,
'code'=>$result_code,
'data'=>$data
'msg' => $msg == ' ' ? $code->description : $msg,
'code' => $code->value,
'data' => $data,
];
$this->header['Content-Type'] = $type;
$this->header['token'] = $this->token;
$response = Response::create(json_encode($result),$code,$this->header);
$response = response($result,$result_code,$this->header);;
throw new HttpResponseException($response);
}
/**
* 方法请求输出数据(带分页参数)
* @param $data
* @return
*/
protected function result($lists) {
$data['data'] = $lists;
$data['page'] = $this->setPages();
$this->response('success', 200, $data);
}
/**
* 设置分页返回参数()
* 菜单权限->得到子级数组
* @param int
* @return array
*/
protected function setPages() {
$page_count = $this->allCount > $this->row ? ceil($this->allCount / $this->row) : 1;
$this->header['Total-Count'] = $this->allCount; //总条数
$this->header['Page-Count'] = $page_count; //总页数
$this->header['Current-Page'] = $this->p; //当前页数
$this->header['Per-Page'] = $this->row; //每页条数
return $this->header;
public function _get_child($my_id, $arr)
{
$new_arr = array();
foreach ($arr as $k => $v) {
$v = (array)$v;
if ($v['pid'] == $my_id) {
$v['sub'] = $this->_get_child($v['id'],$arr);
$new_arr[] = $v;
}
}
return $new_arr ? $new_arr : false;
}
/**
... ...
... ... @@ -3,9 +3,12 @@
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\ComLogic;
use App\Models\Project as ProjectModel;
use App\Models\ProjectMenu as ProjectMenuModel;
use App\Models\ProjectRole as ProjectRoleModel;
use App\Models\User as UserModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
... ... @@ -20,27 +23,21 @@ class ComController extends BaseController
* @author :liyuhang
* @method
*/
public function login(){
$rules = [
'mobile'=>'required|string|max:12',
'password'=>'required|string',
];
//验证的提示信息
$message = [
public function login(Request $request){
$request->validate([
'mobile'=>['required,string,max:12'],
'password'=>['required,string'],
],[
'mobile.required'=>'标题必须填写',
'mobile.string'=>'标题中含有非法文字',
'password.required'=>'内容必须填写',
'password.string'=>'内容中含有非法文字',
'mobile.max' => 'account不大于12字符.',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->errors()->first()){
return $this->response($validate->errors()->first(),Code::USER_ERROR,$this->param);
}
$comLogic = new ComLogic();
$res = $comLogic->login($this->param);
]);
$userModel = new UserModel();
$res = $userModel->login($this->param);
if($res === false){
$this->response('请求失败',Code::USER_ERROR,[]);
$this->response('当前用户不存在或者被禁用,登录失败',Code::USER_ERROR,[]);
}
$this->response('请求成功',Code::SUCCESS,$res);
}
... ... @@ -57,7 +54,7 @@ class ComController extends BaseController
$info = $projectRoleModel->read(['id'=>$this->user['role_id']]);
$projectMenuModel = new ProjectMenuModel();
$info['role_menu'] = trim($info['role_menu'],',');
$lists = DB::table($projectMenuModel->getTable())->where(['status'=>0])->whereIn('id',explode(',',$info['role_menu']))->get();
$lists = $projectMenuModel->where(['status'=>0,'is_role'=>0])->whereIn('id',explode(',',$info['role_menu']))->get();
$lists = $lists->toArray();
$menu = array();
foreach ($lists as $k => $v){
... ... @@ -71,30 +68,57 @@ class ComController extends BaseController
}
/**
* 菜单权限->得到子级数组
* @param int
* @return array
* @name :获取当前项目详情
* @return void
* @author :liyuhang
* @method
*/
public function _get_child($my_id, $arr)
{
$new_arr = array();
foreach ($arr as $k => $v) {
$v = (array)$v;
if ($v['pid'] == $my_id) {
$new_arr[$k] = $v;
$new_arr[$k]['son'] = $this->_get_child($v['id'],$arr);
}
public function get_project(){
$projectModel = new ProjectModel();
$info = $projectModel->read(['id'=>$this->user['project_id']]);
if(empty($info)){
$this->response('error',Code::USER_ERROR);
}
return $new_arr ? $new_arr : false;
$this->response('success',Code::SUCCESS,$info);
}
/**
* @name :获取当前项目详情
* @name :登录用户编辑资料/修改密码
* @return void
* @author :liyuhang
* @method
*/
public function get_project(){
public function edit_info(Request $request){
$request->validate([
'password'=>['required,string,min:5'],
'name'=>['required,max:20'],
],[
'password.required'=>'密码必须填写',
'password.string'=>'密码中含有非法文字',
'password.min' => '密码不小于5字符.',
'name.required'=>'名称必须填写',
'name.min' => '名称不小于5字符.',
]);
$userModel = new UserModel();
$this->param['id'] = $this->uid;
$rs = $userModel->edits($this->param);
if($rs === false){
$this->response('参数错误或其他服务器原因,编辑失败',Code::USER_ERROR);
}
$this->response('编辑成功');
}
/**
* @name :退出登录
* @return void
* @author :liyuhang
* @method :post
*/
public function logout(){
$rs = Cache::pull($this->token);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success');
}
}
... ...
<?php
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
class MenuController extends BaseController
{
public function lists(){
//TODO::搜索参数处理
$userLogic = new UserLogic();
$lists = $userLogic->lists($this->map,$this->p,$this->row,$this->order,['id','name','mobile']);
if(empty($lists)){
$this->response('请求失败',Code::USER_ERROR,[]);
}
$this->result($lists);
}
}
<?php
namespace App\Http\Controllers\Bside\Product;
use App\Helper\Arr;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\AttrLogic;
use App\Http\Requests\Bside\product\AttrRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class AttrController
* @package App\Http\Controllers\Bside
* @author zbj
* @date 2023/4/15
*/
class AttrController extends BaseController
{
public function index(AttrLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'title', 'remark', 'value_num']);
return $this->success($data);
}
public function info(Request $request, AttrLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'title', 'remark', 'values']));
}
public function save(AttrRequest $request, AttrLogic $logic)
{
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, AttrLogic $logic)
{
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
}
... ...
<?php
namespace App\Http\Controllers\Bside\Product;
use App\Helper\Arr;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\CategoryLogic;
use App\Http\Requests\Bside\product\CategoryRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class CategoryController
* @package App\Http\Controllers\Bside
* @author zbj
* @date 2023/4/12
*/
class CategoryController extends BaseController
{
public function index(CategoryLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status','created_at'],0);
return $this->success(Arr::listToTree($data));
}
public function info(Request $request, CategoryLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status']));
}
public function save(CategoryRequest $request, CategoryLogic $logic)
{
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, CategoryLogic $logic)
{
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
//todo Ai生成 关键词和描述
}
... ...
<?php
namespace App\Http\Controllers\Bside\Product;
use App\Helper\Arr;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\DescribeLogic;
use App\Http\Requests\Bside\product\DescribeRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class DescribeController
* @package App\Http\Controllers\Bside
* @author zbj
* @date 2023/4/15
*/
class DescribeController extends BaseController
{
public function index(DescribeLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'title', 'describe', 'status', 'created_at']);
return $this->success($data);
}
public function info(Request $request, DescribeLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'title', 'describe', 'created_at']));
}
public function save(DescribeRequest $request, DescribeLogic $logic)
{
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, DescribeLogic $logic)
{
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
}
... ...
<?php
namespace App\Http\Controllers\Bside\Product;
use App\Helper\Arr;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\KeywordLogic;
use App\Http\Requests\Bside\product\KeywordRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class KeywordController
* @package App\Http\Controllers\Bside
* @author zbj
* @date 2023/4/15
*/
class KeywordController extends BaseController
{
public function index(KeywordLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'title', 'route', 'status', 'created_at']);
return $this->success($data);
}
public function info(Request $request, KeywordLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'title', 'route', 'created_at']));
}
public function save(KeywordRequest $request, KeywordLogic $logic)
{
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, KeywordLogic $logic)
{
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
}
... ...
<?php
namespace App\Http\Controllers\Bside\Product;
use App\Helper\Arr;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\ProductLogic;
use App\Http\Requests\Bside\product\ProductRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class ProductController
* @package App\Http\Controllers\Bside
* @author zbj
* @date 2023/4/12
*/
class ProductController extends BaseController
{
public function index(ProductLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status','created_at'],0);
return $this->success(Arr::listToTree($data));
}
public function info(Request $request, ProductLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status']));
}
public function save(ProductRequest $request, ProductLogic $logic)
{
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, ProductLogic $logic)
{
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
//todo Ai生成 关键词和描述
}
... ...
<?php
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Models\Product as ProductModel;
use App\Models\ProductClassify as ProductClassifyModel;
use Illuminate\Support\Facades\Validator;
/**
* @name:产品分类
*/
class ProductClassifyController extends BaseController
{
/**
* @name : 获取当前登录的产品分裂
* @return void
* @author :liyuhang
* @method
*/
public function lists(){
//TODO::获取当前登录用户
$this->map['project_id'] = $this->user['project_id'];
$productClassifyModel = new ProductClassifyModel();
$lists = $productClassifyModel->lists($this->map,$this->p,$this->row,$this->order);
$this->result($lists);
}
/**
* @name :添加产品分类
* @return void
* @author :liyuhang
* @method
*/
public function add(){
//参数验证
$rules = [
'name'=>'required|max:11',
'image'=>'required',
'keywords'=>'required|max:50',
'describe'=>'required',
];
//验证的提示信息
$message = [
'name.required'=>'名称必须填写',
'name.max' => '名称不大于16字符.',
'image.required'=>'路由必须填写',
'keywords.required'=>'关键字必须填写',
'keywords.max'=>'关键字最大50个字符',
'describe.required'=>'路由必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
//TODO::关联项目
$this->param['project_id'] = $this->user['project_id'];
$productClassifyModel = new ProductClassifyModel();
$this->param['image'] = $this->uploads();
$rs = $productClassifyModel->add($this->param);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success',Code::SUCCESS);
}
/**
* @name :编辑产品分类
* @return void
* @author :liyuhang
* @method
*/
public function edit(){
//参数验证
$rules = [
'id'=>'required',
'name'=>'required|max:11',
'describe'=>'required',
];
//验证的提示信息
$message = [
'id.required'=>'主键必须填写',
'name.required'=>'名称必须填写',
'name.max' => '名称不大于16字符.',
'describe.required'=>'路由必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
if(isset($this->param['image'])){
//TODO::删除上一次的图片
$this->param['image'] = $this->uploads();
}
$productClassifyModel = new ProductClassifyModel();
$rs = $productClassifyModel->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success',Code::SUCCESS);
}
/**
* @name :编辑当前类
* @return void
* @author :liyuhang
* @method
*/
public function status(){
//参数验证
$rules = [
'id'=>'required',
'status'=>'required',
];
//验证的提示信息
$message = [
'id.required'=>'主键必须填写',
'status.required'=>'状态必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
$productClassifyModel = new ProductClassifyModel();
$rs = $productClassifyModel->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success',Code::SUCCESS);
}
/**
* @name :删除产品分类
* @return void
* @author :liyuhang
* @method
*/
public function del(){
//参数验证
$rules = [
'id'=>'required',
];
//验证的提示信息
$message = [
'id.required'=>'主键必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
$productClassifyModel = new ProductClassifyModel();
//TODO::判断当前产品无下级
$info = $productClassifyModel->read(['pid'=>$this->param['id']],['id']);
if(empty($info)){
$this->response('当前分类不允许删除',Code::USER_ERROR);
}
//TODO::判断当前分类是否关联商品
$productModel = new ProductModel();
$classify_info = $productModel->read(['classify_id'=>$this->param['id']]);
if(empty($classify_info)){
$this->response('当前分类不允许删除',Code::USER_ERROR);
}
$rs = $productClassifyModel->del(['id'=>$this->param['id']]);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success',Code::SUCCESS);
}
}
... ... @@ -23,7 +23,8 @@ class ProductController extends BaseController
$this->map['project_id'] = $this->user['project_id'];
$productModel = new ProductModel();
$lists = $productModel->lists($this->map,$this->p,$this->row,$this->order);
$this->result($lists);
$this->allCount = $productModel->allCount;
$this->response('success',Code::SUCCESS, $lists);
}
/**
... ...
<?php
namespace App\Http\Controllers\Bside;
use App\Models\Project as ProjectModel;
use Illuminate\Support\Facades\DB;
/**
* @name:user用户获取相关项目
*/
class ProjectController extends BaseController
{
/**
* @name :根据登录用户获取所有项目
* @return void
* @author :liyuhang
* @method
*/
public function page_lists(){
$projectModel = new ProjectModel();
$lists = DB::table($projectModel->table)->select(['*'])->where($this->map)->forPage($this->p,$this->row)->orderBy($this->order)->get();
}
}
... ... @@ -2,38 +2,57 @@
namespace App\Http\Controllers\Bside;
class ManagerController extends BaseController
use App\Http\Logic\Bside\ProjectGroupLogic;
use App\Http\Requests\Bside\ProjectGroupRequest;
/**
* @name:用户组相关
*/
class ProjectGroupController extends BaseController
{
/**
* @name :管理员列表
* @return void
* @name :用户组列表
* @return json
* @author :liyuhang
* @method
*/
public function lists(){
public function lists()
{
}
/**
* @name:新增
* @param ProjectGroupRequest $request
* @param ProjectGroupLogic $logic
* @name : 添加用户组
* @return void
* @author :liyuhang
* @method
*/
public function add(){
public function add(ProjectGroupRequest $request){
$request->validated();
$this->response('success');
}
/**
* @name :编辑管理员
* @param ProjectGroupRequest $request
* @param ProjectGroupLogic $logic
* @name :编辑用户组
* @return void
* @author :liyuhang
* @method
*/
public function edit(){
public function edit(ProjectGroupRequest $request){
$request->validated();
$this->response('success');
}
/**
* @name :删除用户组
* @return void
* @author :liyuhang
* @method
*/
public function del(){
}
... ...
<?php
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Models\ProjectMenu as ProjectMenuModel;
use App\Models\ProjectRole as ProjectRoleModel;
use Illuminate\Support\Facades\Validator;
class ProjectMenuController extends BaseController
{
/**
* @name :用户组菜单列表(带分页)
* @return void
* @author :liyuhang
* @method
*/
public function lists(){
//根据角色获取菜单列表
$projectMenuModel = new ProjectMenuModel();
$lists = $projectMenuModel->lists($this->param,$this->p,$this->row,$this->order);
$this->result($lists);
}
/**
* @name :添加用户组菜单
* @return void
* @author :liyuhang
* @method
*/
public function add(){
//参数验证
$rules = [
'name'=>'required|max:11',
'rules'=>'required',
];
//验证的提示信息
$message = [
'name.required'=>'名称必须填写',
'name.max' => '名称不大于16字符.',
'rules.required'=>'路由必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
$projectMenuModel = new ProjectMenuModel();
$rs = $projectMenuModel->add($this->param);
if($rs === false){
$this->response('请求失败',Code::USER_ERROR,[]);
}
$this->response('success',Code::SUCCESS);
}
/**
* @name :编辑用户组菜单
* @return void
* @author :liyuhang
* @method
*/
public function edit(){
//参数验证
$rules = [
'id'=>'required',
'name'=>'required|max:11',
'rules'=>'required',
];
//验证的提示信息
$message = [
'id.required'=>'服务器id错误',
'name.required'=>'名称必须填写',
'name.max' => '名称不大于16字符.',
'rules.required'=>'路由必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
$projectMenuModel = new ProjectMenuModel();
$rs = $projectMenuModel->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->response('请求失败',Code::USER_ERROR);
}
$this->response('success',Code::SUCCESS);
}
/**
* @name :编辑状态
* @return void
* @author :liyuhang
* @method
*/
public function status(){
//参数验证
$rules = [
'id'=>'required',
'status'=>'required',
];
//验证的提示信息
$message = [
'id.required'=>'主键必须填写',
'status.required'=>'状态必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
$projectMenuModel = new ProjectMenuModel();
$rs = $projectMenuModel->edit(['status'=>$this->param['status']],['id'=>$this->param['id']]);
if($rs === false){
$this->response('编辑失败',Code::USER_PARAMS_ERROE);
}
$this->response($this->param['status'] == 0 ? '启用成功' : '禁用成功',Code::SUCCESS);
}
}
... ... @@ -3,7 +3,11 @@
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Http\Requests\Bside\ProjectRoleRequest;
use App\Models\ProjectMenu as ProjectMenuModel;
use App\Models\ProjectRole as ProjectRoleModel;
use App\Models\User as UserModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class ProjectRoleController extends BaseController
... ... @@ -17,43 +21,50 @@ class ProjectRoleController extends BaseController
public function lists(){
//TODO::根据当前登录用户返回
$projectRoleModel = new ProjectRoleModel();
$lists = $projectRoleModel->lists($this->param,$this->p,$this->row,$this->order);
$this->result($lists);
$this->map['status'] = 0;
$this->map['project_id'] = $this->user['project_id'];
//获取当前登录用户自己的菜单栏
$lists = $projectRoleModel->lists($this->map,$this->p,$this->row,$this->order);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :添加角色
* @name :添加/编辑角色时获取菜单列表
* @return void
* @author :liyuhang
* @method
*/
public function add(){
//TODO::获取当前用户的所在项目组
//参数验证
$rules = [
'name'=>'required|max:11',
'role_menu'=>'required|string',
];
//验证的提示信息
$message = [
'name.required'=>'名称必须填写',
'name.max' => '号码不大于11字符.',
'role_menu.required'=>'密码必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
public function get_role_menu(){
//根据当前登录用户角色返回用户菜单列表
$projectRoleModel = new ProjectRoleModel();
$info = $projectRoleModel->read(['id'=>$this->user['role_id']]);
$projectMenuModel = new ProjectMenuModel();
$info['role_menu'] = trim($info['role_menu'],',');
$lists = $projectMenuModel->where(['status'=>0])->whereIn('id',explode(',',$info['role_menu']))->get();
$lists = $lists->toArray();
$menu = array();
foreach ($lists as $k => $v){
$v = (array)$v;
if ($v['pid'] == 0) {
$v['sub'] = $this->_get_child($v['id'], $lists);
$menu[] = $v;
}
}
$this->response('当前用户菜单列表',Code::SUCCESS,$menu);
}
/**
* @name :添加角色
* @return void
* @author :liyuhang
* @method
*/
public function add(ProjectRoleRequest $request){
$request->validated();
$this->param['project_id'] = $this->user['project_id'];
//获取当前项目下的角色超级管理员
$projectRoleModel = new ProjectRoleModel();
//验证当前角色是否存在
if(!isset($this->param['pid'])){
$data['pid'] = 0;
}
$data = [
'name' => $this->param['name'],
'pid' => $this->param['pid'],
];
$info = $projectRoleModel->read($data);
$info = $projectRoleModel->read(['name'=>$this->param['name']]);
if(!empty($info)){
$this->response('当前添加的角色已存在',Code::USER_PARAMS_ERROE);
}
... ... @@ -61,7 +72,7 @@ class ProjectRoleController extends BaseController
if($rs === false){
$this->response('添加失败',Code::USER_PARAMS_ERROE);
}
$this->response('添加成功',Code::SUCCESS);
$this->response('添加成功');
}
/**
... ... @@ -70,34 +81,16 @@ class ProjectRoleController extends BaseController
* @author :liyuhang
* @method
*/
public function edit(){
//TODO::根据当前登录用户返回
//参数验证
$rules = [
'id'=>'required',
'name'=>'required|max:11',
];
//验证的提示信息
$message = [
'id.required'=>'主键必须填写',
'name.required'=>'名称必须填写',
'name.max' => '号码不大于11字符.',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
//验证当前角色是否存在
if(!isset($this->param['pid'])){
$data['pid'] = 0;
}
$data = [
//TODO::自动写入当前用户
'name' => $this->param['name'],
'pid' => $this->param['pid'],
];
public function edit(ProjectRoleRequest $request){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$projectRoleModel = new ProjectRoleModel();
$info = $projectRoleModel->read($data);
//TODO::查询当前名称是否重复
$info = $projectRoleModel->where('id','<>',$this->param['id'])
->where(['name'=>$this->param['name'],'project_id'=>$this->user['project_id']])->first();
if(!empty($info)){
$this->response('当前添加的角色已存在',Code::USER_PARAMS_ERROE);
}
... ... @@ -114,21 +107,14 @@ class ProjectRoleController extends BaseController
* @author :liyuhang
* @method
*/
public function status(){
//参数验证
$rules = [
'id'=>'required',
'status'=>'required',
];
//验证的提示信息
$message = [
'id.required'=>'主键必须填写',
'status.required'=>'状态必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
public function status(Request $request){
$request->validate([
'id'=>['required'],
'status'=>['required'],
],[
'id.required' => 'ID不能为空',
'status.required' => 'status不能为空'
]);
$projectRoleModel = new ProjectRoleModel();
$rs = $projectRoleModel->edit(['status'=>$this->param['status']],['id'=>$this->param['id']]);
if($rs === false){
... ... @@ -136,4 +122,30 @@ class ProjectRoleController extends BaseController
}
$this->response($this->param['status'] == 0 ? '启用成功' : '禁用成功',Code::SUCCESS);
}
/**
* @name :删除角色
* @return void
* @author :liyuhang
* @method
*/
public function del(Request $request){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$projectRoleModel = new ProjectRoleModel();
//查询当前角色下是否有用户
$userModel = new UserModel();
$user_info = $userModel->read(['role_id'=>$this->param['id']]);
if(!empty($user_info)){
$this->response('当前角色下有用户存在,不允许删除',Code::USER_ERROR);
}
$rs = $projectRoleModel->del(['id'=>$this->param['id']]);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success');
}
}
... ...
... ... @@ -3,11 +3,10 @@
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\UserLogic;
use App\Http\Requests\Bside\UserRequest;
use App\Models\User as UserModel;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Validator;
use Symfony\Component\HttpFoundation;
use App\Rules\Ids;
use Illuminate\Http\Request;
class UserController extends BaseController
{
... ... @@ -19,13 +18,13 @@ class UserController extends BaseController
*/
public function lists(){
//TODO::搜索参数处理
$userLogic = new UserLogic();
$lists = $userLogic->lists($this->map,$this->p,$this->row,$this->order,['id','name','mobile']);
$userModel = new UserModel();
$this->map['project_id'] = $this->user['project_id'];
$lists = $userModel->lists($this->map,$this->p,$this->row,$this->order,['id','name','mobile','created_at']);
if(empty($lists)){
$this->response('请求失败',Code::USER_ERROR,[]);
}
return response()->json($lists);
$this->result($lists);
$this->response('列表',Code::SUCCESS,$lists);
}
/**
... ... @@ -34,29 +33,11 @@ class UserController extends BaseController
* @author :liyuhang
* @method
*/
public function add(){
$rules = [
'mobile'=>'required|string|max:11',
'password'=>'required|string|min:5',
'name'=>'required|max:20',
];
//验证的提示信息
$message = [
'mobile.required'=>'号码必须填写',
'mobile.string'=>'号码中含有非法文字',
'mobile.max' => '号码不大于11字符.',
'password.required'=>'密码必须填写',
'password.string'=>'密码中含有非法文字',
'password.min' => '密码不小于5字符.',
'name.required'=>'名称必须填写',
'name.min' => '名称不小于5字符.',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_LOGIN_ERROE,$this->param);
}
$userLogic = new UserLogic();
$rs = $userLogic->add($this->param);
public function add(UserRequest $request){
$request->validated();
$userModel = new UserModel();
$this->param['project_id'] = $this->user['project_id'];
$rs = $userModel->adds($this->param);
if($rs === false){
$this->response('当前添加用户已存在或参数错误,添加失败',Code::USER_REGISTER_ERROE,[]);
}
... ... @@ -69,31 +50,19 @@ class UserController extends BaseController
* @author :liyuhang
* @method
*/
public function edit(){
$rules = [
'id'=>'required',
'mobile'=>'required|string|max:11',
'password'=>'required|string|min:5',
'name'=>'required|max:20',
];
//验证的提示信息
$message = [
'id.required'=>'主键不能为空',
'mobile.required'=>'号码必须填写',
'mobile.string'=>'号码中含有非法文字',
'mobile.max' => '号码不大于11字符.',
'password.required'=>'密码必须填写',
'password.string'=>'密码中含有非法文字',
'password.min' => '密码不小于5字符.',
'name.required'=>'名称必须填写',
'name.min' => '名称不小于5字符.',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
public function edit(UserRequest $request){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$userModel = new UserModel();
$info = $userModel->where('id','<>',$this->param['id'])
->where(['mobile'=>$this->param['mobile']])->first();
if(!empty($info)){
$this->response('当前编辑的手机号码已存在',Code::USER_PARAMS_ERROE);
}
$userLogic = new UserLogic();
$rs = $userLogic->edits($this->param);
$rs = $userModel->edits($this->param);
if($rs === false){
$this->response('参数错误或其他服务器原因,编辑失败',Code::USER_ERROR,[]);
}
... ... @@ -106,27 +75,20 @@ class UserController extends BaseController
* @author :liyuhang
* @method
*/
public function status(){
//参数验证
$rules = [
'id'=>'required',
'status'=>'required',
];
//验证的提示信息
$message = [
'id.required'=>'主键必须填写',
'status.required'=>'状态必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
public function status(Request $request){
$request->validate([
'id'=>['required'],
'status'=>['required'],
],[
'id.required' => 'ID不能为空',
'status.required' => 'status不能为空'
]);
$userLogic = new UserModel();
$rs = $userLogic->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response($this->param['status'] == 0 ? '启用成功' : '禁用成功',Code::SUCCESS);
$this->response($this->param['status'] == 0 ? '启用成功' : '禁用成功');
}
/**
* @name :删除管理员
... ... @@ -134,18 +96,12 @@ class UserController extends BaseController
* @author :liyuhang
* @method
*/
public function del(){
$rules = [
'id'=>'required',
];
//验证的提示信息
$message = [
'id.required'=>'主键不能为空',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
public function del(Request $request){
$request->validate([
'id'=>['required', new Ids()],
],[
'id.required' => 'ID不能为空',
]);
$userModel = new UserModel();
$rs = $userModel->del($this->param);
if($rs === false){
... ...
... ... @@ -2,6 +2,7 @@
namespace App\Http;
use App\Http\Middleware\AccessToken;
use App\Http\Middleware\Aside\BlackListMiddleware as AsideBlackListMiddleware;
use App\Http\Middleware\Aside\ParamMiddleware as AsideParamMiddleware;
use App\Http\Middleware\Bside\BlackListMiddleware as BsideBlackListMiddleware;
... ... @@ -91,6 +92,7 @@ class Kernel extends HttpKernel
//A端登录验证中间件
'aloginauth'=>AsideLoginAuthMiddleware::class,
//B端登录验证中间件
'bloginauth'=>BsideLoginAuthMiddleware::class
'bloginauth'=>BsideLoginAuthMiddleware::class,
'accesstoken'=>AccessToken::class,
];
}
... ...
... ... @@ -4,13 +4,20 @@ namespace App\Http\Logic\Bside;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use App\Helper\Arr;
use Illuminate\Support\Facades\Cache;
/**
* @notes: 逻辑层基类 控制器调用 统一返回 统一抛出异常
*/
class BaseLogic
{
protected $model;
protected $requestAll;
protected $is_cache = true; //是否缓存数据
public function __construct()
{
$this->requestAll = request()->all();
... ... @@ -21,7 +28,7 @@ class BaseLogic
* @param array $data
* @return array
*/
public function success(array $data): array
public function success(array $data = [])
{
return $data;
}
... ... @@ -32,9 +39,259 @@ class BaseLogic
* @param string $message
* @throws BsideGlobalException
*/
public function fail(string $code = Code::SYSTEM_ERROR, $message = "")
public function fail(string $message = "", string $code = Code::SYSTEM_ERROR)
{
throw new BsideGlobalException($code, $message);
}
/**
* 列表
* @param array $map
* @param array $sort
* @param array $columns
* @param int $limit
* @return array
* @author zbj
* @date 2023/4/13
*/
public function getList(array $map = [], array $sort = ['id' => 'desc'], array $columns = ['*'], int $limit = 20)
{
// 闭包查询条件格式化
$query = $this->formatQuery($map);
// 排序(支持多重排序)
$query = $query->when($sort, function ($query, $sort) {
foreach ($sort as $k=>$v) {
$query->orderBy($k, $v);
}
});
// 数据分页设置
if ($limit) {
$result = $query->select($columns)->paginate($limit);
}else{
$result = $query->select($columns)->get();
}
return $this->success($result ? $result->toArray() : []);
}
/**
* 详情
* @param $id
* @return array
* @author zbj
* @date 2023/4/13
*/
public function getInfo($id)
{
$info = $this->getCacheInfo($id);
if(!$info){
$this->fail('数据不存在或者已经删除');
}
return $this->success($info->toArray());
}
/**
* @param $id
* @return mixed
* @author zbj
* @date 2023/4/15
*/
public function getCacheInfo($id){
if($this->is_cache){
$info = Cache::get($this->getInfoCacheKey($id));
if (!$info) {
$info = $this->model->find($id);
if($info){
Cache::put($this->getInfoCacheKey($id), $info);
}
}
}else{
$info = $this->model->find($id);
}
return $info;
}
/**
* 保存
* @param $param
* @return array
* @throws BsideGlobalException
* @author zbj
* @date 2023/4/13
*/
public function save($param){
if(!empty($param['id'])){
$this->model = $this->getCacheInfo($param['id']);
if(!$this->model){
$this->fail('数据不存在或者已经删除');
}
}
foreach ($param as $name => $value){
$this->model[$name] = $value;
}
$res = $this->model->save();
if($res){
//清缓存
if($this->is_cache && !empty($param['id'])){
Cache::forget($this->getInfoCacheKey($param['id']));
}
return $this->success(['id' => $this->model->id]); //返回保存的数据id
}else{
$this->fail('保存失败');
}
}
/**
* 批量删除
* @param $ids
* @return array
* @throws BsideGlobalException
* @author zbj
* @date 2023/4/13
*/
public function delete($ids){
$ids = array_filter(Arr::splitFilterToArray($ids), 'intval');
if(!$ids){
$this->fail('ID不能为空');
}
$map[] = ['id', 'in', $ids];
$res = $this->formatQuery($map)->delete();
if($res){
if($this->is_cache){
foreach ($ids as $id){
Cache::forget($this->getInfoCacheKey($id));
}
}
return $this->success();
}else{
$this->fail('删除失败');
}
}
/**
* @param $id
* @return string
* @author zbj
* @date 2023/4/13
*/
public function getInfoCacheKey($id){
return $this->model->getTable() . '_info_' . $id;
}
/**
* 格式化查询条件
* @param $map
* @param $query
* @return mixed
* @author zbj
* @date 2023/4/13
*/
public function formatQuery($map, $query = '')
{
$model = $query ?: $this->model;
$query = $model->where(function ($query) use ($map) {
foreach ($map as $v) {
if ($v instanceof \Closure) {
$query = $query->where($v);
continue;
}
// 判断是否是键值对类型
if (key($v) !== 0) {
$key = key($v);
$val = $v[$key];
$v = [$key, is_array($val) ? 'in' : '=', $val];
}
switch ($v[1]) {
case 'like':
// like查询 ['name|title', 'like', '%a%']
if (strpos($v[0], '|') !== false) {
$query->where(function ($query) use ($v) {
$item = explode('|', $v[0]);
foreach ($item as $vo) {
$query->orWhere($vo, $v[1], $v[2]);
}
});
} else {
$query->where($v[0], $v[1], $v[2]);
}
break;
case 'in':
// in查询 ['id', 'in', [1,2,3]]
if (!is_array($v[2])) {
$v[2] = explode(',', $v[2]);
}
$query->whereIn($v[0], $v[2]);
break;
case 'not in':
// not in查询 ['id', 'not in', [1,2,3]]
if (!is_array($v[2])) {
$v[2] = explode(',', $v[2]);
}
$query->whereNotIn($v[0], $v[2]);
break;
case 'between':
// between查询 ['created_at', 'between', ['xxx', 'xxx]]
if (!is_array($v[2])) {
$v[2] = explode(',', $v[2]);
}
$query->whereBetween($v[0], $v[2]);
break;
case 'not between':
// not between查询 ['created_at', 'not between', ['xxx', 'xxx]]
if (!is_array($v[2])) {
$v[2] = explode(',', $v[2]);
}
$query->whereNotBetween($v[0], $v[2]);
break;
case 'null':
// null查询 ['deleted_at', 'null']
$query->whereNull($v[0]);
break;
case "not null":
// not null查询 ['deleted_at', 'not null']
$query->whereNotNull($v[0]);
break;
case "or":
// or查询 [[['status'=>1],['status'=>2]], 'or'];
//格式:or (status=1 and status=2)
$where = $v[0];
$query->orWhere(function ($query) use ($where) {
// 递归解析查询条件
$this->formatQuery($where, $query);
});
break;
case 'xor':
// xor查询 [[['status'=>1],['status'=>2]], 'xor'];
// 格式:and (status=1 or status=2)
$where = $v[0];
$query->where(function ($query) use ($where) {
foreach ($where as $w) {
$query->orWhere(function ($query) use ($w) {
// 递归解析查询条件
$this->formatQuery([$w], $query);
});
}
});
break;
default:
// 常规查询
if (count($v) == 2) {
$query->where($v[0], '=', $v[1]);
} else {
$query->where($v[0], $v[1], $v[2]);
}
break;
}
}
});
return $query;
}
}
... ...
<?php
namespace App\Http\Logic\Bside;
use App\Models\User as UserModel;
use Illuminate\Support\Facades\Cache;
class ComLogic extends BaseLogic
{
/***
* @name :登录
* @return void
* @author :liyuhang
* @method
*/
public function login($param){
#TODO 查询mobile, 验证密码 true->return; false-> 查询sms发送记录 验证code
$userModel = new UserModel();
if($param['login_method'] == 1){
//密码加密
$param['password'] = base64_encode(md5($param['password']));
$info = $userModel->read(['mobile'=>$param['mobile'],'password'=>$param['password']], ['id','mobile','role_id','project_id','name']);
}else{
//TODO::验证验证码是否正确
$info = $userModel->read(['mobile'=>$param['mobile']],['id','mobile','role_id','project_id','name']);
}
if(empty($info)){
return false;
}
//验证码登录
if(isset($info['token']) && !empty($info['token'])){
//清除上一次用户缓存
Cache::pull($info['token']);
}
//生成新token
$token = md5(uniqid().$info['id']);
//存储缓存
Cache::add($token,$info);
//更新数据库
$data = $info;
$rs = $userModel->edit(['token'=>$token],['id'=>$info['id']]);
if($rs === false){
return false;
}
return $data;
}
}
<?php
namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Attr;
use App\Models\Product\AttrValue;
use Illuminate\Support\Facades\DB;
/**
* Class AttrLogic
* @package App\Http\Logic\Bside\Product
* @author zbj
* @date 2023/4/15
*/
class AttrLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Attr();
}
public function getInfo($id){
$info = parent::getCacheInfo($id);
$info->values;
return $this->success($info->toArray());
}
public function save($param){
$param['values'] = array_unique($param['values']);
DB::beginTransaction();
try {
//删除之前的参数值
if(!empty($param['id'])){
AttrValue::where('attr_id', $param['id'])->delete();
}
//保存参数名称
$data = $param;
unset($data['values']);
$data['value_num'] = count($param['values']);
$res = parent::save($data);
$attr_id = $res['id'];
//保存参数值
$values = [];
foreach ($param['values'] as $value){
$values[] = [
'attr_id' => $attr_id,
'value' => $value
];
}
AttrValue::insert($values);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('保存失败');
}
return $this->success();
}
public function delete($ids){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//todo 是否有关联商品
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Category;
/**
* Class CategoryLogic
* @package App\Http\Logic\Bside\Product
* @author zbj
* @date 2023/4/14
*/
class CategoryLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Category();
}
public function save($param){
if(!empty($param['pid'])){
if(!empty($param['id']) && $param['pid'] == $param['id']){
$this->fail('上级分类不能是本分类');
}
$p_cate = Category::find($param['pid']);
if(!$p_cate){
$this->fail('上级分类不存在');
}
}
return parent::save($param);
}
public function delete($ids){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//是否有子分类
if(Category::where('pid', $id)->count()){
$this->fail("分类{$info['title']}存在子分类,不能删除");
}
//todo 是否有对应商品
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Describe;
/**
* Class DescribeLogic
* @package App\Http\Logic\Bside\Product
* @author zbj
* @date 2023/4/15
*/
class DescribeLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Describe();
}
public function delete($ids){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//todo 是否有关联商品
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\RouteMap;
use App\Models\Product\Keyword;
use Illuminate\Support\Facades\DB;
/**
* Class KeywordLogic
* @package App\Http\Logic\Bside\Product
* @author zbj
* @date 2023/4/15
*/
class KeywordLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Keyword();
}
public function save($param){
DB::beginTransaction();
try {
$res = parent::save($param);
//路由映射
RouteMap::setRoute($param['title'], RouteMap::SOURCE_PRODUCT_KEYWORD, $res['id'], $param['project_id'], true);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('保存失败');
}
return $this->success();
}
public function delete($ids){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//todo 是否有关联商品
//todo 删除路由映射 事务
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Product;
/**
* Class ProductLogic
* @package App\Http\Logic\Bside\Product
* @author zbj
* @date 2023/4/14
*/
class ProductLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Product();
}
public function save($param){
if(!empty($param['pid'])){
if(!empty($param['id']) && $param['pid'] == $param['id']){
$this->fail('上级分类不能是本分类');
}
$p_cate = Product::find($param['pid']);
if(!$p_cate){
$this->fail('上级分类不存在');
}
}
return parent::save($param);
}
public function delete($ids){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//是否有子分类
if(Product::where('pid', $id)->count()){
$this->fail("分类{$info['title']}存在子分类,不能删除");
}
//todo 是否有对应商品
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Logic\Bside;
use App\Enums\Common\Code;
use App\Models\User as UserModel;
class UserLogic extends BaseLogic
{
//获取用户列表
public function lists($map, $p, $row,$order, $fields = ['*']){
$userModel = new UserModel();
$lists = $userModel->lists($map, $p, $row,$order,$fields);
if(empty($lists)){
return [];
}
return $lists;
}
//新增用户
public function add($param){
$userModel = new UserModel();
//验证当前用户是否存在
$info = $userModel->read(['mobile'=>$param['mobile']]);
if(!empty($info)){
return false;
}
//密码加密
$param['password'] = base64_encode(md5($param['password']));
$rs = $userModel->add($param);
if($rs === false){
return false;
}
return true;
}
/**
* @param $param
* @name :编辑管理员
* @return bool
* @author :liyuhang
* @method
*/
public function edits($param){
$userModel = new UserModel();
//验证当前用户是否存在
$info = $userModel->read(['mobile'=>$param['mobile']]);
if(!empty($info)){
return false;
}
//密码加密
$param['password'] = base64_encode(md5($param['password']));
$rs = $userModel->edit($param,['id'=>$param['id']]);
if($rs === false){
return false;
}
return true;
}
}
<?php
namespace App\Http\Middleware;
use App\Enums\Common\Code;
use App\Models\ProjectMenu;
use App\Models\ProjectRole as ProjectRoleModel;
class AccessToken
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
session_start();
// 指定允许其他域名访问
$http_origin = "*";
if(isset($_SERVER['HTTP_ORIGIN'])){
$http_origin = $_SERVER['HTTP_ORIGIN'];
}
header("Access-Control-Allow-Origin:".$http_origin);
header('Access-Control-Allow-Methods:POST,GET'); //支持的http 动作
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept, Authorization, token'); //响应头 请按照自己需求添加。
if (strtolower($_SERVER['REQUEST_METHOD']) == 'options') {
exit;
}
return $next($request);
}
}
... ...
... ... @@ -2,9 +2,14 @@
namespace App\Http\Middleware\Bside;
use App\Enums\Common\Code;
use App\Models\ProjectMenu;
use App\Models\ProjectRole as ProjectRoleModel;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Cache;
use Illuminate\Http\Exceptions\HttpResponseException;
class LoginAuthMiddleware
{
/**
... ... @@ -16,6 +21,28 @@ class LoginAuthMiddleware
*/
public function handle(Request $request, Closure $next)
{
$token = $request->header('token');
if(!isset($token) || empty($token)){
return response(['code'=>Code::USER_ERROR,'msg'=>'当前用户未登录']);
}
$info = Cache::get($token);
if(empty($info)){
return response(['code'=>Code::USER_ERROR,'msg'=>'当前用户未登录']);
}
//操作权限设置
$projectRoleModel = new ProjectRoleModel();
$role_info = $projectRoleModel->read(['id'=>$info['role_id']]);
//获取当前操作的控制器与方法
$action = $request->route()->getAction();
//查询当前用户是否拥有权限操作
$projectMenuModel = new ProjectMenu();
$menu_id = $projectMenuModel->read(['action'=>$action['as']],['id']);
if($menu_id !== false){
if(strpos($role_info['role_menu'], $menu_id['id']) < 0){
return response(['code'=>Code::USER_ERROR,'msg'=>'当前用户没有权限']);
}
}
return $next($request);
}
}
... ...
<?php
namespace App\Http\Requests\Bside;
use Illuminate\Foundation\Http\FormRequest;
class ProjectGroupRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required|max:255',
];
}
public function messages()
{
return [
'name.required' => '请输入文章标题',
// 'body.required' => '请输入文章内容',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside;
use Illuminate\Foundation\Http\FormRequest;
class ProjectRoleRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
public function rules()
{
return [
'name'=>'required|max:11',
'role_menu'=>'required|string',
];
}
public function messages()
{
return [
'name.required'=>'名称必须填写',
'name.max' => '名称不大于11字符.',
'role_menu.required'=>'角色列表必须填写',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside;
use Illuminate\Foundation\Http\FormRequest;
class UserRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'mobile'=>'required|string|max:11',
'password'=>'required|string|min:5',
'name'=>'required|max:20',
'role_id'=>'required'
];
}
public function messages()
{
return [
'mobile.required'=>'号码必须填写',
'mobile.string'=>'号码中含有非法文字',
'mobile.max' => '号码不大于11字符.',
'password.required'=>'密码必须填写',
'password.string'=>'密码中含有非法文字',
'password.min' => '密码不小于5字符.',
'name.required'=>'名称必须填写',
'name.min' => '名称不小于5字符.',
'role_id.required'=>'角色必须填写',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\product;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class AttrRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/15
*/
class AttrRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|max:30',
'remark' => 'max:200',
'values' => 'required|array'
];
}
public function messages()
{
return [
'title.required' => '请输入参数名称',
'title.max' => '参数名称不能超过30个字符',
'remark.max' => '备注不能超过200个字符',
'values.required' => '请添加参数值',
'values.array' => '参数值格式异常',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\product;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class CategoryRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/12
*/
class CategoryRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title'=>'required|max:20',
'image'=>'required',
'keywords'=>'required|max:50',
'describe'=>'required|max:200',
];
}
public function messages()
{
return [
'title.required' => '请输入分类名称',
'title.max' => '分类名称不能超过20个字符',
'image.required' => '请上传分类图片',
'keywords.required' => '请输入分类关键词',
'keywords.max' => '分类关键词不能超过50个字符',
'describe.required' => '请输入分类描述',
'describe.max' => '分类描述不能超过200个字符',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\product;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class DescribeRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/15
*/
class DescribeRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title'=>'required|max:30',
'describe'=>'required',
];
}
public function messages()
{
return [
'title.required' => '请输入描述名称',
'title.max' => '描述名称不能超过30个字符',
'seo_title.required' => '请输入描述内容',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\product;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class KeywordRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/15
*/
class KeywordRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title'=>'required|max:30',
'seo_title'=>'max:200',
'seo_keywords'=>'max:200',
'seo_description'=>'max:200',
];
}
public function messages()
{
return [
'title.required' => '请输入关键词',
'title.max' => '关键词不能超过30个字符',
'seo_title.max' => 'SEO标题不能超过200个字符',
'seo_keywords.max' => 'SEO关键词不能超过200个字符',
'seo_description.max' => 'SEO描述不能超过200个字符',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\product;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class ProductRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/12
*/
class ProductRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title'=>'required|max:20',
'image'=>'required',
'keywords'=>'required|max:50',
'describe'=>'required|max:200',
];
}
public function messages()
{
return [
'title.required' => '请输入分类名称',
'title.max' => '分类名称不能超过20个字符',
'image.required' => '请上传分类图片',
'keywords.required' => '请输入分类关键词',
'keywords.max' => '分类关键词不能超过50个字符',
'describe.required' => '请输入分类描述',
'describe.max' => '分类描述不能超过200个字符',
];
}
}
... ...
... ... @@ -8,7 +8,26 @@ use Illuminate\Support\Facades\DB;
class Base extends Model
{
protected $table = '';
public $allCount = 0;
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
//统一设置返回时间格式
protected $casts = [
'created_at' => 'datetime:Y-m-d H:i:s',
'updated_at' => 'datetime:Y-m-d H:i:s',
];
/**
* 日期序列化 勿删 删了时间就不是东八区时间了哈
* @param \DateTimeInterface $date
* @return string
* @author zbj
* @date 2023/4/13
*/
protected function serializeDate(\DateTimeInterface $date): string
{
return $date->format('Y-m-d H:i:s');
}
/**
* @name 列表数据
* @return void
... ... @@ -17,13 +36,34 @@ class Base extends Model
*/
public function lists($map, $p, $row, $order = 'id', $fields = ['*']){
//TODO::where(['id'=>'','name'=>''])
$lists = DB::table($this->table)->select($fields)->where($map)->forPage($p,$row)->orderBy($order)->get();
if (!empty($lists)) {
$this->allCount = DB::table($this->table)->where($map)->count();
$query = $this->formatQuery($map);
$lists = $query->select($fields)->orderBy($order)->paginate($row, ['*'], 'page', $p);
if (empty($lists)) {
return false;
}
$lists = $lists->toArray();
return $lists;
}
/**
* @param $map
* @param $order
* @param $fields
* @name :无分页列表
* @return mixed
* @author :liyuhang
* @method
*/
public function list($map,$order = 'id',$fields = ['*']){
$query = $this->formatQuery($map);
$lists = $query->select($fields)->orderBy($order)->get();
if (empty($lists)) {
return false;
}
$lists = $lists->toArray();
return $lists;
}
/**
* @param array:$condition
* @name :获取单条数据详情
... ... @@ -33,10 +73,15 @@ class Base extends Model
*/
public function read($condition,$files = ['*'])
{
$info = DB::table($this->table)->select($files)->where($condition)->first();
return (array)$info;
$query = $this->formatQuery($condition);
$info = $query->select($files)->first();
if (empty($info)) {
return false;
}
$info = $info->toArray();
return $info;
}
/**
* @name :新增
... ... @@ -45,7 +90,9 @@ class Base extends Model
* @method post
*/
public function add($data){
return DB::table($this->table)->insert($data);
$data['created_at'] = date('Y-m-d H:i:s');
$data['updated_at'] = date('Y-m-d H:i:s');
return $this->insert($data);
}
/**
... ... @@ -55,10 +102,10 @@ class Base extends Model
* @method post
*/
public function edit($data,$condition){
if(isset($data['id']) && !empty($data['id'])){
unset($data['id']);
}
return DB::table($this->table)->where($condition)->update($data);
$query = $this->formatQuery($condition);
$data['updated_at'] = date('Y-m-d H:i:s');
$rs = $query->update($data);
return $rs;
}
/**
... ... @@ -68,6 +115,65 @@ class Base extends Model
* @method
*/
public function del($condition){
return DB::table($this->table)->where($condition)->delete();
$query = $this->formatQuery($condition);
return $query->delete();
}
/**
* @param $map = ['$k'=>['like',$v],$k1]
* @param $val
* @name :参数处理查询
* @return Base
* @author :liyuhang
* @method
*/
public function formatQuery($map = [],$query = ''){
$model = $query ?: $this;
$query = $model->where(function ($query) use ($map){
foreach ($map as $k => $v){
if(is_array($v)){
//拼接数据
foreach ($v as $k1 => $v1){
switch ($k1){
case 'like':
// like查询 ['name|title'=> ['like','%a%']]
if (strpos($k, '|') !== false) {
$query->where(function ($query) use ($k,$v1) {
$item = explode('|', $k);
foreach ($item as $vo) {
$query->orWhere($vo, $v1[0], $v1[1]);
}
});
} else {
$query->where($k,$v1[0], $v1[1]);
}
break;
case 'in':
// in查询 ['id'=>['in'=>[1,2,3]]]
$query->whereIn($k, $v1[1]);
break;
case 'no in':
// in查询 ['id'=>['not in'=>[1,2,3]]]
$query->whereNotIn($k, $v1[1]);
break;
case 'between':
// in查询 ['id'=>['between'=>[create1,create2]]]
$query->whereBetween($k, $v1[1]);
case 'not between':
// not between查询 ['created_at'=>['not between'=>['xxx', 'xxx]]]
$query->whereNotBetween($k, $v1[1]);
break;
default:
$query->where($k,$k1,$v1[1]);
break;
}
}
}else{
$query->where($k,$v);
}
}
});
return $query;
}
}
... ...
... ... @@ -5,7 +5,8 @@ namespace App\Models;
class Manager extends Base
{
//设置关联表名
protected $table = 'manager';
protected $table = 'gl_manager';
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
}
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
class Attr extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_product_attr';
public function values()
{
return $this->hasMany(AttrValue::class, 'attr_id', 'id')->orderBy('id');
}
}
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
class AttrValue extends Base
{
//设置关联表名
protected $table = 'gl_product_attr_value';
}
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
class Category extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_product_category';
}
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
class Describe extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_product_describe';
}
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
use App\Models\RouteMap;
use Illuminate\Database\Eloquent\SoftDeletes;
class Keyword extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_product_keyword';
protected $appends = ['route'];
public function getRouteAttribute(){
return RouteMap::getRoute(RouteMap::SOURCE_PRODUCT_KEYWORD, $this->id, $this->project_id);
}
}
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
class Product extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_product';
}
... ...
<?php
namespace App\Models;
class ProductClassify extends Base
{
//设置关联表名
protected $table = 'gl_product_classify';
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
}
... ... @@ -10,6 +10,7 @@ class Project extends Base
protected $table = 'gl_project';
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
protected $dateFormat = 'Y-m-d';
const DATABASE_NAME_FIX = 'globalso_project_';
... ...
... ... @@ -2,10 +2,10 @@
namespace App\Models;
class Product extends Base
class ProjectGroup extends Base
{
//设置关联表名
protected $table = 'gl_product';
protected $table = 'gl_project_group';
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
}
... ...
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Log;
/**
* 路由映射表
* Class RouteMap
* @package App\Http\Models
* @author zbj
* @date 2023/4/17
*/
class RouteMap extends Model
{
//设置关联表名
protected $table = 'gl_route_map';
//路由类型
const SOURCE_PRODUCT = 'product';
const SOURCE_PRODUCT_CATE = 'product_category';
const SOURCE_PRODUCT_KEYWORD = 'product_keyword';
/**
* 生成路由标识
* @param $title
* @param $source
* @param $source_id
* @param $project_id
* @return string
* @author zbj
* @date 2023/4/17
*/
public static function generateRoute($title, $source, $source_id, $project_id){
$i=1;
$sign = generateRoute($title);
$route = $sign;
while(self::isExist($route, $source, $source_id, $project_id)){
$route = $sign .'-'.$i;
$i++;
}
return $route;
}
/**
* 路由是否存在
* @param $route
* @param $source
* @param $source_id
* @param $project_id
* @return bool
* @author zbj
* @date 2023/4/17
*/
protected static function isExist($route, $source, $source_id, $project_id){
$fixed = []; //固定的路由
if(in_array($route, $fixed)){
return true;
}
$route = self::where('project_id', $project_id)->where('route', $route)->first();
if($route){
if($route->source == $source && $route->source_id == $source_id){
return false;
}
return true;
}
return false;
}
/**
* @param $title
* @param $source
* @param $source_id
* @param int $project_id
* @param bool $auto
* @return bool
* @throws \Exception
* @author zbj
* @date 2023/4/17
*/
public static function setRoute($title, $source, $source_id, $project_id = 0, $auto=false){
$route = $title;
if($auto){
$route = self::generateRoute($title, $source, $source_id, $project_id);
}
if(!$route){
throw new \Exception('路由不能为空');
}
try {
$route_map = self::where('project_id', $project_id)->where('source_id', $source_id)->where('source', $source)->first();
if(!$route_map){
$route_map = new self();
$route_map->source = $source;
$route_map->source_id = $source_id;
$route_map->project_id = $project_id;
}
$route_map->route = $route;
$route_map->save();
}catch (\Exception $e){
throw new \Exception('路由映射失败');
}
return $route;
}
/**
* @param $route
* @param $project_id
* @return mixed
* @author zbj
* @date 2023/4/17
*/
public function getRouteInfo($route, $project_id){
return self::where('project_id',$project_id)->where('route', $route)->get();
}
/**
* @param $source
* @param $source_id
* @param $project_id
* @return mixed
* @author zbj
* @date 2023/4/17
*/
public static function getRoute($source, $source_id, $project_id){
return self::where('project_id', $project_id)->where('source', $source)->where('source_id', $source_id)->value('route');
}
/**
* @param $route
* @param $source
* @param int $project_id
* @return mixed
* @author zbj
* @date 2023/4/17
*/
public static function getSourceId($route, $source, $project_id){
return self::where('project_id', $project_id)->where('source', $source)->where('route', $route)->value('source_id');
}
/**
* @param $source
* @param $source_id
* @param $project_id
* @return mixed
* @author zbj
* @date 2023/4/17
*/
public function delRoute($source, $source_id, $project_id){
return self::where('project_id', $project_id)->where('source', $source)->where('source_id', $source_id)->delete();
}
}
... ...
... ... @@ -3,10 +3,13 @@
namespace App\Models;
//use Illuminate\Contracts\Auth\MustVerifyEmail;
use App\Models\ProjectRole as ProjectRoleModel;
use App\Models\User as UserModel;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
//use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Cache;
use Laravel\Sanctum\HasApiTokens;
class User extends Base
... ... @@ -14,7 +17,8 @@ class User extends Base
use HasApiTokens, HasFactory, Notifiable;
protected $table = 'gl_project_user';
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
/**
* The attributes that are mass assignable.
*
... ... @@ -32,7 +36,7 @@ class User extends Base
* @var array<int, string>
*/
protected $hidden = [
'password',
// 'password',
'remember_token',
];
... ... @@ -43,5 +47,89 @@ class User extends Base
*/
protected $casts = [
'email_verified_at' => 'datetime',
'created_at' => 'datetime:Y-m-d H:i:s',
'updated_at' => 'datetime:Y-m-d H:i:s',
];
/***
* @name :登录
* @return void
* @author :liyuhang
* @method
*/
public function login($param){
if(!isset($param['login_method'])){
//密码加密
$param['password'] = base64_encode(md5($param['password']));
$info = $this->read(['mobile'=>$param['mobile'],'password'=>$param['password'],'status'=>0], ['*']);
}else{
//TODO::验证验证码是否正确
$info = $this->read(['mobile'=>$param['mobile']],['*']);
}
if(empty($info)){
return false;
}
//当前用户角色是否被禁用
$projectRoleModel = new ProjectRoleModel();
$role_info = $projectRoleModel->read(['id'=>$info['role_id'],'status'=>0]);
if(empty($role_info)){
return false;
}
//验证码登录
if(isset($info['token']) && !empty($info['token'])){
//清除上一次用户缓存
Cache::pull($info['token']);
}
//生成新token
$token = md5(uniqid().$info['id']);
//存储缓存
$info['token'] = $token;
Cache::add($token,$info);
$rs = $this->edit(['token'=>$token],['id'=>$info['id']]);
if($rs === false){
return false;
}
unset($info['password']);
return $info;
}
//新增用户
public function adds($param){
//验证当前用户是否存在
$info = $this->read(['mobile'=>$param['mobile']]);
if($info !== false){
return false;
}
//密码加密
$param['password'] = base64_encode(md5($param['password']));
$rs = $this->add($param);
if($rs === false){
return false;
}
return true;
}
/**
* @param $param
* @name :编辑管理员
* @return bool
* @author :liyuhang
* @method
*/
public function edits($param){
//查看密码是否修改
$info = $this->read(['id'=>$param['id']]);
$param['password'] = base64_encode(md5($param['password']));
if($param['password'] == $info['password']){
unset($param['password']);
}
//密码加密
$rs = $this->edit($param,['id'=>$param['id']]);
if($rs === false){
return false;
}
//清空当前用户登录缓存
Cache::pull($info['token']);
return true;
}
}
... ...
... ... @@ -2,6 +2,7 @@
namespace App\Providers;
use App\Services\PaginatorServer;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
... ... @@ -13,7 +14,10 @@ class AppServiceProvider extends ServiceProvider
*/
public function register()
{
//
//自定义分页
$this->app->bind('Illuminate\Pagination\LengthAwarePaginator',function ($app,$options){
return new PaginatorServer($options['items'], $options['total'], $options['perPage'], $options['currentPage'] , $options['options']);
});
}
/**
... ...
<?php
namespace App\Rules;
use App\Helper\Arr;
use Illuminate\Contracts\Validation\Rule;
class Ids implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
$ids = array_filter(Arr::splitFilterToArray($value), 'intval');
return boolval($ids);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'ID不能为空';
}
}
... ...
... ... @@ -8,7 +8,6 @@ namespace App\Services;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use App\Traits\RedisTrait;
class BaseService
{
... ...
<?php
namespace App\Services;
use Illuminate\Pagination\LengthAwarePaginator;
/**
* 自定义Paginate的分页参数
* Class PaginatorServer
* @package App\Services
* @author zbj
* @date 2023/4/14
*/
class PaginatorServer extends LengthAwarePaginator
{
public function toArray()
{
return [
'list' => $this->items->toArray(),
'total' => $this->total(),
'page' => $this->currentPage(),
'total_page' => $this->lastPage(),
'size' => $this->perPage(),
];
}
}
... ...
... ... @@ -27,7 +27,10 @@
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"files": [
"app/Helper/helper.php"
]
},
"autoload-dev": {
"psr-4": {
... ...
... ... @@ -67,7 +67,7 @@ return [
|
*/
'timezone' => 'UTC',
'timezone' => 'PRC',
/*
|--------------------------------------------------------------------------
... ...
... ... @@ -6,13 +6,71 @@ use \Illuminate\Support\Facades\Route;
//必须登录验证的路由组
Route::middleware(['bloginauth'])->group(function () {
//登录用户编辑个人资料
Route::any('/edit_info', [\App\Http\Controllers\Bside\ComController::class, 'edit_info'])->name('edit_info');
Route::any('/logout', [\App\Http\Controllers\Bside\ComController::class, 'logout'])->name('logout');
//获取当前登录用户菜单
Route::any('/get_menu', [\App\Http\Controllers\Bside\ComController::class, 'get_menu'])->name('get_menu');
//获取当前登录用户项目详情
Route::any('/get_project', [\App\Http\Controllers\Bside\ComController::class, 'get_project'])->name('get_project');
//用户相关路由
Route::any('/user/add', [\App\Http\Controllers\Bside\UserController::class, 'add'])->name('user_add');
Route::any('/user/edit', [\App\Http\Controllers\Bside\UserController::class, 'edit'])->name('user_edit');
Route::any('/user/status', [\App\Http\Controllers\Bside\UserController::class, 'status'])->name('user_status');
Route::any('/user/lists', [\App\Http\Controllers\Bside\UserController::class, 'lists'])->name('user_lists');
Route::any('/user/del', [\App\Http\Controllers\Bside\UserController::class, 'del'])->name('user_del');
//用户角色相关路由
Route::any('/project_role/lists', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'lists'])->name('project_role_lists');
Route::any('/project_role/get_role_menu', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'get_role_menu'])->name('project_get_role_add');
Route::any('/project_role/add', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'add'])->name('project_role_add');
Route::any('/project_role/edit', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'edit'])->name('project_role_edit');
Route::any('/project_role/status', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'status'])->name('project_role_status');
Route::any('/project_role/del', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'del'])->name('project_role_del');
//group相关路由
Route::any('/project_group/add', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'add'])->name('project_group_add');
Route::any('/project_group/edit', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'edit'])->name('project_group_edit');
Route::any('/project_group/status', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'status'])->name('project_group_status');
Route::any('/project_group/lists', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'lists'])->name('project_group_lists');
Route::any('/project_group/del', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'del'])->name('project_group_del');
//产品
Route::prefix('product')->group(function () {
//产品
Route::get('/', [\App\Http\Controllers\Bside\Product\ProductController::class, 'index'])->name('product');
Route::get('/info', [\App\Http\Controllers\Bside\Product\ProductController::class, 'info'])->name('product_info');
Route::post('/save', [\App\Http\Controllers\Bside\Product\ProductController::class, 'save'])->name('product_save');
Route::any('/delete', [\App\Http\Controllers\Bside\Product\ProductController::class, 'delete'])->name('product_delete');
//产品分类
Route::get('category', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'index'])->name('product_category');
Route::get('category/info', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'info'])->name('product_category_info');
Route::post('category/save', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'save'])->name('product_category_save');
Route::any('category/delete', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'delete'])->name('product_category_delete');
//产品关键词
Route::get('keyword', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'index'])->name('product_keyword');
Route::get('keyword/info', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'info'])->name('product_keyword_info');
Route::post('keyword/save', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'save'])->name('product_keyword_save');
Route::any('keyword/delete', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'delete'])->name('product_keyword_delete');
//产品参数
Route::get('attr', [\App\Http\Controllers\Bside\Product\AttrController::class, 'index'])->name('product_attr');
Route::get('attr/info', [\App\Http\Controllers\Bside\Product\AttrController::class, 'info'])->name('product_attr_info');
Route::post('attr/save', [\App\Http\Controllers\Bside\Product\AttrController::class, 'save'])->name('product_attr_save');
Route::any('attr/delete', [\App\Http\Controllers\Bside\Product\AttrController::class, 'delete'])->name('product_attr_delete');
//产品描述
Route::get('describe', [\App\Http\Controllers\Bside\Product\DescribeController::class, 'index'])->name('product_describe');
Route::get('describe/info', [\App\Http\Controllers\Bside\Product\DescribeController::class, 'info'])->name('product_describe_info');
Route::post('describe/save', [\App\Http\Controllers\Bside\Product\DescribeController::class, 'save'])->name('product_describe_save');
Route::any('describe/delete', [\App\Http\Controllers\Bside\Product\DescribeController::class, 'delete'])->name('product_describe_delete');
});
});
//无需登录验证的路由组
Route::group([], function () {
Route::any('/login', [\App\Http\Controllers\Bside\ComController::class, 'login'])->name('login');
Route::any('/get_menu', [\App\Http\Controllers\Bside\ComController::class, 'get_menu'])->name('get_menu');
Route::any('/user/lists', [\App\Http\Controllers\Bside\UserController::class, 'lists'])->name('user_lists');
Route::any('/project/page_lists', [\App\Http\Controllers\Bside\ProjectController::class, 'page_lists'])->name('page_lists');
});
... ...
... ... @@ -14,5 +14,5 @@ use Illuminate\Support\Facades\Route;
*/
Route::get('/', function () {
return view('welcome');
// return view('welcome');
});
... ...