作者 zhl

u

正在显示 126 个修改的文件 包含 5210 行增加988 行删除
APP_NAME=Laravel
APP_ENV=test
APP_KEY=base64:+ouoKlz2sFDOisnROMRpxT/u9xkZJVrXlzP4cfTqPow=
APP_DEBUG=false
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=globalso
DB_USERNAME=debian-sys-maint
DB_PASSWORD=WtujxV73XIclQet0
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DRIVER=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
... ... @@ -15,3 +15,4 @@ yarn-error.log
/.vscode
composer.lock
app/Console/Commands/Test/Demo.php
/public/upload
... ...
<?php
/**
* Created by PhpStorm.
* User: zhl
* Date: 2023/4/19
* Time: 15:04
*/
namespace App\Console\Commands;
use App\Models\Project;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
/**
* Class ProjectDatabaseUpdate
* @package App\Console\Commands
*/
class ProjectDatabaseUpdate extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'project:database_update';
/**
* The console command description.
*
* @var string
*/
protected $description = '项目数据库更新';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* @return bool
*/
public function handle()
{
#TODO 未处理更新 更新对象(base, project) 更新内容
return true;
}
/**
* 主库内容更新
* @param $sql
* @return array
*/
public function baseUpdate($sql)
{
return DB::select($sql);
}
/**
* 客户数据表更新
* @param $sql
* @return bool
*/
public function projectDatabaseUpdate($sql)
{
$project = Project::get();
foreach ($project as $val) {
ProjectServer::useProject($val->id);
DB::connection('custom_mysql')->select($sql);
}
return true;
}
/**
* 指定项目数据库更新
* @param $project_id
* @param $sql
*/
public function appointProjectUpdate($project_id, $sql)
{
ProjectServer::useProject($project_id);
DB::connection('custom_mysql')->select($sql);
}
}
\ No newline at end of file
... ...
... ... @@ -113,7 +113,7 @@ class Handler extends ExceptionHandler
$code = $exception->getCode();
} elseif ($exception instanceof ValidationException) {
$code = Code::USER_PARAMS_ERROE();
$message = Arr::first(Arr::first($exception->errors()));
$message = $code->description = Arr::first(Arr::first($exception->errors()));
} elseif ($exception instanceof NotFoundHttpException || $exception instanceof MethodNotAllowedHttpException) {
return response('404 Not Found', 404);
} else {
... ...
<?php
namespace App\Files;
use Illuminate\Http\Request;
class Image
{
protected $request = [];
public function __construct(Request $request)
{
$this->request = $request;
}
/**
* @name :上传图片
* @return void
* @author :liyuhang
* @method
*/
public function uploads(){
$url = './uploads/images/';
$param = $this->request->post();
if($this->request->hasFile('image') && $this->request->file('image')->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;
}
}
... ... @@ -125,4 +125,64 @@ class Arr extends \Illuminate\Support\Arr
return $signle ? $rows[0] : $rows;
}
/**
* 数组转字符串
* @param $arr
* @return string
* @author zbj
* @date 2023/4/17
*/
public static function a2s($arr): string
{
return json_encode($arr, JSON_UNESCAPED_UNICODE);
}
/**
* 字符串转数组
* @param $str
* @return array|mixed
* @author zbj
* @date 2023/4/17
*/
public static function s2a($str)
{
if (is_array($str)) {
return $str;
}
return is_object($str) ? (array)$str : json_decode($str, true);
}
/**
* 数组转set形式字符串
* @param $arr
* @param string $format
* @return string
* @author zbj
* @date 2023/4/17
*/
public static function arrToSet($arr, string $format = 'intval'): string
{
$arr = array_unique(array_filter(Arr::splitFilterToArray($arr, $format, ',')));
return $arr ? implode(',', $arr) : '';
}
/**
* set形式字符串转数组
* @param $str
* @param string $format
* @return array
* @author zbj
* @date 2023/4/17
*/
public static function setToArr($str, string $format = 'intval')
{
if (is_string($str)) {
return Arr::splitFilterToArray($str, $format, ',');
}
return $str ?: [];
}
}
... ...
<?php
namespace App\Helper;
/**
* 计算文件hash
*
* 七牛云的计算规则
*/
class FileEtag
{
const BLOCK_SIZE = 4194304; //4*1024*1024 分块上传块大小,该参数为接口规格,不能修改
private static function packArray($v, $a)
{
return call_user_func_array('pack', array_merge(array($v), (array)$a));
}
private static function blockCount($fsize)
{
return intval(($fsize + (self::BLOCK_SIZE - 1)) / self::BLOCK_SIZE);
}
private static function calcSha1($data)
{
$sha1Str = sha1($data, true);
$err = error_get_last();
if ($err !== null) {
return array(null, $err);
}
$byteArray = unpack('C*', $sha1Str);
return array($byteArray, null);
}
private static function base64_urlSafeEncode($data)
{
$find = array('+', '/');
$replace = array('-', '_');
return str_replace($find, $replace, base64_encode($data));
}
public static function sum($filename)
{
$fhandler = fopen($filename, 'r');
$err = error_get_last();
if ($err !== null) {
return array(null, $err);
}
$fstat = fstat($fhandler);
$fsize = $fstat['size'];
if ((int)$fsize === 0) {
fclose($fhandler);
return array('Fto5o-5ea0sNMlW_75VgGJCv2AcJ', null);
}
$blockCnt = self::blockCount($fsize);
$sha1Buf = array();
if ($blockCnt <= 1) {
array_push($sha1Buf, 0x16);
$fdata = fread($fhandler, self::BLOCK_SIZE);
if ($err !== null) {
fclose($fhandler);
return array(null, $err);
}
list($sha1Code,) = self::calcSha1($fdata);
$sha1Buf = array_merge($sha1Buf, $sha1Code);
} else {
array_push($sha1Buf, 0x96);
$sha1BlockBuf = array();
for ($i = 0; $i < $blockCnt; $i++) {
$fdata = fread($fhandler, self::BLOCK_SIZE);
list($sha1Code, $err) = self::calcSha1($fdata);
if ($err !== null) {
fclose($fhandler);
return array(null, $err);
}
$sha1BlockBuf = array_merge($sha1BlockBuf, $sha1Code);
}
$tmpData = self::packArray('C*', $sha1BlockBuf);
list($sha1Final,) = self::calcSha1($tmpData);
$sha1Buf = array_merge($sha1Buf, $sha1Final);
}
$etag = self::base64_urlSafeEncode(self::packArray('C*', $sha1Buf));
return array($etag, null);
}
}
... ...
<?php
define('HTTP_OPENAI_URL','http://openai.waimaoq.com/');
/**
* 生成路由标识
* @param $string
... ... @@ -10,3 +10,81 @@
function generateRoute($string){
return trim(strtolower(preg_replace( '/[\W]+/', '-', trim($string))), '-');
}
if(!function_exists('http_post')){
/**
* 发送http post请求
* @param type $url
* @param type $post_data
*/
function http_post($url, $post_data)
{
$header = array(
"Accept: application/json",
"Content-Type:application/json;charset=utf-8",
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
if (curl_errno($ch)) {
Log::write(print_r(curl_errno($ch),1),'debug---1');
}
curl_close($ch);
return json_decode($res, true);
}
}
if(!function_exists('http_get')){
/**
* 发送http get请求
* @param type $url
* @return type
*/
function http_get($url)
{
$header[] = "content-type: application/x-www-form-urlencoded;
charset = UTF-8";
$ch1 = curl_init();
$timeout = 5;
curl_setopt($ch1, CURLOPT_URL, $url);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch1, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST, false);
$access_txt = curl_exec($ch1);
curl_close($ch1);
return json_decode($access_txt, true);
}
}
if(!function_exists('_get_child')){
/**
* 菜单权限->得到子级数组
* @param int
* @return array
*/
function _get_child($my_id, $arr)
{
$new_arr = array();
foreach ($arr as $k => $v) {
$v = (array)$v;
if ($v['pid'] == $my_id) {
$v['sub'] = _get_child($v['id'],$arr);
$new_arr[] = $v;
}
}
return $new_arr ? $new_arr : false;
}
}
... ...
<?php
namespace App\Http\Controllers\Aside;
use App\Enums\Common\Code;
use App\Http\Controllers\Aside\BaseController;
use App\Models\AiCommand as AiCommandModel;
use function App\Helper\send_openai_msg;
class AiCommandController extends BaseController
{
/**
* @name :指令列表
* @return void
* @author :liyuhang
* @method
*/
public function lists(AiCommandModel $aiCommandModel){
$lists = $aiCommandModel->lists($this->map);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name
* @return void
* @author :liyuhang
* @method
*/
public function add(){
}
/**
* @name
* @return void
* @author :liyuhang
* @method
*/
public function edit(){
}
/**
* @name
* @return void
* @author :liyuhang
* @method
*/
public function del(){
}
}
... ...
... ... @@ -4,19 +4,18 @@ namespace App\Http\Controllers\Aside;
use App\Enums\Common\Code;
use App\Http\Controllers\Controller;
use App\Utils\EncryptUtils;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
class BaseController extends Controller
{
protected $param = [];//所有请求参数
protected $token = ''; //token
protected $request = [];//助手函数
protected $p = 1;//当前页
protected $page = 1;//当前页
protected $row = 20;//每页条数
protected $header = [];//设置请求头参数
protected $order = 'id';
... ... @@ -31,23 +30,27 @@ class BaseController extends Controller
$this->request = $request;
$this->param = $this->request->all();
$this->token = $this->request->header('token');
if(!empty($this->token) && !empty(Cache::get($this->token))){
$info = Cache::get($this->token);
$this->user = $info;
$this->uid = $info['id'];
}else{
return response(['code'=>Code::USER_ERROR,'msg'=>'当前用户未登录']);
}
$this->get_param();
$this->auth_token();
}
/**
* @name
* @return void
* @author :liyuhang
* @method
* admin端用渲染 不走接口
* @return mixed
* @author zbj
* @date 2023/4/19
*/
public function auth_token(){
$info = Cache::get($this->token);
if(isset($info) && !empty($info)){
$this->user = $info;
$this->uid = $info['id'];
}
public function manage(){
return Session::get('manage');
}
/**
* 成功返回
* @param array $data
... ... @@ -68,16 +71,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
... ... @@ -94,20 +90,23 @@ class BaseController extends Controller
case "order":
$this->order = $v;
break;
case 'p':
$this->p = $v;
case 'page':
$this->page = $v;
break;
case 'row':
$this->row = $v;
break;
case "created_at":
case "name":
$this->map['name'] = ['like','%'.$v.'%'];
break;
case "start_at":
$this->_btw[0] = $v;
$this->_btw[1] = date('Y-m-d H:i:s',time());
$this->map['create_at'] = ['between', $this->_btw];
$this->map['created_at'] = ['between', $this->_btw];
break;
case "updated_at":
case "end_at":
$this->_btw[1] = $v;
$this->map['update_at'] = ['between', $this->_btw];
$this->map['updated_at'] = ['between', $this->_btw];
break;
default:
if (!empty($v)) {
... ... @@ -116,20 +115,20 @@ class BaseController extends Controller
break;
}
}
}
/**
* @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' => $this->_extents($data),
];
$this->header['Content-Type'] = $type;
$this->header['token'] = $this->token;
... ... @@ -137,25 +136,45 @@ class BaseController extends Controller
throw new HttpResponseException($response);
}
/**
* @name :上传图片
* @return void
* @author :liyuhang
* @method
* 菜单权限->得到子级数组
* @param int
* @return array
*/
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;
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;
}
protected function _extents($data) {
if (empty($data) || !is_array($data)) {
return empty($data) ? is_array($data) ? [] : '' : $data;
}
foreach ($data as $k => $v) {
if (is_array($v)) {
$data[$k] = $this->_extents($v);
} else {
if (is_null($v)) {
$data[$k] = '';
continue;
}
switch ((string) $k) {
case 'image':
$v['image_link'] = file_get_contents($v);
break;
}
}
}
return $url.$filename;
return $data;
}
}
... ...
<?php
namespace App\Http\Controllers\Aside;
use App\Http\Logic\Aside\DemoLogic;
use App\Http\Requests\Aside\DemoRequest;
class DemoController extends BaseController
{
/**
* Deom控制器
* @param DemoRequest $request
* @param DemoLogic $logic
* @return \Illuminate\Http\JsonResponse
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
public function test(DemoRequest $request,DemoLogic $logic)
{
$request->validated();
$data=$logic->testLogic();
return $this->success($data);
}
}
<?php
namespace App\Http\Controllers\Aside;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
/**
* Class IndexController
* @package App\Http\Controllers\Aside
* @author zbj
* @date 2023/4/19
*/
class IndexController extends Controller
{
/**
* 首页
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
}
}
... ...
<?php
namespace App\Http\Controllers\Aside;
use App\Http\Logic\Aside\LoginLogic;
use App\Rules\Mobile;
use Illuminate\Http\Request;
/**
* Class LoginController
* @package App\Http\Controllers\Aside
* @author zbj
* @date 2023/4/19
*/
class LoginController extends BaseController
{
function login(Request $request, LoginLogic $logic)
{
if ($request->isMethod('POST')) {
$request->validate([
'mobile' => ['required', new Mobile()],
'password' => 'required',
], [
'mobile.required' => '请输入手机号',
'password.required' => '请输入密码',
]);
$logic->login();
return $this->success();
}
return view('admin.login');
}
public function logout(LoginLogic $logic)
{
return $logic->logout();
}
}
... ...
<?php
namespace App\Http\Controllers\Aside\Manage;
use App\Helper\Arr;
use App\Http\Controllers\Aside\BaseController;
use App\Http\Logic\Aside\DeptLogic;
use App\Http\Requests\Aside\DeptRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class DeptController
* @package App\Http\Controllers\Aside
* @author zbj
* @date 2023/4/20
*/
class DeptController extends BaseController
{
public function list(DeptLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'pid', 'title'],0);
return view("admin.dept", ["list" => Arr::listToTree($data)]);
}
public function info(Request $request, DeptLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'pid', 'title', 'manager_uids', 'remark']));
}
public function save(DeptRequest $request, DeptLogic $logic)
{
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, DeptLogic $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\Aside\Manage;
use App\Helper\Arr;
use App\Http\Controllers\Aside\BaseController;
use App\Http\Logic\Aside\GroupLogic;
use App\Http\Requests\Aside\GroupRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* 用户组
* Class Group
* @package App\Http\Controllers\Aside
* @author zbj
* @date 2023/4/19
*/
class GroupController extends BaseController
{
public function list(Request $request, GroupLogic $logic)
{
$list = $logic->getList();
return view("admin.group", ["list" => $list]);
}
public function info(Request $request, GroupLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success($data);
}
public function save(GroupRequest $request, GroupLogic $logic){
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, GroupLogic $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\Aside\Manage;
use App\Helper\Arr;
use App\Http\Controllers\Aside\BaseController;
use App\Http\Logic\Aside\ManageLogic;
use App\Http\Requests\Aside\ManageRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* 后台用户
* Class ManageController
* @package App\Http\Controllers\Aside
* @author zbj
* @date 2023/4/20
*/
class ManageController extends BaseController
{
public function list(Request $request, ManageLogic $logic)
{
$list = $logic->getList();
return view("admin.manage", ["list" => $list]);
}
public function info(Request $request, ManageLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success($data);
}
public function save(ManageRequest $request, ManageLogic $logic){
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, ManageLogic $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\Aside\Manage;
use App\Helper\Arr;
use App\Http\Controllers\Aside\BaseController;
use App\Http\Logic\Aside\MenuLogic;
use App\Http\Requests\Aside\MenuRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* 后台菜单
* Class MenuController
* @package App\Http\Controllers\Aside
* @author zbj
* @date 2023/4/19
*/
class MenuController extends BaseController
{
public function list(Request $request, MenuLogic $logic)
{
$map = [];
$sort = ['id' => 'desc'];
$list = $logic->getList($map, $sort, ['*'],0);
return view("admin.menu", ["list" => Arr::listToTree($list)]);
}
public function info(Request $request, MenuLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success($data);
}
public function save(MenuRequest $request, MenuLogic $logic){
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, MenuLogic $logic){
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
}
... ...
... ... @@ -2,6 +2,7 @@
namespace App\Http\Controllers\Aside;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Models\Project as ProjectModel;
... ... @@ -20,6 +21,16 @@ class ProjectController extends BaseController
public function lists(){
$projectModel = new ProjectModel();
$lists = $projectModel->lists($this->map,$this->p,$this->row,$this->order);
$this->result($lists);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :添加项目
* @return void
* @author :liyuhang
* @method
*/
public function add(){
$projectModel = new ProjectModel();
}
}
... ...
<?php
namespace App\Http\Controllers\Aside;
class ProjectMenuController extends BaseController
{
/**
* @name :用户菜单列表
* @return void
* @author :liyuhang
* @method
*/
public function lists(){
}
}
... ...
<?php
namespace App\Http\Controllers\Aside;
class ProjectRoleController extends BaseController
{
/**
* @name :列表
* @return void
* @author :liyuhang
* @method
*/
public function lists (){
}
}
... ...
<?php
namespace App\Http\Controllers\Aside;
class ProjectUserController extends BaseController
{
/**
* @name :用户列表
* @return void
* @author :liyuhang
* @method
*/
public function lists(){
}
}
... ...
<?php
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use Illuminate\Http\Request;
class AiCommandController extends BaseController
{
public $chat_url = 'v2/openai_chat';
/**
* @name :ai生成
* @return void
* @author :liyuhang
* @method
*/
public function ai_http_post(Request $request){
$request->validate([
'keywords'=>['required'],
'key'=>['required']
],[
'keywords.required' => '关键字不能为空',
'key.required' => '场景不能为空',
]);
#TODO 通过key获取到ai指令对象
$data = $this->send_openai_msg($this->chat_url);
$this->response('success',Code::SUCCESS,$data);
}
}
... ...
... ... @@ -4,7 +4,7 @@ namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Http\Controllers\Controller;
use App\Utils\EncryptUtils;
use App\Models\AiCommand as AiCommandModel;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Exceptions\HttpResponseException;
... ... @@ -15,8 +15,7 @@ class BaseController extends Controller
protected $param = [];//所有请求参数
protected $token = ''; //token
protected $request = [];//助手函数
protected $allCount = 0;//总条数
protected $p = 1;//当前页
protected $page = 1;//当前页
protected $row = 20;//每页条数
protected $header = [];//设置请求头参数
protected $order = 'id';
... ... @@ -35,7 +34,6 @@ class BaseController extends Controller
$info = Cache::get($this->token);
$this->user = $info;
$this->uid = $info['id'];
$this->param['project_id'] = $this->user['project_id'];
}else{
return response(['code'=>Code::USER_ERROR,'msg'=>'当前用户未登录']);
}
... ... @@ -80,20 +78,23 @@ class BaseController extends Controller
case "order":
$this->order = $v;
break;
case 'p':
$this->p = $v;
case 'page':
$this->page = $v;
break;
case 'row':
$this->row = $v;
break;
case "created_at":
case "name":
$this->map['name'] = ['like','%'.$v.'%'];
break;
case "start_at":
$this->_btw[0] = $v;
$this->_btw[1] = date('Y-m-d H:i:s',time());
$this->map['create_at'] = ['between', $this->_btw];
$this->map['created_at'] = ['between', $this->_btw];
break;
case "updated_at":
case "end_at":
$this->_btw[1] = $v;
$this->map['update_at'] = ['between', $this->_btw];
$this->map['updated_at'] = ['between', $this->_btw];
break;
default:
if (!empty($v)) {
... ... @@ -102,7 +103,6 @@ class BaseController extends Controller
break;
}
}
}
/**
* @name 统一返回参数
... ... @@ -116,7 +116,7 @@ class BaseController extends Controller
$result = [
'msg' => $msg == ' ' ? $code->description : $msg,
'code' => $code->value,
'data' => $data,
'data' => $this->_extents($data),
];
$this->header['Content-Type'] = $type;
$this->header['token'] = $this->token;
... ... @@ -143,25 +143,51 @@ class BaseController extends Controller
return $new_arr ? $new_arr : false;
}
protected function _extents($data) {
if (empty($data) || !is_array($data)) {
return empty($data) ? is_array($data) ? [] : '' : $data;
}
foreach ($data as $k => $v) {
if (is_array($v)) {
$data[$k] = $this->_extents($v);
} else {
if (is_null($v)) {
$data[$k] = '';
continue;
}
switch ((string) $k) {
case 'image':
$v['image_link'] = url('/image/' . $v);
break;
}
}
}
return $data;
}
/**
* @name :上传图片
* @return void
* @name :ai自动生成
* @return mixed
* @author :liyuhang
* @method
*/
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;
public function send_openai_msg($url){
$url = HTTP_OPENAI_URL.$url;
$aiCommandModel = New AiCommandModel();
//指定库获取指令
$info = $aiCommandModel->read(['key'=>$this->param['key']]);
if($info === false){
$this->response('指令不存在',Code::USER_ERROR);
}
//替换关键字
$content = str_replace('$keyword$', $this->param['keywords'], $info['ai']);
$data = [
'messages'=>[
['role'=>'system','content'=>$info['scene']],
['role'=>'assistant','content'=>$content],
]
];
return http_post($url,json_encode($data));
}
}
... ...
<?php
namespace App\Http\Controllers\Bside\Blog;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Blog\BlogCategoryLogic;
use App\Http\Requests\Bside\Blog\BlogCategoryRequest;
use App\Models\Blog\Blog as BlogModel;
use App\Models\Blog\BlogCategory as BlogCategoryModel;
use Illuminate\Http\Request;
class BlogCategoryController extends BaseController
{
/**
* @name :博客分类列表
* @return json
* @author :liyuhang
* @method
*/
public function lists(BlogCategoryModel $blogCategoryModel){
//搜索条件
$this->map['project_id'] = $this->user['project_id'];
$lists = $blogCategoryModel->lists($this->map,$this->page,$this->row);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :获取当前分类详情
* @return void
* @author :liyuhang
* @method
*/
public function info(Request $request,BlogCategoryLogic $blogCategoryLogic){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$info = $blogCategoryLogic->info_blog_category();
$this->response('success',Code::SUCCESS,$info);
}
/**
* @name :添加分类
* @return json
* @author :liyuhang
* @method
*/
public function add(BlogCategoryRequest $request,BlogCategoryLogic $blogCategoryLogic){
$request->validated();
//添加时,验证分类上级分类是否有,有则更新到当前分类中,没有时直接添加
$blogCategoryLogic->add_blog_category();
$this->response('success');
}
/**
* @name :编辑分类
* @return void
* @author :liyuhang
* @method
*/
public function edit(BlogCategoryRequest $request,BlogCategoryLogic $blogCategoryLogic){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$blogCategoryLogic->edit_blog_category();
//TODO::写入日志
$this->response('success');
}
/**
* @name :编辑状态/与排序
* @return void
* @author :liyuhang
* @method
*/
public function status(Request $request,BlogCategoryLogic $blogCategoryLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$blogCategoryLogic->status_blog_category();
$this->response('success');
}
/**
* @name :删除分类
* @return void
* @author :liyuhang
* @method
*/
public function del(Request $request,BlogCategoryLogic $blogCategoryLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$blogCategoryLogic->del_blog_category();
//TODO::写入操作日志
$this->response('success');
}
}
... ...
<?php
namespace App\Http\Controllers\Bside\Blog;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Blog\BlogLogic;
use App\Http\Requests\Bside\Blog\BlogRequest;
use App\Models\Blog\Blog as BlogModel;
use App\Models\Blog\BlogCategory as BlogCategoryModel;
use Illuminate\Http\Request;
class BlogController extends BaseController
{
/**
* @name :博客列表
* @return json
* @author :liyuhang
* @method
*/
public function lists(BlogModel $blogModel){
//搜索条件
$this->map['project_id'] = $this->user['project_id'];
$lists = $blogModel->lists($this->map,$this->page,$this->row);
if(!empty($lists['list'])){
foreach ($lists['list'] as $k => $v){
$blogCategoryModel= new BlogCategoryModel();
//获取用户已读还是未读
$category_info = $blogCategoryModel->
list(['id'=>['in',explode(',',trim($v['category_id'],','))]],'id',['name']);
$str = '';
foreach ($category_info as $v1){
$str .= $v1['name'].',';
}
$v['category_id'] = trim($str,',');
$lists['list'][$k] = $v;
}
}
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :获取分页列表
* @return void
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function get_category_list(BlogLogic $blogLogic){
$list = $blogLogic->blog_get_category_list();
$this->response('success',Code::SUCCESS,$list);
}
/**
* @name :获取当前博客详情
* @return json
* @author :liyuhang
* @method
*/
public function info(Request $request,BlogLogic $blogLogic){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$info = $blogLogic->blog_info();
$this->response('success',Code::SUCCESS,$info);
}
/**
* @name :添加博客
* @return void
* @author :liyuhang
* @method
*/
public function add(BlogRequest $request,BlogLogic $blogLogic){
$request->validated();
$blogLogic->blog_add();
//TODO::写入日志
$this->response('success');
}
/**
* @name :编辑博客
* @return void
* @author :liyuhang
* @method
*/
public function edit(BlogRequest $request,BlogLogic $blogLogic){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$blogLogic->blog_edit();
//TODO::写入日志
$this->response('success');
}
/**
* @name :编辑博客状态/排序
* @return void
* @author :liyuhang
* @method
*/
public function status(Request $request,BlogLogic $blogLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$blogLogic->blog_status();
//TODO::写入日志
$this->response('success');
}
/**
* @name :删除博客(批量逻辑删除)
* @return void
* @author :liyuhang
* @method
*/
public function del(Request $request,BlogLogic $blogLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$blogLogic->blog_del();
$this->response('success');
}
/**
* @name :ai生成
* @return void
* @author :liyuhang
* @method
*/
public function ai_blog(Request $request){
$request->validate([
'keywords'=>['required'],
'key'=>['required']
],[
'keywords.required' => '关键字不能为空',
'key.required' => '场景不能为空',
]);
#TODO 通过key获取到ai指令对象
$url = 'v2/openai_chat';
$data = $this->send_openai_msg($url);
$this->response('success',Code::SUCCESS,$data);
}
}
... ...
<?php
namespace App\Http\Controllers\Bside\Blog;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Blog\BlogLabelLogic;
use App\Http\Requests\Bside\Blog\BlogLabelRequest;
use App\Models\Blog\BlogLabel as BlogLabelModel;
use Illuminate\Http\Request;
class BlogLabelController extends BaseController
{
/**
* @name :博客标签列表
* @return json
* @author :liyuhang
* @method
*/
public function lists(BlogLabelModel $blogLabelModel){
$this->map['project_id'] = $this->user['project_id'];
$lists = $blogLabelModel->lists($this->map,$this->page,$this->row,$this->order,['id','name','created_at','updated_at']);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :添加标签
* @return void
* @author :liyuhang
* @method
*/
public function add(BlogLabelRequest $request,BlogLabelLogic $blogLabelLogic){
$request->validated();
$blogLabelLogic->add_blog_label();
//TODO::写入日志
$this->response('success');
}
/**
* @name :编辑标签
* @return void
* @author :liyuhang
* @method
*/
public function edit(BlogLabelRequest $request,BlogLabelLogic $blogLabelLogic){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$blogLabelLogic->edit_blog_label();
//TODO::写入日志
$this->response('success');
}
/**
* @name :编辑标签状态/排序
* @return void
* @author :liyuhang
* @method
*/
public function status(Request $request,BlogLabelLogic $blogLabelLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$blogLabelLogic->edit_blog_label();
//TODO::写入日志
$this->response('success');
}
/**
* @name :删除标签(批量删除)
* @return void
* @author :liyuhang
* @method
*/
public function del(Request $request,BlogLabelLogic $blogLabelLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$blogLabelLogic->del_blog_label();
$this->response('success');
}
}
... ...
... ... @@ -3,15 +3,13 @@
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Models\Project;
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;
/***
* 当前为公共类 所有方法均不需要验证登录token
*/
... ... @@ -25,8 +23,8 @@ class ComController extends BaseController
*/
public function login(Request $request){
$request->validate([
'mobile'=>['required,string,max:12'],
'password'=>['required,string'],
'mobile'=>['required'],
'password'=>['required'],
],[
'mobile.required'=>'标题必须填写',
'mobile.string'=>'标题中含有非法文字',
... ... @@ -73,8 +71,7 @@ class ComController extends BaseController
* @author :liyuhang
* @method
*/
public function get_project(){
$projectModel = new ProjectModel();
public function get_project(ProjectModel $projectModel){
$info = $projectModel->read(['id'=>$this->user['project_id']]);
if(empty($info)){
$this->response('error',Code::USER_ERROR);
... ... @@ -90,14 +87,11 @@ class ComController extends BaseController
*/
public function edit_info(Request $request){
$request->validate([
'password'=>['required,string,min:5'],
'name'=>['required,max:20'],
'password'=>['required'],
'name'=>['required'],
],[
'password.required'=>'密码必须填写',
'password.string'=>'密码中含有非法文字',
'password.min' => '密码不小于5字符.',
'name.required'=>'名称必须填写',
'name.min' => '名称不小于5字符.',
]);
$userModel = new UserModel();
$this->param['id'] = $this->uid;
... ... @@ -121,4 +115,5 @@ class ComController extends BaseController
}
$this->response('success');
}
}
... ...
<?php
namespace App\Http\Controllers\Bside;
use App\Helper\Arr;
use App\Http\Logic\Bside\DeptLogic;
use App\Http\Requests\Bside\DeptRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class DeptController
* @package App\Http\Controllers\Bside
* @author zbj
* @date 2023/4/18
*/
class DeptController extends BaseController
{
public function index(DeptLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'pid', 'title'],0);
return $this->success(Arr::listToTree($data));
}
public function info(Request $request, DeptLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'pid', 'title', 'manager_uids', 'remark']));
}
public function save(DeptRequest $request, DeptLogic $logic)
{
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, DeptLogic $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;
use App\Services\Facades\Upload;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class FileController extends BaseController
{
/**
* 上传
* @param Request $request
* @return \Illuminate\Http\JsonResponse
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
* @author zbj
* @date 2023/4/20
*/
public function upload(Request $request){
// 上传文件
$files = Upload::puts('files', $this->param['config']);
foreach ($files as &$file){
$file = Upload::path2url($file);
}
return $this->success($files);
}
/**
* 下载
* @param Request $request
* @return \Symfony\Component\HttpFoundation\StreamedResponse
* @author zbj
* @date 2023/4/20
*/
public function download(Request $request){
$path = Upload::url2path($this->param['url']);
return Storage::disk('upload')->download($path);
}
}
... ...
<?php
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\MailLogic;
use App\Models\Mail as MailModel;
use App\Models\MailUser as MailUserModel;
use Illuminate\Http\Request;
class MailController extends BaseController
{
const STATUS_ZERO = 0; //状态为未读状态
const STATUS_ONE = 1; //状态为已读状态
/**
* @name :当前用户站内信列表
* @return void
* @author :liyuhang
* @method
*/
public function lists(){
$mailModel = new MailModel();
//获取当前用户下的所有站内信
$this->map['user_list'] = ['like','%,'.$this->uid.',%'];
$this->map['status'] = $this::STATUS_ZERO;
$lists = $mailModel->lists($this->map,$this->page,$this->row);
if(!empty($lists['list'])){
foreach ($lists['list'] as $k => $v){
$mailUserModel = new MailUserModel();
//获取用户已读还是未读
$info = $mailUserModel->read(['mail_id'=>$v['id'],'user_id'=>$this->uid]);
if($info !== false){
$v['read_status'] = $this::STATUS_ONE;//
}else{
$v['read_status'] = $this::STATUS_ZERO;
}
$lists['list'][$k] = $v;
}
}
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :获取站内信详情
* @return void
* @author :liyuhang
* @method
*/
public function info(Request $request,MailLogic $mailLogic){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$info = $mailLogic->mail_info();
$this->response('success',Code::SUCCESS,$info);
}
}
... ...
<?php
namespace App\Http\Controllers\Bside\News;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\News\NewsCategoryLogic;
use App\Http\Requests\Bside\News\NewsCategoryRequest;
use App\Models\News\NewsCategory as NewsCategoryModel;
use Illuminate\Http\Request;
class NewsCategoryController extends BaseController
{
/**
* @name :新闻分类列表
* @return json
* @author :liyuhang
* @method
*/
public function lists(NewsCategoryModel $newsCategory){
//搜索条件
$this->map['project_id'] = $this->user['project_id'];
$lists = $newsCategory->lists($this->map,$this->page,$this->row,'sort');
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :获取当前分类详情
* @return void
* @author :liyuhang
* @method
*/
public function info(Request $request,NewsCategoryLogic $newsCategoryLogic){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$info = $newsCategoryLogic->info_news_category();
$this->response('success',Code::SUCCESS,$info);
}
/**
* @name :添加分类
* @return json
* @author :liyuhang
* @method
*/
public function add(NewsCategoryRequest $request,NewsCategoryLogic $newsCategoryLogic){
$request->validated();
//添加时,验证分类上级分类是否有,有则更新到当前分类中,没有时直接添加
$newsCategoryLogic->add_news_category();
//TODO::写入日志
$this->response('success',Code::SUCCESS,[]);
}
/**
* @name :编辑分类
* @return void
* @author :liyuhang
* @method
*/
public function edit(NewsCategoryRequest $request,NewsCategoryLogic $newsCategoryLogic){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$newsCategoryLogic->edit_news_category();
//TODO::写入日志
$this->response('success');
}
/**
* @name :编辑状态/排序
* @return void
* @author :liyuhang
* @method
*/
public function status(Request $request,NewsCategoryLogic $newsCategoryLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$newsCategoryLogic->status_news_category();
$this->response('success');
}
/**
* @name :删除分类
* @return void
* @author :liyuhang
* @method
*/
public function del(Request $request,NewsCategoryLogic $newsCategoryLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$newsCategoryLogic->del_news_category();
$this->response('success');
}
}
... ...
<?php
namespace App\Http\Controllers\Bside\News;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\News\NewsLogic;
use App\Http\Requests\Bside\News\NewsRequest;
use App\Models\News\News as NewsModel;
use App\Models\News\NewsCategory as NewsCategoryModel;
use Illuminate\Http\Request;
/**
* @name:新闻管理
*/
class NewsController extends BaseController
{
/**
* @name :获取新闻列表
* @return json
* @author :liyuhang
* @method
*/
public function lists(NewsModel $news){
$this->map['project_id'] = $this->user['project_id'];
$lists = $news->lists($this->map,$this->page,$this->row,$this->order);
if(!empty($lists['list'])){
foreach ($lists['list'] as $k => $v){
$newsCategoryModel= new NewsCategoryModel();
//获取用户已读还是未读
$category_info = $newsCategoryModel->
list(['id'=>['in',explode(',',trim($v['category_id'],','))]],'id',['name']);
$str = '';
foreach ($category_info as $v1){
$str .= $v1['name'].',';
}
$v['category_id'] = trim($str,',');
$lists['list'][$k] = $v;
}
}
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :添加新闻时获取分类列表
* @return void
* @author :liyuhang
* @method
*/
public function get_category_list(NewsLogic $newsLogic){
$list = $newsLogic->news_get_category_list();
$this->response('success',Code::SUCCESS,$list);
}
/**
* @name :获取详情
* @return void
* @author :liyuhang
* @method
*/
public function info(Request $request,NewsLogic $newsLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$info = $newsLogic->news_info();
//TODO::清空相关资源
$this->response('success',Code::SUCCESS,$info);
}
/**
* @name :添加新闻
* @return json
* @author :liyuhang
* @method
*/
public function add(NewsRequest $newsRequest,NewsLogic $newsLogic){
$newsRequest->validated();
$newsLogic->news_add();
//TODO::写入日志
$this->response('success');
}
/**
* @name :编辑
* @return void
* @author :liyuhang
* @method
*/
public function edit(NewsRequest $newsRequest,NewsLogic $newsLogic){
$newsRequest->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$newsLogic->news_edit();
//TODO::写入日志
$this->response('success',Code::SUCCESS);
}
/**
* @name :编辑状态/与排序
* @return void
* @author :liyuhang
* @method
*/
public function status(Request $request,NewsLogic $newsLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$newsLogic->news_status();
//TODO::写入日志
$this->response('success');
}
/**
* @name :删除新闻(逻辑删除)
* @return void
* @author :liyuhang
* @method
*/
public function del(Request $request,NewsLogic $newsLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$newsLogic->news_del();
//TODO::清空相关资源/写入日志
$this->response('success');
}
/**
* @name :ai生成
* @return void
* @author :liyuhang
* @method
*/
public function ai_news(Request $request){
# id, key, scene, ai
$request->validate([
'keywords'=>['required'],
'key'=>['required']
],[
'keywords.required' => '关键字不能为空',
'key.required' => '场景不能为空',
]);
#TODO 通过key获取到ai指令对象
$url = 'v2/openai_chat';
$data = $this->send_openai_msg($url);
$this->response('success',Code::SUCCESS,$data);
}
}
... ...
... ... @@ -56,6 +56,4 @@ class CategoryController extends BaseController
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
//todo Ai生成 关键词和描述
}
... ...
... ... @@ -2,6 +2,8 @@
namespace App\Http\Controllers\Bside\Product;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use App\Helper\Arr;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\ProductLogic;
... ... @@ -13,7 +15,7 @@ use Illuminate\Http\Request;
* Class ProductController
* @package App\Http\Controllers\Bside
* @author zbj
* @date 2023/4/12
* @date 2023/4/17
*/
class ProductController extends BaseController
{
... ... @@ -24,9 +26,12 @@ class ProductController extends BaseController
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
if(!empty($this->param['created_at'])){
$map[] = ['created_at', 'between', $this->param['created_at']];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status','created_at'],0);
return $this->success(Arr::listToTree($data));
$data = $logic->getList($map, $sort, ['id', 'title', 'thumb', 'category_id', 'keywords', 'status', 'created_at', 'updated_at']);
return $this->success($data);
}
public function info(Request $request, ProductLogic $logic){
... ... @@ -36,11 +41,15 @@ class ProductController extends BaseController
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status']));
return $this->success(Arr::twoKeepKeys($data, ['id', 'title', 'gallery', 'attrs', 'category_id', 'keywords', 'intro', 'content',
'describe', 'seo_mate', 'related_product_id', 'status']));
}
public function save(ProductRequest $request, ProductLogic $logic)
{
//封面取第一个图片
$this->param['thumb'] = $this->param['gallery'][0] ?? '';
$data = $logic->save($this->param);
return $this->success($data);
}
... ... @@ -57,5 +66,4 @@ class ProductController extends BaseController
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 ProductController extends BaseController
{
/**
* @name : 产品列表
* @return void
* @author :liyuhang
* @method
*/
public function lists(){
//获取当前登录用户下的产品列表
$this->map['project_id'] = $this->user['project_id'];
$productModel = new ProductModel();
$lists = $productModel->lists($this->map,$this->p,$this->row,$this->order);
$this->allCount = $productModel->allCount;
$this->response('success',Code::SUCCESS, $lists);
}
/**
* @name :添加产品
* @return void
* @author :liyuhang
* @method
*/
public function add(){
//参数验证
$rules = [
'name'=>'required|max:11',
'image'=>'required',
'describe'=>'required',
'keywords'=>'required|max:50',
];
//验证的提示信息
$message = [
'name.required'=>'名称必须填写',
'name.max' => '名称不大于16字符.',
'image.required'=>'图片必须上传',
'describe.required'=>'描述必须填写',
'keywords.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'];
$productModel = new ProductModel();
$this->param['image'] = $this->uploads();
$rs = $productModel->add($this->param);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success',Code::SUCCESS);
}
public function edit(){
//参数验证
$rules = [
'name'=>'required|max:11',
'image'=>'required',
'describe'=>'required',
'keywords'=>'required|max:50',
];
//验证的提示信息
$message = [
'name.required'=>'名称必须填写',
'name.max' => '名称不大于16字符.',
'image.required'=>'图片必须上传',
'describe.required'=>'描述必须填写',
'keywords.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();
}
$productModel = new ProductModel();
$rs = $productModel->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);
}
$productModel = new ProductModel();
$rs = $productModel->edit(['status'=>$this->param['status']],['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);
}
$productModel = new ProductModel();
$info = $productModel->read(['id'=>$this->param['id']],['image']);
//TODO::删除添加的图片
shell_exec('rm -rf '.request()->path().'../../'.$info['image']);
$rs = $productModel->del(['id'=>$this->param['id']]);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success',Code::SUCCESS);
}
}
... ... @@ -2,8 +2,13 @@
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\ProjectGroupLogic;
use App\Http\Requests\Bside\ProjectGroupRequest;
use App\Models\ProjectGroup as ProjectGroupModel;
use App\Models\User as UserModel;
use Illuminate\Http\Request;
/**
* @name:用户组相关
... ... @@ -16,12 +21,43 @@ class ProjectGroupController extends BaseController
* @author :liyuhang
* @method
*/
public function lists()
public function lists(ProjectGroupModel $projectGroupModel)
{
$lists = $projectGroupModel->lists($this->map,$this->page,$this->row);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :详情
* @return json
* @author :liyuhang
* @method
*/
public function info(Request $request,ProjectGroupModel $projectGroupModel){
$request->validate([
'id'=>['required', new Ids()],
],[
'id.required' => 'ID不能为空',
]);
$rs = $projectGroupModel->read($this->param);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success');
}
/**
* @name:添加用户组获取用户列表
* @return void
* @author :liyuhang
* @method
*/
public function get_user_lists(UserModel $userModel){
$this->map['project_id'] = $this->user['project_id'];
//获取当前项目下的所有用户
$lists = $userModel->list($this->map);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @param ProjectGroupRequest $request
* @param ProjectGroupLogic $logic
* @name : 添加用户组
... ... @@ -29,8 +65,18 @@ class ProjectGroupController extends BaseController
* @author :liyuhang
* @method
*/
public function add(ProjectGroupRequest $request){
public function add(ProjectGroupRequest $request,ProjectGroupModel $projectGroupModel){
$request->validated();
$this->param['project_id'] = $this->user['project_id'];
//TODO::成员列表:user_list
if(!isset($this->param['user_list']) || empty($this->param['user_list'])){
$this->param['user_list'] = $this->uid;
}
$this->param['admin_id'] = $this->uid;
$rs = $projectGroupModel->add($this->param);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success');
}
... ... @@ -42,8 +88,16 @@ class ProjectGroupController extends BaseController
* @author :liyuhang
* @method
*/
public function edit(ProjectGroupRequest $request){
$request->validated();
public function edit(ProjectGroupRequest $request,ProjectGroupModel $projectGroupModel){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$rs = $projectGroupModel->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success');
}
... ... @@ -53,7 +107,16 @@ class ProjectGroupController extends BaseController
* @author :liyuhang
* @method
*/
public function del(){
public function del(Request $request,ProjectGroupModel $projectGroupModel){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$rs = $projectGroupModel->del($this->param);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
$this->response('success');
}
}
... ...
... ... @@ -3,18 +3,17 @@
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\RoleLogic;
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
{
/**
* @name :用户角色列表()
* @return void
* @return json
* @author :liyuhang
* @method
*/
... ... @@ -24,32 +23,44 @@ class ProjectRoleController extends BaseController
$this->map['status'] = 0;
$this->map['project_id'] = $this->user['project_id'];
//获取当前登录用户自己的菜单栏
$lists = $projectRoleModel->lists($this->map,$this->p,$this->row,$this->order);
$lists = $projectRoleModel->lists($this->map,$this->page,$this->row,$this->order);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @name :添加/编辑角色时获取菜单列表
* @name :根据角色获取会员列表
* @return void
* @author :liyuhang
* @method
*/
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;
public function get_user_list(){
$userModel = new UserModel();
$list = $userModel->list(['role_id'=>$this->param['id']],'id',['id','name','mobile']);
$this->response('success',Code::SUCCESS,$list);
}
/**
* @name :详情
* @return json
* @author :liyuhang
* @method
*/
public function info(Request $request,RoleLogic $roleLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$info = $roleLogic->role_info();
$this->response('success',Code::SUCCESS,$info);
}
/**
* @name :添加/编辑角色时获取菜单列表
* @return void
* @author :liyuhang
* @method
*/
public function get_role_menu(RoleLogic $roleLogic){
$menu = $roleLogic->role_get_menu();
$this->response('当前用户菜单列表',Code::SUCCESS,$menu);
}
/**
... ... @@ -58,20 +69,9 @@ class ProjectRoleController extends BaseController
* @author :liyuhang
* @method
*/
public function add(ProjectRoleRequest $request){
public function add(ProjectRoleRequest $request,RoleLogic $roleLogic){
$request->validated();
$this->param['project_id'] = $this->user['project_id'];
//获取当前项目下的角色超级管理员
$projectRoleModel = new ProjectRoleModel();
//验证当前角色是否存在
$info = $projectRoleModel->read(['name'=>$this->param['name']]);
if(!empty($info)){
$this->response('当前添加的角色已存在',Code::USER_PARAMS_ERROE);
}
$rs = $projectRoleModel->add($this->param);
if($rs === false){
$this->response('添加失败',Code::USER_PARAMS_ERROE);
}
$roleLogic->role_add();
$this->response('添加成功');
}
... ... @@ -81,24 +81,14 @@ class ProjectRoleController extends BaseController
* @author :liyuhang
* @method
*/
public function edit(ProjectRoleRequest $request){
public function edit(ProjectRoleRequest $request,RoleLogic $roleLogic){
$request->validate([
'id'=>['required']
],[
'id.required' => 'ID不能为空'
]);
$projectRoleModel = new ProjectRoleModel();
//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);
}
$rs = $projectRoleModel->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->response('编辑失败',Code::USER_PARAMS_ERROE);
}
$this->response('编辑成功',Code::SUCCESS);
$roleLogic->role_edit();
$this->response('编辑成功');
}
/**
... ... @@ -107,20 +97,14 @@ class ProjectRoleController extends BaseController
* @author :liyuhang
* @method
*/
public function status(Request $request){
public function status(Request $request,RoleLogic $roleLogic){
$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){
$this->response('编辑失败',Code::USER_PARAMS_ERROE);
}
$this->response($this->param['status'] == 0 ? '启用成功' : '禁用成功',Code::SUCCESS);
$roleLogic->role_status();
$this->response($this->param['status'] == 0 ? '启用成功' : '禁用成功');
}
/**
... ... @@ -129,23 +113,13 @@ class ProjectRoleController extends BaseController
* @author :liyuhang
* @method
*/
public function del(Request $request){
public function del(Request $request,RoleLogic $roleLogic){
$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);
}
$roleLogic->role_del();
$this->response('success');
}
}
... ...
... ... @@ -3,9 +3,9 @@
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 App\Rules\Ids;
use Illuminate\Http\Request;
class UserController extends BaseController
... ... @@ -16,15 +16,14 @@ class UserController extends BaseController
* @author :liyuhang
* @method
*/
public function lists(){
public function lists(UserModel $userModel){
//TODO::搜索参数处理
$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']);
$lists = $userModel->lists($this->map,$this->page,$this->row,$this->order,['id','name','mobile','created_at']);
if(empty($lists)){
$this->response('请求失败',Code::USER_ERROR,[]);
$this->response('error',Code::USER_ERROR,[]);
}
$this->response('列表',Code::SUCCESS,$lists);
$this->response('success',Code::SUCCESS,$lists);
}
/**
... ... @@ -33,15 +32,10 @@ class UserController extends BaseController
* @author :liyuhang
* @method
*/
public function add(UserRequest $request){
public function add(UserRequest $request,UserLogic $userLogic){
$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,[]);
}
$this->response('添加成功',Code::SUCCESS,[]);
$userLogic->user_add();
$this->response('success');
}
/**
... ... @@ -50,23 +44,14 @@ class UserController extends BaseController
* @author :liyuhang
* @method
*/
public function edit(UserRequest $request){
public function edit(UserRequest $request,UserLogic $userLogic){
$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);
}
$rs = $userModel->edits($this->param);
if($rs === false){
$this->response('参数错误或其他服务器原因,编辑失败',Code::USER_ERROR,[]);
}
$this->response('编辑成功',Code::SUCCESS,[]);
$userLogic->user_edit();
$this->response('success');
}
/**
... ... @@ -75,38 +60,44 @@ class UserController extends BaseController
* @author :liyuhang
* @method
*/
public function status(Request $request){
public function status(Request $request,UserLogic $userLogic){
$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);
}
$userLogic->user_status();
$this->response($this->param['status'] == 0 ? '启用成功' : '禁用成功');
}
/**
* @name :删除管理员
* @return void
* @name :详情
* @return json
* @author :liyuhang
* @method
*/
public function del(Request $request){
public function info(Request $request,UserLogic $userLogic){
$request->validate([
'id'=>['required', new Ids()],
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$userModel = new UserModel();
$rs = $userModel->del($this->param);
if($rs === false){
$this->response('删除失败',Code::USER_ERROR);
$userLogic->user_info();
$this->response('success');
}
$this->response('删除成功');
/**
* @name :删除管理员
* @return json
* @author :liyuhang
* @method
*/
public function del(Request $request,UserLogic $userLogic){
$request->validate([
'id'=>['required'],
],[
'id.required' => 'ID不能为空',
]);
$userLogic->user_del();
$this->response('success');
}
}
... ...
<?php
namespace App\Http\Controllers;
use App\Enums\Common\Code;
use App\Models\Image as ImageModel;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Intervention\Image\Facades\Image;
class ImageController
{
public $upload_img = [
//验证
'rule' => [
'size' => 3 * 1024 * 1024, //大小限制
'ext' => 'jpeg,jpg,png,gif', //文件类型限制
],
//生成文件规则
'savename' => 'uniqid',
//设置静态缓存参数(304)
'header' => [
'Cache-Control' => 'max-age=2592000',
'Pragma' => 'cache',
'Expires' => "%Expires%", // cache 1 month
'etag' => "%etag%",
'Last-Modified' => "%Last-Modified%",
'Content-Description' => 'File Transfer',
],
//图片保存根路径
'path' => './uploads/images/',
//图片上传变量名
'name' => 'image',
];
public $request = '';
public function __construct(Request $request)
{
$this->request = $request;
}
public function index($hash = '', $w = 0 ,$h = 0){
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
header("HTTP/1.1 304 Not Modified");
exit;
}
$imageModel = new ImageModel();
$info = $imageModel->read(['hash'=>$hash]);
if ($info === false) {
$this->response('指定图片不存在!', 404);
}
//查看缩略图是否存在
$filename = './../uploads/images/cache_'. $info['hash'] . $w . '_' . $h;
if(is_file($filename)){
$last_modified_time = gmdate(time() + ((30 * 60 * 60 * 24))) . " GMT";
$header = str_replace(['%Expires%', "%etag%", '%Last-Modified%'],
[$last_modified_time, $hash . ':' . $w . '_' . $h . '_' . 2, $last_modified_time], $this->upload_img['header']);
$content = file_get_contents($filename);
$header['Content-Length'] = $info['size'];
return response($content, 200, $header);
}
$path = './../'.$info['path'];
if (!is_file($path)) {
$this->response('指定图片已被系统删除!', 404);
}
$content = '';
$last_modified_time = gmdate(time() + ((30 * 60 * 60 * 24))) . " GMT";
$header = str_replace(['%Expires%', "%etag%", '%Last-Modified%'],
[$last_modified_time, $hash . ':' . $w . '_' . $h . '_' . 2, $last_modified_time], $this->upload_img['header']);
if ($w > 0 && $h > 0) {
$path = $this->cacheImage($info, $w, $h);
$content = file_get_contents($path);
$header['Content-Length'] = strlen($content);
} else {
$content = file_get_contents($path);
$header['Content-Length'] = $info['size'];
}
$img_type = $info['type'];
$content = base64_encode($content);
$img_base64 = 'data:image/' . $img_type . ';base64,' . $content;
return response($img_base64, 200, $header);
}
/**
* 图片上传
*/
public function upload() {
$this->request->validate([
'image'=>['required'],
],[
'image.required'=>'图片必须填写',
]);
$files = $this->request->file('image');
if (empty($files)) {
$this->response('没有上传的文件!', 400);
}
$type = $this->request->post('type', 'single');
if ($type == 'multi') {
return $this->multi($files);
} else {
return $this->single($files);
}
}
/**
* @name :上传图片
* @return void
* @author :liyuhang
* @method
*/
public function single($files){
if (is_array($files)) {
$file = current($files);
}
$url = './../uploads/images/';
$filename = date('ymdHis').rand(10000,99999);
$res = $files->move($url,$filename);
if ($res === false) {
return $this->fail($files->getError(), 400);
}
$data = [
'path' => $url.$filename,
'created_at' => date('Y-m-d H:i:s',time()),
'size' => $res->getSize(),
'hash' => $files->hashName(),
'mime'=>$files->extension()
];
$imageModel = new ImageModel();
$imageModel->add($data);
return $data['hash'];
}
/**
* 生成缩略图缓存
* @param type $info
* @param type $w
* @param type $h
* @return string
*/
private function cacheImage($info, $w, $h) {
$path = './../'.$info['path'];
$filename = './../uploads/images/cache_'. $info['hash'] . $w . '_' . $h;
Image::make($path)->resize($w, $h)->save($filename);
return $filename;
}
/**
* @name 统一返回参数
* @return JsonResponse
* @author :liyuhang
* @method
*/
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->description : $msg,
'code' => $code->value,
'data' => $this->_extents($data),
];
$this->header['Content-Type'] = $type;
$this->header['token'] = $this->token;
$response = response($result,$result_code,$this->header);;
throw new HttpResponseException($response);
}
}
... ...
... ... @@ -2,15 +2,16 @@
namespace App\Http\Logic\Aside;
class DemoLogic extends BaseLogic
use App\Http\Logic\Aside\BaseLogic;
use App\Models\AiCommand as AiCommandModel;
class AiCommandLogic extends BaseLogic
{
protected $requestAll;
public function __construct()
{
$this->requestAll=request()->all();
}
public function testLogic():array
{
return $this->success($this->requestAll);
parent::__construct();
$this->model = new AiCommandModel();
}
}
... ...
... ... @@ -2,35 +2,24 @@
namespace App\Http\Logic\Aside;
use App\Enums\Common\Code;
use App\Exceptions\AsideGlobalException;
use App\Enums\Common\Common;
use App\Http\Logic\Logic;
/**
* @notes: 逻辑层基类 控制器调用 统一返回 统一抛出异常
* Class BaseLogic
* @package App\Http\Logic\Aside
*/
class BaseLogic
class BaseLogic extends Logic
{
protected $requestAll;
public function __construct()
{
$this->requestAll=request()->all();
}
/**
* @notes: 统一格式化分页返回
* @return array
*/
function getPageData($pagninate): array
{
$p = $pagninate->toArray();
$result['list'] = $p ['data'];
$result['pager']['total'] = $p ['total'];
$result['pager']['page'] = $p ['current_page'];
$result['pager']['pagesize'] = $p ['per_page'];
protected $side = Common::A;
return $result;
public function __construct()
{
$this->requestAll = request()->all();
}
}
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Helper\Arr;
use App\Models\Manage\Dept;
use Illuminate\Database\Eloquent\Model;
/**
* Class DeptLogic
* @package App\Http\Logic\Aside\dept
* @author zbj
* @date 2023/4/20
*/
class DeptLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Dept();
}
public function save($param){
if(!empty($param['pid'])){
if(!empty($param['id']) && $param['pid'] == $param['id']){
$this->fail('上级部门不能是本部门');
}
$p_cate = $this->getCacheInfo($param['pid']);
if(!$p_cate){
$this->fail('上级部门不存在');
}
}
return parent::save($param);
}
public function delete($ids, $map = []){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//是否有子部门
if(Dept::where('pid', $id)->count()){
$this->fail("部门{$info['title']}存在下级部门,不能删除");
}
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Helper\Arr;
use App\Models\Manage\Group;
/**
* Class GroupLogic
* @package App\Http\Logic\Aside
* @author zbj
* @date 2023/4/19
*/
class GroupLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Group();
}
}
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Models\Manage\Manage;
use App\Models\Manage\LoginLog;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Session;
/**
* Class LoginLogic
* @package App\Http\Logic\Aside
* @author zbj
* @date 2023/4/19
*/
class LoginLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Manage();
}
public function login()
{
$manage = $this->model->where('mobile', $this->requestAll['mobile'])->first();
if (!$manage){
$this->fail('登录用户名不存在');
}
if (Manage::STATUS_DISABLE == $manage->status) {
$this->fail('帐号已被禁用');
}
if (!Hash::check($this->requestAll['password'], $manage->password)) {
$this->fail('登录密码不正确');
}
Session::put('manage', $manage->toArray());
LoginLog::addLog($manage->id);
return $this->success();
}
public function logout(){
Session::forget('manage');
return redirect(route('admin.login'));
}
}
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Helper\Arr;
use App\Models\Manage\Manage;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Hash;
/**
* Class ManageLogic
* @package App\Http\Logic\Aside\Manage
* @author zbj
* @date 2023/4/20
*/
class ManageLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Manage();
}
public function save($param){
if(!empty($param['password'])){
$param['password'] = Hash::make($param['password']);
}
return parent::save($param);
}
}
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Helper\Arr;
use App\Models\Manage\Menu;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Str;
/**
* Class MenuLogic
* @package App\Http\Logic\Aside
* @author zbj
* @date 2023/4/19
*/
class MenuLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Menu();
}
public function getInfo($id)
{
$info = parent::getInfo($id);
//已绑定菜单的路由
$menu_route = array_filter(Menu::pluck('route_name')->toArray());
//路由
$info['route'] = [];
$routes = Route::getRoutes()->getRoutesByName();
foreach ($routes as $name => $route) {
if(Str::startsWith($name, 'admin.') && !Str::endsWith($name, '.white') && !in_array($name, $menu_route)){
$info['route'][] = $name;
}
}
return $this->success($info);
}
public function save($param){
if(!empty($param['pid'])){
if(!empty($param['id']) && $param['pid'] == $param['id']){
$this->fail('上级菜单不能是本菜单');
}
$p_menu = $this->getCacheInfo($param['pid']);
if(!$p_menu){
$this->fail('上级菜单不存在');
}
}
return parent::save($param);
}
public function delete($ids, $map = []){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//是否有子菜单
if(Menu::where('pid', $id)->count()){
$this->fail("菜单{$info['title']}存在子菜单,不能删除");
}
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Models\Project;
class ProjectLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Project();
$this->param = $this->requestAll;
}
}
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Models\ProjectRole;
class ProjectRoleLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new ProjectRole();
$this->param = $this->requestAll;
}
}
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Models\User;
class UserLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new User();
$this->param = $this->requestAll;
}
}
... ...
... ... @@ -4,44 +4,28 @@ namespace App\Http\Logic\Bside;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use App\Helper\Arr;
use App\Http\Logic\Logic;
use App\Models\Image as ImageModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
/**
* @notes: 逻辑层基类 控制器调用 统一返回 统一抛出异常
*/
class BaseLogic
class BaseLogic extends Logic
{
protected $model;
protected $requestAll;
protected $is_cache = true; //是否缓存数据
protected $param;
protected $user;
public function __construct()
{
$this->requestAll = request()->all();
}
/**
* @notes: 请简要描述方法功能
* @param array $data
* @return array
*/
public function success(array $data = [])
{
return $data;
}
/**
* @notes: 错误抛出
* @param string $code
* @param string $message
* @throws BsideGlobalException
*/
public function fail(string $message = "", string $code = Code::SYSTEM_ERROR)
{
throw new BsideGlobalException($code, $message);
$this->user = Cache::get(request()->header('token'));
}
... ... @@ -57,41 +41,8 @@ class BaseLogic
*/
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());
$map[] = ['project_id' => $this->user['project_id']];
return parent::getList($map, $sort, $columns, $limit);
}
/**
... ... @@ -100,17 +51,11 @@ class BaseLogic
* @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);
public function getCacheInfo($id)
{
$info = parent::getCacheInfo($id);
if ($info && $info['project_id'] != $this->user['project_id']) {
$info = null;
}
return $info;
}
... ... @@ -123,175 +68,53 @@ class BaseLogic
* @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('保存失败');
}
public function save($param)
{
$param['project_id'] = $this->user['project_id'];
return parent::save($param);
}
/**
* 批量删除
* @param $ids
* @param array $map
* @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;
public function delete($ids, $map = [])
{
$map[] = ['project_id' => $this->user['project_id']];
return parent::delete($ids, $map);
}
/**
* 格式化查询条件
* @param $map
* @param $query
* @return mixed
* @author zbj
* @date 2023/4/13
* @name :上传图片
* @return void
* @author :liyuhang
* @method
*/
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;
public function upload(Request $request,ImageModel $imageModel){
$image = $request->file('image');
if(empty($image)){
return $this->fail('没有上传图片',Code::USER_ERROR);
}
$url = './../uploads/images/';
$filename = date('ymdHis').rand(10000,99999);
$res = $request->file('image')->move($url,$filename);
if ($res === false) {
return $this->fail($image->getError(), Code::USER_ERROR);
}
$data = [
'path' => $url.$filename,
'created_at' => date('Y-m-d H:i:s',time()),
'size' => $res->getSize(),
'hash' => $image->hashName(),
'mime'=>$image->extension()
];
$rs = $imageModel->add($data);
if ($rs === false) {
return $this->fail('添加失败', Code::USER_ERROR);
}
return $data['hash'];
}
}
... ...
<?php
namespace App\Http\Logic\Bside\Blog;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Blog\BlogCategory as BlogCategoryModel;
use App\Models\Blog\Blog as BlogModel;
use App\Models\News\NewsCategory as NewsCategoryModel;
use Illuminate\Support\Facades\DB;
class BlogCategoryLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new BlogCategoryModel();
$this->param = $this->requestAll;
}
/**
* @name :添加时验证上级分类是否有商品,有则替换带当前分类下
* @return void
* @author :liyuhang
* @method
*/
public function add_blog_category(){
DB::beginTransaction();
$this->param['project_id'] = $this->user['project_id'];
$this->param['operator_id'] = $this->user['id'];
$this->param['create_id'] = $this->user['id'];
$this->param['created_at'] = date('Y-m-d H:i:s');
$this->param['updated_at'] = date('Y-m-d H:i:s');
$cate_id = $this->model->insertGetId($this->param);
if($cate_id === false){
DB::rollBack();
$this->fail('error',Code::USER_ERROR);
}
//判断为子分类时
if(isset($this->param['pid']) && !empty($this->param['pid'])) {
//查看当前上级分类下是否有其他分类
$cate_info = $this->model->read(['pid' => $this->param['pid'], 'id' => ['!=', $cate_id]]);
if ($cate_info === false) {
//查看当前上一级分类下是否有新闻
$blogModel = new BlogModel();
$news_info = $blogModel->read(['category_id' => ['like', ',' . $this->param['pid'] . ',']]);
if ($news_info !== false) {
$replacement = ',' . $cate_id . ',';
$old = ',' . $this->param['pid'] . ',';
//更新所有商品到当前分类
$rs = DB::table('gl_Blog')->where('category_id', 'like', '%' . $old . '%')
->update(['category_id' => DB::raw("REPLACE(category_id, '$old', '$replacement')")]);
if ($rs === false) {
DB::rollBack();
$this->fail('error', Code::USER_ERROR);
}
}
}
}
DB::commit();
return $this->success();
}
/**
* @name :编辑分类
* @return void
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function edit_blog_category(){
$this->param['operator_id'] = $this->user['id'];
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :详情
* @return array
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function info_blog_category(){
$info = $this->model->read($this->param);
if($info === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success($info);
}
/**
* @name :编辑状态与排序
* @return void
* @author :liyuhang
* @method
*/
public function status_blog_category(){
$this->param['operator_id'] = $this->user['id'];
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :删除博客分类
* @return void
* @author :liyuhang
* @method
*/
public function del_blog_category(){
$this->param = $this->requestAll;
foreach ($this->param['id'] as $v){
//查询是否有子分类
$rs = $this->model->read(['pid'=>$v],['id']);
if($rs !== false){
$this->response('当前分类拥有子分类不允许删除',Code::USER_ERROR);
}
//查看当前分内下是否有博客
$blogModel = new BlogModel();
$rs = $blogModel->read(['category_id'=>$v],['id']);
if($rs !== false){
$this->response('当前分类拥有博客',Code::USER_ERROR);
}
}
$this->param['id'] = ['in',$this->param['id']];
$rs = $this->model->del($this->param);
if($rs === false){
$this->response('error',Code::USER_ERROR);
}
return $this->success();
}
}
... ...
<?php
namespace App\Http\Logic\Bside\Blog;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Blog\BlogLabel as BlogLabelModel;
class BlogLabelLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new BlogLabelModel();
$this->param = $this->requestAll;
}
/**
* @name :新增标签
* @return void
* @author :liyuhang
* @method
*/
public function add_blog_label(){
$this->param['create_id'] = $this->user['id'];
$this->param['Operator_id'] = $this->user['id'];
$this->param['project_id'] = $this->user['project_id'];
$rs = $this->model->add($this->param);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :编辑标签
* @return void
* @author :liyuhang
* @method
*/
public function edit_blog_label(){
$this->param['operator_id'] = $this->user['id'];
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
//TODO::路由映射
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :删除标签
* @return array
* @author :liyuhang
* @method
*/
public function del_blog_label(){
$this->param['id'] = ['in',$this->param['id']];
$rs = $this->model->del($this->param);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
}
... ...
<?php
namespace App\Http\Logic\Bside\Blog;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Blog\Blog;
use App\Models\Blog\BlogCategory as BlogCategoryModel;
use App\Models\RouteMap;
use Illuminate\Support\Facades\DB;
class BlogLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Blog();
$this->param = $this->requestAll;
}
/**
* @name :获取分类列表
* @return array
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function blog_get_category_list(){
$this->map['status'] = 0;
$this->map['project_id'] = $this->user['project_id'];
$blogCategoryModel = new BlogCategoryModel();
$cate_list = $blogCategoryModel->list($this->map,'sort');
if($cate_list === false){
$this->fail('error',Code::USER_ERROR);
}
$list = [];
foreach ($cate_list as $v){
$v = (array)$v;
if ($v['pid'] == 0) {
$v['sub'] = _get_child($v['id'], $cate_list);
$list[] = $v;
}
}
return $this->success($list);
}
/**
* @name :添加博客
* @return void
* @author :liyuhang
* @method
*/
public function blog_add(){
$this->param['create_id'] = $this->uid;
$this->param['operator_id'] = $this->uid;
$this->param['project_id'] = $this->user['project_id'];
DB::beginTransaction();
try {
$rs = $this->model->insertGetId($this->param);
RouteMap::setRoute($this->param['url'], RouteMap::SOURCE_BLOG, $rs, $this->user['project_id']);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('error',Code::USER_ERROR);
}
//TODO::写入日志
$this->success();
}
/**
* @name : 编辑用户
* @return void
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function blog_edit(){
$this->param['operator_id'] = $this->uid;
DB::beginTransaction();
try {
$this->model->edit($this->param,['id'=>$this->param['id']]);
RouteMap::setRoute($this->param['url'], RouteMap::SOURCE_BLOG, $this->param['id'], $this->user['project_id']);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('error',Code::USER_ERROR);
}
}
/**
* @name :获取数据详情
* @return array
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function blog_info(){
$info = $this->model->read($this->param);
//获取分类名称
$info['category_id'] = explode(',',trim($info['category_id'],','));
$blogCategoryModel = new BlogCategoryModel();
$category_list = $blogCategoryModel->list(['id'=>['in',$info['category_id']]],'id',['name']);
$str = '';
foreach ($category_list as $v){
$str .= $v['name'].',';
}
$info['category_id'] = trim($str,',');
if($info === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success($info);
}
/**
* @name :修改状态
* @return array
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function blog_status(){
$this->param['operator_id'] = $this->user['id'];
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :逻辑删除
* @return void
* @author :liyuhang
* @method
*/
public function blog_del(){
$this->param['id'] = ['in',$this->param['id']];
$rs = $this->model->edit(['status'=>2],$this->param);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
}
... ...
<?php
namespace App\Http\Logic\Bside;
use App\Helper\Arr;
use App\Models\ProjectDept;
/**
* Class DeptLogic
* @package App\Http\Logic\Bside\dept
* @author zbj
* @date 2023/4/18
*/
class DeptLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new ProjectDept();
}
public function save($param){
if(!empty($param['pid'])){
if(!empty($param['id']) && $param['pid'] == $param['id']){
$this->fail('上级部门不能是本部门');
}
$p_cate = $this->getCacheInfo($param['pid']);
if(!$p_cate){
$this->fail('上级部门不存在');
}
}
return parent::save($param);
}
public function delete($ids, $map =[]){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//是否有子部门
if(ProjectDept::where('project_id', $this->user['project_id'])->where('pid', $id)->count()){
$this->fail("部门{$info['title']}存在下级部门,不能删除");
}
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Logic\Bside;
use App\Models\ProjectGroup;
class GroupLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new ProjectGroup();
$this->param = $this->requestAll;
}
}
... ...
<?php
namespace App\Http\Logic\Bside;
use App\Enums\Common\Code;
use App\Models\Mail as MailModel;
use App\Models\MailUser as MailUserModel;
class MailLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new MailModel();
$this->param = $this->requestAll;
}
/**
* @name :详情
* @author :liyuhang
*/
public function mail_info(){
$info = $this->model->read($this->param);
if($info === false){
$this->fail('当前数据不存在',Code::USER_ERROR);
}
//生成一条阅读记录
$mailUserModel = new MailUserModel();
$data = [
'user_id'=>$info['id'],
'mail_id'=>$this->user['id'],
];
//查询当前记录是否存在
$read_info = $mailUserModel->read($data);
if($read_info === false){
$rs = $mailUserModel->add($data);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
}
return $this->success($info);
}
}
... ...
<?php
namespace App\Http\Logic\Bside\News;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\News\News as NewsModel;
use App\Models\News\NewsCategory as NewsCategoryModel;
use Illuminate\Support\Facades\DB;
class NewsCategoryLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new NewsCategoryModel();
$this->param = $this->requestAll;
}
/**
* @name :详情
* @return array
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function info_news_category(){
$info = $this->model->read($this->param);
if($info === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success($info);
}
/**
* @name :添加时验证上级分类是否有商品,有则替换带当前分类下
* @return void
* @author :liyuhang
* @method
*/
public function add_news_category(){
DB::beginTransaction();
$this->param['project_id'] = $this->user['project_id'];
$this->param['operator_id'] = $this->user['id'];
$this->param['create_id'] = $this->user['id'];
$this->param['created_at'] = date('Y-m-d H:i:s');
$this->param['updated_at'] = date('Y-m-d H:i:s');
$cate_id = $this->model->insertGetId($this->param);
if($cate_id === false){
DB::rollBack();
$this->fail('error',Code::USER_ERROR);
}
//判断为子分类时
if(isset($this->param['pid']) && !empty($this->param['pid'])) {
//查看当前上级分类下是否有其他分类
$cate_info = $this->model->read(['pid' => $this->param['pid'], 'id' => ['!=', $cate_id]]);
if ($cate_info === false) {
//查看当前上一级分类下是否有新闻
$newsModel = new NewsModel();
$news_info = $newsModel->read(['category_id' => ['like', ',' . $this->param['pid'] . ',']]);
if ($news_info !== false) {
$replacement = ',' . $cate_id . ',';
$old = ',' . $this->param['pid'] . ',';
//更新所有商品到当前分类
$rs = DB::table('gl_news')->where('category_id', 'like', '%' . $old . '%')
->update(['category_id' => DB::raw("REPLACE(category_id, '$old', '$replacement')")]);
if ($rs === false) {
DB::rollBack();
$this->fail('error', Code::USER_ERROR);
}
}
}
}
DB::commit();
return $this->success();
}
/**
* @name :编辑分类
* @return void
* @author :liyuhang
* @method
*/
public function edit_news_category(){
$this->param['operator_id'] = $this->user['id'];
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :修改状态
* @return array
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function status_news_category(){
$this->param['operator_id'] = $this->user['id'];
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :删除新闻分类
* @return array
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function del_news_category(){
$this->param = $this->requestAll;
foreach ($this->param['id'] as $v){
//查询是否有子分类
$rs = $this->model->read(['pid'=>$v],['id']);
if($rs !== false){
$this->fail('当前分类拥有子分类不允许删除',Code::USER_ERROR);
}
//查看当前分内下是否有商品
$newsModel = new NewsModel();
$rs = $newsModel->read(['category_id'=>$v],['id']);
if($rs !== false){
$this->fail('当前分类拥有商品',Code::USER_ERROR);
}
}
$this->param['id'] = ['in',$this->param['id']];
$rs = $this->model->del($this->param);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
}
... ...
<?php
namespace App\Http\Logic\Bside\News;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\News\News;
use App\Models\News\NewsCategory as NewsCategoryModel;
use App\Models\RouteMap;
use Illuminate\Support\Facades\DB;
class NewsLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new News();
$this->param = $this->requestAll;
}
/**
* @name :获取分类列表
* @return array
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function news_get_category_list(){
$this->map['status'] = 0;
$this->map['project_id'] = $this->user['project_id'];
$newsCategoryModel = new NewsCategoryModel();
$cate_list = $newsCategoryModel->list($this->map,'sort');
if($cate_list === false){
$this->fail('error',Code::USER_ERROR);
}
$list = [];
foreach ($cate_list as $v){
$v = (array)$v;
if ($v['pid'] == 0) {
$v['sub'] = _get_child($v['id'], $cate_list);
$list[] = $v;
}
}
return $this->success($list);
}
/**
* @name :添加博客
* @return void
* @author :liyuhang
* @method
*/
public function news_add(){
$this->param['create_id'] = $this->uid;
$this->param['operator_id'] = $this->uid;
$this->param['project_id'] = $this->user['project_id'];
DB::beginTransaction();
try {
if(isset($this->param['image'])){
$data = $this->upload();
$this->param['image'] = $data['path'];
}
$rs = $this->model->insertGetId($this->param);
RouteMap::setRoute($this->param['url'], RouteMap::SOURCE_NEWS, $rs, $this->user['project_id']);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('error',Code::USER_ERROR);
}
//TODO::写入日志
$this->success();
}
/**
* @name :编辑
* @return void
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function news_edit(){
$this->param['operator_id'] = $this->user['id'];
//多个分类按逗号隔开
$this->param['category_id'] = ','.$this->param['category_id'].',';
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
//TODO::写入日志
$this->success();
}
/**
* @name :修改状态
* @return void
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function news_status(){
$this->param['operator_id'] = $this->user['id'];
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
//TODO::写入日志
$this->success();
}
/**
* @name :获取详情
* @return array
* @throws \App\Exceptions\BsideGlobalException
* @author :liyuhang
* @method
*/
public function news_info(){
$this->param = $this->requestAll;
$info = $this->model->read($this->param);
//获取分类名称
$info['category_id'] = explode(',',trim($info['category_id'],','));
$newsCategoryModel = new NewsCategoryModel();
$category_list = $newsCategoryModel->list(['id'=>['in',$info['category_id']]],'id',['name']);
$str = '';
foreach ($category_list as $v){
$str .= $v['name'].',';
}
$info['category_id'] = trim($str,',');
if($info === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success($info);
}
/**
* @name :逻辑删除
* @return void
* @author :liyuhang
* @method
*/
public function news_del(){
$this->param['id'] = ['in',$this->param['id']];
$rs = $this->model->edit(['status'=>2,'operator_id'=>$this->user['id']],$this->param);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
}
... ...
... ... @@ -2,7 +2,6 @@
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;
... ... @@ -25,6 +24,9 @@ class AttrLogic extends BaseLogic
public function getInfo($id){
$info = parent::getCacheInfo($id);
if(!$info){
$this->fail('数据不存在或者已经删除');
}
$info->values;
return $this->success($info->toArray());
}
... ... @@ -62,17 +64,4 @@ class AttrLogic extends BaseLogic
}
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);
}
}
... ...
... ... @@ -5,6 +5,7 @@ namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Category;
use App\Models\Product\Product;
/**
* Class CategoryLogic
... ... @@ -26,7 +27,7 @@ class CategoryLogic extends BaseLogic
if(!empty($param['id']) && $param['pid'] == $param['id']){
$this->fail('上级分类不能是本分类');
}
$p_cate = Category::find($param['pid']);
$p_cate = $this->getCacheInfo($param['pid']);
if(!$p_cate){
$this->fail('上级分类不存在');
}
... ... @@ -34,7 +35,7 @@ class CategoryLogic extends BaseLogic
return parent::save($param);
}
public function delete($ids){
public function delete($ids, $map = []){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
... ... @@ -42,11 +43,13 @@ class CategoryLogic extends BaseLogic
continue;
}
//是否有子分类
if(Category::where('pid', $id)->count()){
if(Category::where('project_id', $this->user['project_id'])->where('pid', $id)->count()){
$this->fail("分类{$info['title']}存在子分类,不能删除");
}
//todo 是否有对应商品
//是否有对应商品
if(Product::whereRaw("FIND_IN_SET({$id},`category_id`)")->count()){
$this->fail("分类{$info['title']}存在产品,不能删除");
}
}
return parent::delete($ids);
}
... ...
... ... @@ -20,18 +20,4 @@ class DescribeLogic extends BaseLogic
$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);
}
}
... ...
... ... @@ -4,6 +4,7 @@ namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Product;
use App\Models\RouteMap;
use App\Models\Product\Keyword;
use Illuminate\Support\Facades\DB;
... ... @@ -28,7 +29,7 @@ class KeywordLogic extends BaseLogic
try {
$res = parent::save($param);
//路由映射
RouteMap::setRoute($param['title'], RouteMap::SOURCE_PRODUCT_KEYWORD, $res['id'], $param['project_id'], true);
RouteMap::setRoute($param['title'], RouteMap::SOURCE_PRODUCT_KEYWORD, $res['id'], $this->user['project_id']);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
... ... @@ -37,19 +38,24 @@ class KeywordLogic extends BaseLogic
return $this->success();
}
public function delete($ids){
public function delete($ids, $map = []){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//todo 是否有关联商品
DB::beginTransaction();
try {
parent::delete($ids);
//todo 删除路由映射 事务
foreach ($ids as $id){
//删除路由映射
RouteMap::delRoute(RouteMap::SOURCE_PRODUCT_KEYWORD, $id, $this->user['project_id']);
}
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('删除失败');
}
return parent::delete($ids);
return $this->success();
}
}
... ...
... ... @@ -5,6 +5,8 @@ namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Product;
use App\Models\RouteMap;
use Illuminate\Support\Facades\DB;
/**
* Class ProductLogic
... ... @@ -22,32 +24,39 @@ class ProductLogic extends BaseLogic
}
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);
DB::beginTransaction();
try {
$data = $param;
unset($data['route']);
$res = parent::save($data);
//路由映射
RouteMap::setRoute($param['route'], RouteMap::SOURCE_PRODUCT, $res['id'], $this->user['project_id']);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('保存失败');
}
return $this->success();
}
public function delete($ids){
public function delete($ids, $map =[]){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
DB::beginTransaction();
try {
parent::delete($ids);
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//是否有子分类
if(Product::where('pid', $id)->count()){
$this->fail("分类{$info['title']}存在子分类,不能删除");
//删除路由映射
RouteMap::delRoute(RouteMap::SOURCE_PRODUCT, $id, $this->user['project_id']);
}
//todo 是否有对应商品
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('删除失败');
}
return parent::delete($ids);
return $this->success();
}
}
... ...
<?php
namespace App\Http\Logic\Bside;
use App\Enums\Common\Code;
use App\Models\ProjectMenu as ProjectMenuModel;
use App\Models\ProjectRole as ProjectRoleModel;
use App\Models\User;
use App\Models\User as UserModel;
class RoleLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new ProjectRoleModel();
$this->param = $this->requestAll;
}
/**
* @name :添加角色
* @return void
* @author :liyuhang
* @method
*/
public function role_add(){
$this->param['create_id'] = $this->user['id'];
$this->param['operator_id'] = $this->user['id'];
$this->param['project_id'] = $this->user['project_id'];
//验证当前角色是否存在
$info = $this->model->read(['name'=>$this->param['name']]);
if($info !== false){
$this->fail('当前添加的角色已存在',Code::USER_ERROR);
}
$rs = $this->model->add($this->param);
if($rs === false){
$this->fail('添加失败',Code::USER_PARAMS_ERROE);
}
return $this->success();
}
/**
* @name :编辑角色
* @return void
* @author :liyuhang
* @method
*/
public function role_edit(){
//TODO::查询当前名称是否重复
$condition = [
'id'=>['!=',$this->param['id']],
'name'=>$this->param['name'],
'project_id'=>$this->user['project_id'],
];
$info = $this->model->read($condition);
if($info !== false){
$this->fail('当前添加的角色已存在',Code::USER_PARAMS_ERROE);
}
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('编辑失败',Code::USER_PARAMS_ERROE);
}
return $this->success();
}
/**
* @name :修改状态/排序
* @return void
* @author :liyuhang
* @method
*/
public function role_status(){
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('error',Code::USER_PARAMS_ERROE);
}
return $this->success();
}
/**
* @name :删除角色
* @return void
* @author :liyuhang
*/
public function role_del(){
//查询当前角色下是否有用户
$userModel = new UserModel();
//批量删除
foreach ($this->param['id'] as $v){
$user_info = $userModel->read(['role_id'=>$v]);
if(!empty($user_info)){
$this->fail('当前角色下有用户存在,不允许删除',Code::USER_ERROR);
}
}
$this->param['id'] = ['in',$this->param['id']];
$rs = $this->model->del($this->param);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :获取角色详情
* @return void
* @author :liyuhang
* @method
*/
public function role_info(){
$info = $this->model->read($this->param);
if($info === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success($info);
}
/**
* @name :获取菜单列表
* @return array
* @author :liyuhang
* @method
*/
public function role_get_menu(){
//根据当前登录用户角色返回用户菜单列表
$info = $this->model->read(['id'=>$this->user['role_id']]);
$info['role_menu'] = trim($info['role_menu'],',');
$menuModel = new ProjectMenuModel();
$lists = $menuModel->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'] = _get_child($v['id'], $lists);
$menu[] = $v;
}
}
return $this->success($menu);
}
}
... ...
<?php
namespace App\Http\Logic\Bside;
use App\Enums\Common\Code;
use App\Models\User;
use Illuminate\Support\Facades\DB;
class UserLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new User();
$this->param = $this->requestAll;
}
/**
* @name :添加会员
* @author :liyuhang
*/
public function user_add(){
$this->param['create_id'] = $this->user['id'];
$this->param['operator_id'] = $this->user['id'];
$this->param['project_id'] = $this->user['project_id'];
//验证当前用户是否存在
$info = $this->model->read(['mobile'=>$this->param['mobile']]);
if($info !== false){
$this->fail('error',Code::USER_ERROR);
}
//上传图片
if(isset($this->param['image'])){
$this->param['image'] = $this->upload();
}
//密码加密
$this->param['password'] = base64_encode(md5($this->param['password']));
$rs = $this->model->add($this->param);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :编辑用户
* @author :liyuhang
*/
public function user_edit(){
$condition = [
'id'=>['!=',$this->param['id']],
'mobile'=>$this->param['mobile']
];
$info = $this->model->read($condition);
if($info !== false){
$this->fail('当前编辑的手机号码已存在',Code::USER_PARAMS_ERROE);
}
$this->param['operator_id'] = $this->user['id'];
//上传图片
if(isset($this->param['image'])){
//查看当前用户是否已有头像
$info = $this->model->read(['id'=>$this->param['id']],'hash');
if($info !== false){
DB::table('gl_image')->where(['hash'=>$info['hash']])->first();
}
$this->param['image'] = $this->upload();
}
$rs = $this->model->edits($this->param);
if($rs === false){
$this->fail('参数错误或其他服务器原因,编辑失败',Code::USER_ERROR,[]);
}
return $this->success();
}
/**
* @name :编辑状态/排序
* @author :liyuhang
*/
public function user_status(){
$this->param['operator_id'] = $this->user['id'];
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
/**
* @name :用户详情
* @return void
* @author :liyuhang
* @method
*/
public function user_info(){
$info = $this->model->read($this->param);
if($info === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success($info);
}
/**
* @name :删除用户(逻辑删除)
* @return void
* @author :liyuhang
* @method
*/
public function user_del(){
$this->param['operator_id'] = $this->user['id'];
$rs = $this->model->edit(['status'=>2],['id'=>['in',$this->param['id']]]);
if($rs === false){
$this->fail('error',Code::USER_ERROR);
}
return $this->success();
}
}
... ...
<?php
namespace App\Http\Logic;
use App\Enums\Common\Code;
use App\Enums\Common\Common;
use App\Exceptions\AsideGlobalException;
use App\Exceptions\BsideGlobalException;
use App\Helper\Arr;
use Illuminate\Support\Facades\Cache;
/**
* @notes: 逻辑层基类 控制器调用 统一返回 统一抛出异常
*/
class Logic
{
protected $model;
protected $side;
protected $is_cache = true; //是否缓存数据
/**
* @notes: 请简要描述方法功能
* @param array $data
* @return array
*/
public function success(array $data = [])
{
return $data;
}
/**
* @notes: 错误抛出
* @param string $code
* @param string $message
* @throws AsideGlobalException|BsideGlobalException
*/
public function fail(string $message = "", string $code = Code::SYSTEM_ERROR)
{
if((request()->path()[0]) == Common::B){
throw new BsideGlobalException($code, $message);
}
throw new AsideGlobalException($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();
}
if($this->side == Common::A){
return $this->success($result);
}
return $this->success($result ? $result->toArray() : []);
}
/**
* 详情
* @param $id
* @return array
* @throws AsideGlobalException|BsideGlobalException
* @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|AsideGlobalException
* @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
* @param array $map
* @return array
* @throws AsideGlobalException|BsideGlobalException
* @author zbj
* @date 2023/4/13
*/
public function delete($ids, $map = []){
$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;
}
}
... ...
... ... @@ -2,8 +2,15 @@
namespace App\Http\Middleware\Aside;
use App\Enums\Common\Code;
use App\Models\Manage\Group;
use App\Models\Manage\Manage;
use App\Models\Manage\Menu;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
class LoginAuthMiddleware
{
... ... @@ -16,6 +23,33 @@ class LoginAuthMiddleware
*/
public function handle(Request $request, Closure $next)
{
$manage = Session::get('manage');
if (!$manage) {
if($request->ajax()){
return response(['status'=> Code::USER_ERROR,'msg'=>'当前用户未登录']);
}else{
return redirect(route('admin.login.white'));
}
}
//权限
$manage['id'] = 2;
$manage['gid'] = 1;
if($manage['id'] != Manage::ADMINISTRATOR_ID){ //排除超级管理员
$route = Route::getCurrentRoute()->getName();
if(!Str::endsWith($route, '.white')){ //排除白名单路由
$routes = Group::getRouteByGroupId($manage['gid']);
if(!in_array($route, $routes)){
if($request->ajax()){
return response(['status'=> Code::USER_ERROR,'msg'=>'无权限']);
}else{
return response(view('admin/no_auth'));
}
}
}
}
return $next($request);
}
}
... ...
... ... @@ -31,8 +31,7 @@ class LoginAuthMiddleware
return response(['code'=>Code::USER_ERROR,'msg'=>'当前用户未登录']);
}
// 设置数据信息
ProjectServer::useProject($info['project_id']);
// ProjectServer::useProject($info['project_id']);
//操作权限设置
$projectRoleModel = new ProjectRoleModel();
$role_info = $projectRoleModel->read(['id'=>$info['role_id']]);
... ...
<?php
namespace App\Http\Requests\Aside;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class DeptRequest
* @package App\Http\Requests\Aside\product
* @author zbj
* @date 2023/4/20
*/
class DeptRequest 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:50',
'remark'=>'max:200',
];
}
public function messages()
{
return [
'title.required' => '请输入部门名称',
'title.max' => '部门名称不能超过50个字符',
'remark.max' => '备注不能超过200个字符',
];
}
}
... ...
<?php
namespace App\Http\Requests\Aside;
use App\Models\Manage\Group;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
/**
* Class GroupRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/19
*/
class GroupRequest 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:32'],
'rights' => ['required', 'array'],
'status' => ['required', Rule::in(array_keys(Group::statusMap()))],
];
}
public function messages()
{
return [
'title.required' => '请输入权限组名称',
'title.max' => '权限组名称长度不超过32个字符',
'rights.required' => '请输入选择权限节点',
'rights.array' => '权限节点无效',
'status.required' => '请选择状态',
'status.in' => '状态值无效',
];
}
}
... ...
<?php
namespace App\Http\Requests\Aside;
use App\Models\Manage\Manage;
use App\Rules\Mobile;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
/**
* Class ManageRequest
* @package App\Http\Requests\Aside\product
* @author zbj
* @date 2023/4/20
*/
class ManageRequest 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 [
'name'=>'required|max:20',
'email'=>'email|max:64',
'mobile' => ['required', new Mobile()],
'password' => 'required|min:6',
'status' => ['required', Rule::in(array_keys(Manage::statusMap()))],
];
}
public function messages()
{
return [
'name.required' => '请输入姓名',
'name.max' => '姓名不能超过20个字符',
'email.email' => '邮箱格式不正确',
'email.max' => '邮箱不能超过64个字',
'mobile.required' => '请输入手机号',
'password.required' => '请输入密码',
'password.min' => '密码长度不能小于6位',
'status.required' => '请选择状态',
'status.in' => '状态值不正确',
];
}
}
... ...
<?php
namespace App\Http\Requests\Aside;
use App\Models\Manage\Menu;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
/**
* Class MenuRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/19
*/
class MenuRequest 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:32'],
'icon' => ['max:32'],
'route_name' => ['max:32'],
'type' => ['required', Rule::in(array_keys(Menu::typeMap()))],
'status' => ['required', Rule::in(array_keys(Menu::statusMap()))],
];
}
public function messages()
{
return [
'title.required' => '请输入菜单名称',
'title.max' => '菜单名称长度不超过32个字符',
'pid.exists' => '父菜单不存在',
'icon.max' => '图标长度不超过32个字符',
'route_name.max' => '路由长度不超过32个字符',
'type.required' => '请选择类型',
'type.in' => '类型值无效',
'status.required' => '请选择状态',
'status.in' => '状态值无效',
];
}
}
... ...
<?php
namespace App\Http\Requests\Aside;
namespace App\Http\Requests\Bside\Blog;
use App\Enums\Common\Demo;
use BenSampo\Enum\Rules\EnumValue;
use Illuminate\Foundation\Http\FormRequest;
class DemoRequest extends FormRequest
class BlogCategoryRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
... ... @@ -26,8 +24,15 @@ class DemoRequest extends FormRequest
public function rules()
{
return [
'name'=>['required'],
'status'=>['required','integer',new EnumValue(Demo::class)]
'name'=>'required|max:100',
];
}
public function messages()
{
return [
'name.required'=>'请填写名称',
'name.max'=>'名称最大100字',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\Blog;
use Illuminate\Foundation\Http\FormRequest;
class BlogLabelRequest 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 [
'name'=>'required|max:100',
];
}
public function messages()
{
return [
'name.required'=>'请填写名称',
'name.max'=>'名称最大100字',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\Blog;
use Illuminate\Foundation\Http\FormRequest;
class BlogRequest 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 [
'name'=>'required|max:100',
'remark'=>'required|max:100',
'text'=>'required|min:10',
];
}
public function messages()
{
return [
'name.required'=>'请填写名称',
'remark.required'=>'请填写简介',
'text.required'=>'内容不能为空',
'name.max'=>'名称最大100字',
'remark.max'=>'简介最大100字',
'text.max'=>'内容最小100字',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class DeptRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/18
*/
class DeptRequest 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:50',
'remark'=>'max:200',
];
}
public function messages()
{
return [
'title.required' => '请输入部门名称',
'title.max' => '部门名称不能超过50个字符',
'remark.max' => '备注不能超过200个字符',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\News;
use Illuminate\Foundation\Http\FormRequest;
class NewsCategoryRequest 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 [
'name'=>'required|max:100||unique:gl_news_category',
];
}
public function messages()
{
return [
'name.required'=>'请填写名称',
'name.max'=>'名称最大100字',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\News;
use Illuminate\Foundation\Http\FormRequest;
class NewsLabelRequest 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 [
'name'=>'required|max:100',
];
}
public function messages()
{
return [
'name.required'=>'请填写名称',
'name.max'=>'名称最大100字',
];
}
}
... ...
<?php
namespace App\Http\Requests\Bside\News;
use Illuminate\Foundation\Http\FormRequest;
class NewsRequest 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 [
'name'=>'required|max:100',
'remark'=>'required|max:100',
'text'=>'required|min:10',
];
}
public function messages()
{
return [
'name.required'=>'请填写名称',
'remark.required'=>'请填写简介',
'text.required'=>'内容不能为空',
'name.max'=>'名称最大100字',
'remark.max'=>'简介最大100字',
'text.max'=>'内容最小100字',
];
}
}
... ...
... ... @@ -19,15 +19,14 @@ class ProjectGroupRequest extends FormRequest
public function rules()
{
return [
'name' => 'required|max:255',
'name' => 'required|max:255||unique:gl_project_group',
];
}
public function messages()
{
return [
'name.required' => '请输入文章标题',
// 'body.required' => '请输入文章内容',
'name.required' => '请输入用户组名称',
];
}
}
... ...
... ... @@ -19,7 +19,7 @@ class ProjectRoleRequest extends FormRequest
public function rules()
{
return [
'name'=>'required|max:11',
'name'=>'required|max:11||unique:gl_project_role',
'role_menu'=>'required|string',
];
}
... ...
... ... @@ -24,7 +24,7 @@ class UserRequest extends FormRequest
public function rules()
{
return [
'mobile'=>'required|string|max:11',
'mobile'=>'required|string|max:11||unique:gl_project_user',
'password'=>'required|string|min:5',
'name'=>'required|max:20',
'role_id'=>'required'
... ...
... ... @@ -30,7 +30,7 @@ class AttrRequest extends FormRequest
public function rules()
{
return [
'title' => 'required|max:30',
'title' => 'required|max:50',
'remark' => 'max:200',
'values' => 'required|array'
];
... ... @@ -40,7 +40,7 @@ class AttrRequest extends FormRequest
{
return [
'title.required' => '请输入参数名称',
'title.max' => '参数名称不能超过30个字符',
'title.max' => '参数名称不能超过50个字符',
'remark.max' => '备注不能超过200个字符',
'values.required' => '请添加参数值',
'values.array' => '参数值格式异常',
... ...
... ... @@ -30,7 +30,7 @@ class CategoryRequest extends FormRequest
public function rules()
{
return [
'title'=>'required|max:20',
'title'=>'required|max:50',
'image'=>'required',
'keywords'=>'required|max:50',
'describe'=>'required|max:200',
... ... @@ -41,7 +41,7 @@ class CategoryRequest extends FormRequest
{
return [
'title.required' => '请输入分类名称',
'title.max' => '分类名称不能超过20个字符',
'title.max' => '分类名称不能超过50个字符',
'image.required' => '请上传分类图片',
'keywords.required' => '请输入分类关键词',
'keywords.max' => '分类关键词不能超过50个字符',
... ...
... ... @@ -30,7 +30,7 @@ class DescribeRequest extends FormRequest
public function rules()
{
return [
'title'=>'required|max:30',
'title'=>'required|max:50',
'describe'=>'required',
];
}
... ... @@ -39,7 +39,7 @@ class DescribeRequest extends FormRequest
{
return [
'title.required' => '请输入描述名称',
'title.max' => '描述名称不能超过30个字符',
'title.max' => '描述名称不能超过50个字符',
'seo_title.required' => '请输入描述内容',
];
}
... ...
... ... @@ -30,7 +30,7 @@ class KeywordRequest extends FormRequest
public function rules()
{
return [
'title'=>'required|max:30',
'title'=>'required|max:50',
'seo_title'=>'max:200',
'seo_keywords'=>'max:200',
'seo_description'=>'max:200',
... ... @@ -41,7 +41,7 @@ class KeywordRequest extends FormRequest
{
return [
'title.required' => '请输入关键词',
'title.max' => '关键词不能超过30个字符',
'title.max' => '关键词不能超过50个字符',
'seo_title.max' => 'SEO标题不能超过200个字符',
'seo_keywords.max' => 'SEO关键词不能超过200个字符',
'seo_description.max' => 'SEO描述不能超过200个字符',
... ...
... ... @@ -2,7 +2,13 @@
namespace App\Http\Requests\Bside\product;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use App\Helper\Arr;
use App\Models\Product\Product;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
/**
* Class ProductRequest
... ... @@ -30,23 +36,77 @@ class ProductRequest extends FormRequest
public function rules()
{
return [
'title'=>'required|max:20',
'image'=>'required',
'keywords'=>'required|max:50',
'describe'=>'required|max:200',
'title' => 'required|max:200',
'route' => 'required|max:100',
'gallery' => ['required', 'array', function ($attribute, $value, $fail) {
foreach ($value as $v) {
if (empty($v['url'])) {
$fail('图片链接不能为空');
}
if (Str::contains($v['url'], env('APP_URL'))) {
$fail('图片链接不正确');
}
}
}],
'attrs' => ['required', 'array', function ($attribute, $value, $fail) {
foreach ($value as $v) {
if (empty($v['key'])) {
$fail('产品属性名不能为空');
}
if (empty($v['value'])) {
$fail('产品属性值不能为空');
}
}
}],
'category_id' => 'required',
'keywords' => 'required',
'intro' => 'required|max:500',
'content' => 'required',
'describe' => 'required|array',
'seo_mate' => ['required', 'array', function ($attribute, $value, $fail) {
if(empty($value['title'])){
$fail('SEO标题不能为空');
}
if(empty($value['description'])){
$fail('SEO描述不能为空');
}
if(empty($value['keyword'])){
$fail('SEO关键词不能为空');
}
}],
'related_product_id' => ['required', function ($attribute, $value, $fail) {
$value = array_filter(Arr::splitFilterToArray($value), 'intval');
if(count($value) > 16){
$fail('关联产品不能超过16个');
}
}],
'status' => ['required', Rule::in(array_keys(Product::statusMap()))],
];
}
public function messages()
{
return [
'title.required' => '请输入分类名称',
'title.max' => '分类名称不能超过20个字符',
'image.required' => '请上传分类图片',
'keywords.required' => '请输入分类关键词',
'keywords.max' => '分类关键词不能超过50个字符',
'describe.required' => '请输入分类描述',
'describe.max' => '分类描述不能超过200个字符',
'title.required' => '请输入产品标题',
'title.max' => '产品标题不能超过20个字符',
'route.required' => '请输入产品链接',
'route.max' => '产品链接不能超过100个字符',
'gallery.required' => '请上传产品图片',
'gallery.array' => '产品图片格式异常',
'attrs.required' => '请添加产品参数',
'attrs.array' => '产品参数格式异常',
'category_id.required' => '请选择分类',
'keywords.required' => '请添加关键词标签',
'intro.required' => '请输入短描述',
'intro.max' => '短描述不能超过500个字符',
'content.required' => '请输入产品描述',
'describe.required' => '请添加描述切换栏',
'describe.array' => '描述切换栏格式异常',
'seo_mate.required' => '请输入SEO',
'seo_mate.array' => 'SEO格式异常',
'related_product_id.required' => '请选择相关产品',
'status.required' => '请选择产品状态',
'status.in' => '产品状态值异常',
];
}
... ...
... ... @@ -2,10 +2,10 @@
namespace App\Models;
class Manager extends Base
class AiCommand extends Base
{
//设置关联表名
protected $table = 'gl_manager';
protected $table = 'gl_ai_command';
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
... ...
... ... @@ -15,7 +15,6 @@ class Base extends Model
'created_at' => 'datetime:Y-m-d H:i:s',
'updated_at' => 'datetime:Y-m-d H:i:s',
];
/**
* 日期序列化 勿删 删了时间就不是东八区时间了哈
* @param \DateTimeInterface $date
... ... @@ -27,30 +26,26 @@ class Base extends Model
{
return $date->format('Y-m-d H:i:s');
}
/**
* @name 列表数据
* @return void
* @author :liyuhang
* @method
*/
public function lists($map, $p, $row, $order = 'id', $fields = ['*']){
//TODO::where(['id'=>'','name'=>''])
public function lists($map, $page, $row, $order = 'id', $fields = ['*']){
$query = $this->formatQuery($map);
$lists = $query->select($fields)->orderBy($order)->paginate($row, ['*'], 'page', $p);
$lists = $query->select($fields)->orderBy($order)->paginate($row, ['*'], 'page', $page);
if (empty($lists)) {
return false;
return [];
}
$lists = $lists->toArray();
return $lists;
}
/**
* @name :无分页列表
* @param $map
* @param $order
* @param $fields
* @name :无分页列表
* @return mixed
* @author :liyuhang
* @method
... ... @@ -59,14 +54,14 @@ class Base extends Model
$query = $this->formatQuery($map);
$lists = $query->select($fields)->orderBy($order)->get();
if (empty($lists)) {
return false;
return [];
}
$lists = $lists->toArray();
return $lists;
}
/**
* @param array:$condition
* @name :获取单条数据详情
* @param array
* @return mixed
* @author :liyuhang
* @method get
... ... @@ -81,8 +76,6 @@ class Base extends Model
$info = $info->toArray();
return $info;
}
/**
* @name :新增
* @return void
... ... @@ -94,7 +87,6 @@ class Base extends Model
$data['updated_at'] = date('Y-m-d H:i:s');
return $this->insert($data);
}
/**
* @name :编辑
* @return void
... ... @@ -104,10 +96,8 @@ class Base extends Model
public function edit($data,$condition){
$query = $this->formatQuery($condition);
$data['updated_at'] = date('Y-m-d H:i:s');
$rs = $query->update($data);
return $rs;
return $query->update($data);
}
/**
* @name : 删除数据
* @return void
... ... @@ -118,12 +108,10 @@ class Base extends Model
$query = $this->formatQuery($condition);
return $query->delete();
}
/**
* @name :参数处理查询
* @param $map = ['$k'=>['like',$v],$k1]
* @param $val
* @name :参数处理查询
* @return Base
* @author :liyuhang
* @method
... ... @@ -132,47 +120,45 @@ class Base extends Model
$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){
if(!is_array($v)){
$query->where($k,$v);
continue;
}
switch ($v[0]){
case 'like':
// like查询 ['name|title'=> ['like','%a%']]
if (strpos($k, '|') !== false) {
$query->where(function ($query) use ($k,$v1) {
$query->where(function ($query) use ($k,$v) {
$item = explode('|', $k);
foreach ($item as $vo) {
$query->orWhere($vo, $v1[0], $v1[1]);
$query->orWhere($vo, $v[0], $v[1]);
}
});
} else {
$query->where($k,$v1[0], $v1[1]);
$query->where($k, $v[0], $v[1]);
}
break;
case 'in':
// in查询 ['id'=>['in'=>[1,2,3]]]
$query->whereIn($k, $v1[1]);
// in查询 ['id'=>['in',[1,2,3]]]
$query->whereIn($k, $v[1]);
break;
case 'no in':
// in查询 ['id'=>['not in'=>[1,2,3]]]
$query->whereNotIn($k, $v1[1]);
// in查询 ['id'=>['not in',[1,2,3]]]
$query->whereNotIn($k, $v[1]);
break;
case 'between':
// in查询 ['id'=>['between'=>[create1,create2]]]
$query->whereBetween($k, $v1[1]);
// in查询 ['id'=>['between',[create1,create2]]]
$query->whereBetween($k, $v[1]);
case 'not between':
// not between查询 ['created_at'=>['not between'=>['xxx', 'xxx]]]
$query->whereNotBetween($k, $v1[1]);
// not between查询 ['created_at'=>['not between',['xxx', 'xxx]]]
$query->whereNotBetween($k, $v[1]);
break;
default:
$query->where($k,$k1,$v1[1]);
$query->where($k,$v[0],$v[1]);
break;
}
}
}else{
$query->where($k,$v);
}
}
});
return $query;
}
... ...
<?php
namespace App\Models\Blog;
use App\Models\Base;
class Blog extends Base
{
protected $table = 'gl_blog';
}
... ...
<?php
namespace App\Models\Blog;
use App\Models\Base;
class BlogCategory extends Base
{
protected $table = 'gl_blog_category';
}
... ...
<?php
namespace App\Models\Blog;
use App\Models\Base;
class BlogLabel extends Base
{
protected $table = 'gl_blog_label';
}
... ...
... ... @@ -2,7 +2,9 @@
namespace App\Models;
class Menu extends Base
class Image extends Base
{
protected $table = 'gl_menu';
protected $table = 'gl_image';
public $timestamps = true;
}
... ...
<?php
namespace App\Models;
class Mail extends Base
{
protected $table = 'gl_mail';
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
}
... ...
<?php
namespace App\Models;
class MailUser extends Base
{
protected $table = 'gl_mail_user';
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
}
... ...
<?php
namespace App\Models\Manage;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
class Dept extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_manage_dept';
}
... ...
<?php
namespace App\Models\Manage;
use App\Helper\Arr;
use App\Models\Base;
class Group extends Base
{
protected $table = 'gl_manage_group';
const STATUS_NORMAL = 0;
const STATUS_ABNORMAL = 1;
/**
* @return string[]
*/
public static function statusMap(){
return [
self::STATUS_NORMAL => '正常',
self::STATUS_ABNORMAL => '禁用',
];
}
/**
* 获取用户组路由权限
* @param $gid
* @return array
*/
public static function getRouteByGroupId($gid)
{
$group = self::where(['id' => $gid, 'status' => self::STATUS_NORMAL])->first();
if(!$group){
return [];
}
$routes = Menu::where(['status' => Menu::STATUS_NORMAL])->whereIn('id', $group->rights)->pluck('route_name')->toArray();
return array_filter($routes);
}
public function getRightsAttribute($value)
{
return Arr::setToArr($value);
}
public function setRightsAttribute($value)
{
$this->attributes['rights'] = Arr::arrToSet($value);
}
}
... ...
<?php
namespace App\Models\Manage;
use App\Models\Base;
use Illuminate\Support\Facades\Session;
class LoginLog extends Base
{
//设置关联表名
protected $table = 'gl_manage_login_log';
const UPDATED_AT = null;
/**
* 登录日志
* @param $manage_id
* @author zbj
* @date 2023/4/20
*/
public function addLog($manage_id){
$log = new self();
$log->manage_id = $manage_id;
$log->session_id = Session::getId();
$log->ip = request()->ip();
$log->save();
}
}
... ...
<?php
namespace App\Models\Manage;
use App\Models\Base;
class Manage extends Base
{
//设置关联表名
protected $table = 'gl_manage';
protected $hidden = ['password'];
const STATUS_ACTIVE = 0;
const STATUS_DISABLE = 1;
/**
* 超级管理员ID, 当前ID拥有所有权限, 不能进行修改
*/
const ADMINISTRATOR_ID = 1;
public function statusMap(){
return [
self::STATUS_ACTIVE => '正常',
self::STATUS_DISABLE => '禁用',
];
}
}
... ...
<?php
namespace App\Models\Manage;
use App\Models\Base;
class Menu extends Base
{
protected $table = 'gl_manage_menu';
const STATUS_NORMAL = 0;
const STATUS_ABNORMAL = 1;
const TYPE_SHOW = 'show';
const TYPE_SAVE = 'save';
const TYPE_DELETE = 'delete';
/**
* @return string[]
*/
public static function statusMap(): array
{
return [
self::STATUS_NORMAL => '正常',
self::STATUS_ABNORMAL => '禁用',
];
}
/**
* @return string[]
*/
public static function typeMap(): array
{
return [
self::TYPE_SHOW => '查看',
self::TYPE_SAVE => '保存',
self::TYPE_DELETE => '删除',
];
}
}
... ...
<?php
namespace App\Models\News;
use App\Models\Base;
class News extends Base
{
protected $table = 'gl_news';
}
... ...
<?php
namespace App\Models\News;
use App\Models\Base;
class NewsCategory extends Base
{
protected $table = 'gl_news_category';
}
... ...
<?php
namespace App\Models\News;
use App\Models\Base;
class NewsLabel extends Base
{
protected $table = 'gl_news_label';
}
... ...
... ... @@ -2,7 +2,9 @@
namespace App\Models\Product;
use App\Models\Base;
use App\Services\Facades\Upload;
use Illuminate\Database\Eloquent\SoftDeletes;
class Category extends Base
... ... @@ -12,4 +14,13 @@ class Category extends Base
//设置关联表名
protected $table = 'gl_product_category';
public function getImageAttribute($value)
{
return Upload::path2url($value);
}
public function setImageAttribute($value)
{
$this->attributes['image'] = Upload::url2path($value);
}
}
... ...
... ... @@ -2,7 +2,9 @@
namespace App\Models\Product;
use App\Helper\Arr;
use App\Models\Base;
use App\Services\Facades\Upload;
use Illuminate\Database\Eloquent\SoftDeletes;
class Product extends Base
... ... @@ -12,4 +14,91 @@ class Product extends Base
//设置关联表名
protected $table = 'gl_product';
const STATUS_DRAFT = 0;
const STATUS_ON = 1;
const STATUS_OFF = 2;
public static function statusMap(){
return [
self::STATUS_DRAFT => '草稿',
self::STATUS_ON => '已上架',
self::STATUS_OFF => '未上架',
];
}
public function setThumbAttribute($value){
$value['url'] = Upload::url2path($value['url']);
$this->attributes['thumb'] = Arr::a2s($value);
}
public function getThumbAttribute($value){
$value = Arr::s2a($value);
$value['url'] = Upload::path2url($value['url']);
return $value;
}
public function setGalleryAttribute($value){
foreach ($value as &$v){
$v['url'] = Upload::url2path($v['url']);
}
$this->attributes['gallery'] = Arr::a2s($value);
}
public function getGalleryAttribute($value){
$value = Arr::s2a($value);
foreach ($value as &$v){
$v['url'] = Upload::path2url($v['url']);
}
return $value;
}
public function setAttrsAttribute($value){
$this->attributes['attrs'] = Arr::a2s($value);
}
public function getAttrsAttribute($value){
return Arr::s2a($value);
}
public function setDescribeAttribute($value){
$this->attributes['describe'] = Arr::a2s($value);
}
public function getDescribeAttribute($value){
return Arr::s2a($value);
}
public function setSeoMateAttribute($value){
$this->attributes['seo_mate'] = Arr::a2s($value);
}
public function getSeoMateAttribute($value){
return Arr::s2a($value);
}
public function setCategoryIdAttribute($value){
$this->attributes['category_id'] = Arr::arrToSet($value);
}
public function getCategoryIdAttribute($value){
return Arr::setToArr($value);
}
public function setKeywordsAttribute($value){
$this->attributes['keywords'] = Arr::arrToSet($value, 'trim');
}
public function getKeywordsAttribute($value){
return Arr::setToArr($value, 'trim');
}
public function setRelatedProductIdAttribute($value){
$this->attributes['related_product_id'] = Arr::arrToSet($value);
}
public function getRelatedProductIdAttribute($value){
return Arr::setToArr($value);
}
}
... ...
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProjectDept extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_project_dept';
}
... ...
... ... @@ -22,7 +22,9 @@ class RouteMap extends Model
const SOURCE_PRODUCT_CATE = 'product_category';
const SOURCE_PRODUCT_KEYWORD = 'product_keyword';
//路由类型
const SOURCE_BLOG = 'blog';
const SOURCE_NEWS = 'news';
/**
* 生成路由标识
* @param $title
... ... @@ -74,18 +76,13 @@ class RouteMap extends Model
* @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){
public static function setRoute($title, $source, $source_id, $project_id = 0){
$route = self::generateRoute($title, $source, $source_id, $project_id);
}
if(!$route){
throw new \Exception('路由不能为空');
}
... ... @@ -150,7 +147,7 @@ class RouteMap extends Model
* @author zbj
* @date 2023/4/17
*/
public function delRoute($source, $source_id, $project_id){
public static function delRoute($source, $source_id, $project_id){
return self::where('project_id', $project_id)->where('source', $source)->where('source_id', $source_id)->delete();
}
}
... ...
... ... @@ -93,21 +93,6 @@ class User extends Base
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
... ...
... ... @@ -2,7 +2,7 @@
namespace App\Providers;
use App\Services\PaginatorServer;
use App\Services\PaginatorService;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
... ... @@ -16,7 +16,7 @@ class AppServiceProvider extends ServiceProvider
{
//自定义分页
$this->app->bind('Illuminate\Pagination\LengthAwarePaginator',function ($app,$options){
return new PaginatorServer($options['items'], $options['total'], $options['perPage'], $options['currentPage'] , $options['options']);
return new PaginatorService($options['items'], $options['total'], $options['perPage'], $options['currentPage'] , $options['options']);
});
}
... ...
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
/**
* 验证手机号
* Class Mobile
* @package App\Rules
* @author zbj
* @date 2023/4/19
*/
class Mobile implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
$cardReg = '/^1(3|4|5|7|8)\d{9}$/';
return preg_match($cardReg, $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return '手机号码格式不正确';
}
}
... ...
... ... @@ -13,13 +13,14 @@ class BaseService
{
/**
* @notes: 手动抛出异常
* @param string $msg
* @param string $code
* @throws BsideGlobalException
* @author:wlj
* @date: 2022/7/19 14:25
*/
public function fail(string $code = Code::SYSTEM_ERROR)
public function fail(string $msg, string $code = Code::SYSTEM_ERROR)
{
throw new BsideGlobalException($code);
throw new BsideGlobalException($code, $msg);
}
}
... ...
<?php
namespace App\Services\Facades;
use Illuminate\Support\Facades\Facade;
/**
* @see \App\Services\UploadService
* @method static string put(string $input_name="file", string|array $config="default") 单个文件上传
* @method static array puts(string $input_name="file", string|array $config="default") 批量获取上传的文件
* @method static array filePut(string $filename, string $content, string|array $config="default")
* @method static string url2path(string $url, string|array $disk="upload")
* @method static string path2url(string $path, string|array $disk="upload")
*/
class Upload extends Facade
{
protected static function getFacadeAccessor()
{
return '\App\Services\UploadService';
}
}
... ...
... ... @@ -11,7 +11,7 @@ use Illuminate\Pagination\LengthAwarePaginator;
* @author zbj
* @date 2023/4/14
*/
class PaginatorServer extends LengthAwarePaginator
class PaginatorService extends LengthAwarePaginator
{
public function toArray()
{
... ...
<?php
namespace App\Services;
use App\Helper\FileEtag;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Http\UploadedFile;
/**
* Class UploadServer
* @package App\Services
*/
class UploadService extends BaseService
{
/**
* 默认配置
* @see $defaultConfig
* @var array
*/
public $config = [];
/**
* 默认配置
* @var array
*/
public $defaultConfig = [
// 上传文件的大小范围
'size' => [
'max' => 1024 * 1024 * 2, // 2M
],
// 磁盘
'disk' => 'upload',
// 扩展名
'ext' => [
'png', 'jpg', 'jpeg', 'gif'
],
// 目录
'path' => '',
];
/**
* @param string|array $config
* @author:dc
* @time 2022/1/7 14:38
*/
private function config($config = 'default')
{
if (is_array($config)) {
$driver = $config['driver'];
} else {
$driver = $config;
}
// 加载配置
$this->config = $this->defaultConfig;
if ($driver != 'default') {
$conf = config('upload.' . $driver);
if ($conf) {
// 合并默认配置
$this->config = array_merge($this->config, $conf);
}
}
// 追加目录
if ($config['path'] ?? '') {
$this->config['path'] = $this->config['path'] . (strpos($config['path'], '/') !== 0 ? '/' : '') . $config['path'];
}
}
/**
*
* @param string $input_file
* @param string $config
* @return string
* @throws \Exception
* @author:dc
* @time 2021/12/30 16:37
*/
public function put($input_file = "file", $config = 'default'): string
{
$this->config($config);
if ($input_file instanceof UploadedFile) {
$file = &$input_file;
} else {
// 是否是已存在服务器的图片
if (Str::contains($input_file, env('APP_URL'))) {
return $input_file;
} else {
// 获取post上传文件
$file = request()->file($input_file);
// 如果不是上传,是否本地文件
if (!$file && is_file($input_file)) {
// 获取文件的名字
$origin_name = explode(DIRECTORY_SEPARATOR, $input_file);
!is_array($origin_name) && $origin_name = [$origin_name];
// 创建一个上传对象
$file = UploadedFile::createFromBase(new \Symfony\Component\HttpFoundation\File\UploadedFile($input_file, array_pop($origin_name)));
}
}
}
if ($file) {
// 验证扩展名
if (!in_array($file->extension(), $this->config['ext'])) {
$this->fail('文件扩展名不匹配,文件扩展名支持' . implode(',', $this->config['ext']));
}
// 验证文件大小
if ($file->getSize() > $this->config['size']['max']) {
$this->fail('文件大小超出' . ($this->config['size']['max'] / 1024 / 1024) . 'M');
}
//判断文件hash是否已存在
if ($filename = $this->getFileHash($file)) {
return $filename;
}
$pathDate = date('Y-m');
// 保存处理过的图片
if (!empty($img)) {
// 保存的图片名称
$save_name = $this->config['path'] . '/' . $pathDate . '/' . $file->hashName();
// 保存文件
if (!Storage::disk($this->config['disk'])
->put($save_name, $img->getEncoded())) {
$save_name = '';
}
} else {
// 保存文件
$save_name = $file->storeAs($this->config['path'] . '/' . $pathDate, $file->hashName(), $this->config['disk']);
}
if ($save_name) {
//保存文件hash
$this->setFileHash($file, $save_name);
// 返回地址
return $save_name;
}
$this->fail( '上传失败');
}
// 异常
$this->fail('请上传文件');
}
/**
* 批量上传
* @param string $input_file
* @param string $config
* @return array
* @throws \Exception
* @author:dc
* @time 2021/12/30 16:36
*/
public function puts($input_file = "file", $config = 'default'): array
{
$request = request();
$files = $request->post($input_file, []);
$files_ = $request->file($input_file);
if ($files_) {
$files = array_merge($files, $files_);
}
$filename = [];
if ($files instanceof UploadedFile) {
$filename[] = $this->put($files, $config);
} else if ($files) {
foreach ($files as $file) {
$filename[] = $this->put($file, $config);
}
} else {
// 异常
$this->fail('请上传文件');
}
return $filename;
}
/**
* 上传文件,文件内容
* @param string $filename
* @param string $content
* @param string $config
* @return string
* @throws \App\Exceptions\BsideGlobalException
* @author:dc
* @time 2022/1/7 14:45
*/
public function filePut(string $filename, string $content, $config = 'default')
{
if ($content) {
$this->config($config);
$save_name = $this->config['path'] . '/' . $filename;
// 保存文件
$result = Storage::disk($this->config['disk'])->put($save_name, $content);
if ($result) {
// 返回地址
return $save_name;
}
$this->fail('上传失败');
}
// 异常
$this->fail('请上传文件');
}
/**
* 文件hash是否存在 存在返回文件路径
* @param $file
* @return mixed|string|null
*/
protected function getFileHash($file)
{
$hash = FileEtag::sum($file)[0];
if (!$hash) {
return '';
}
return DB::table('gl_file_hash')->where('hash', $hash)->value('filename');
}
/**
* 保存文件hash
* @param $file
* @param $save_path
* @return bool
*/
protected function setFileHash($file, $save_path): bool
{
$hash = FileEtag::sum($file)[0];
if (!$hash) {
return false;
}
$data = [
'filename' => $save_path,
'hash' => $hash,
];
DB::table('gl_file_hash')->insert($data);
return true;
}
/**
* 文件地址转本地路径
* @param $url
* @return array|string|string[]
* @author zbj
* @date 2023/4/20
*/
public function url2path($url){
$upload_url = config('filesystems')['disks'][$this->config['disk']]['url'];
return str_replace($upload_url . '/', '', $url);
}
/**
* 本地路径转链接
* @param $path
* @return string
* @author zbj
* @date 2023/4/20
*/
public function path2url($path){
return Storage::disk($this->config['disk'])->url($path);
}
}
... ...
... ... @@ -2,6 +2,7 @@
namespace App\Utils;
use App\Enums\Common\Common;
use App\Helper\Arr;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route;
... ... @@ -17,7 +18,12 @@ class LogUtils
public static function error($title, $params = [], $response = [])
{
$route=Route::current();
$side=$route->action['prefix']??Common::A;
if(!empty($route->action['prefix'])){
$prefix = Arr::splitFilterToArray($route->action['prefix'], 'trim', '/');
$side = $prefix[0];
}else{
$side = Common::A;
}
$params = is_array($params) ? json_encode($params, JSON_UNESCAPED_UNICODE) : $params;
$response = is_array($response) || is_object($response) ? json_encode($response, JSON_UNESCAPED_UNICODE) : $response;
Log::channel($side.'side')->error("$title::请求参数:$params--------响应:$response");
... ... @@ -33,7 +39,12 @@ class LogUtils
public static function info($title, $params = [], $response = [])
{
$route=Route::current();
$side=$route->action['prefix']??Common::A;
if(!empty($route->action['prefix'])){
$prefix = Arr::splitFilterToArray($route->action['prefix'], 'trim', '/');
$side = $prefix[0];
}else{
$side = Common::A;
}
$params = is_array($params) ? json_encode($params, JSON_UNESCAPED_UNICODE) : $params;
$response = is_array($response) || is_object($response) ? json_encode($response, JSON_UNESCAPED_UNICODE) : $response;
Log::channel($side.'side')->info("$title::请求参数:$params--------响应:$response");
... ...
#!/usr/bin/env php
<?php
define('LARAVEL_START', microtime(true));
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any of our classes manually. It's great to relax.
|
*/
require __DIR__.'/vendor/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->handle(
$input = new Symfony\Component\Console\Input\ArgvInput,
new Symfony\Component\Console\Output\ConsoleOutput
);
/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running, we will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/
$kernel->terminate($input, $status);
exit($status);
... ... @@ -10,6 +10,7 @@
"doctrine/dbal": "^3.6",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",
"intervention/image": "^2.7",
"laravel/framework": "^8.75",
"laravel/sanctum": "^2.11",
"laravel/tinker": "^2.5"
... ...
此 diff 太大无法显示。
... ... @@ -174,6 +174,7 @@ return [
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
// Intervention\Image\ImageServiceProvider::class,
],
... ... @@ -229,7 +230,7 @@ return [
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
// 'Image'=>Intervention\Image\ImageManagerStatic::class,
],
];
... ...
... ... @@ -53,6 +53,13 @@ return [
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
],
'upload' => [
'driver' => 'local',
'root' => env('UPLOAD_ROOT_PATH') ?: public_path('upload'),
'url' => env('UPLOAD_LOCAL_URL') ?: env('APP_URL') . '/upload',
'visibility' => 'public',
]
],
/*
... ...
<?php
/**
* 上传配置
* 如果其他配置没有设置某一项则使用default的
* 默认配置见下
* @see \App\Services\UploadService::$config
*/
return [
// 产品图集
'product' => [
'size' => [
'max' => 1024*1024*2, // 2M
],
'path' => '/product'
],
];
... ...
<form method="post" action="">
@csrf
<input type="text" name="mobile" value="15680871314">
<input type="text" name="password" value="123456">
<input type="submit">
</form>
... ...
{{--@extends('admin.app')--}}
{{--@section('content')--}}
<div id="content" class="main-content">
<div style="text-align: center;font-size: 40px;color: #afafaf;padding: 100px 0;">
无权限
</div>
</div>
{{--@endsection--}}
{{--@section('script')--}}
{{--@endsection--}}
... ...
... ... @@ -5,12 +5,49 @@
use \Illuminate\Support\Facades\Route;
use \App\Http\Controllers\Aside;
//必须登录验证的路由组
Route::middleware(['aloginauth'])->group(function ($route) {
Route::middleware(['web'])->group(function (){ //admin用渲染默认要加上web的中间件
Route::middleware(['aloginauth'])->group(function () {
Route::get('/', [Aside\IndexController::class, 'index'])->name('admin.home.white');
Route::get('/logout', [Aside\LoginController::class, 'logout'])->name('admin.logout.white');
});
//管理员
Route::prefix('manage')->group(function () {
Route::get('/', [Aside\Manage\ManageController::class, 'list'])->name('admin.manage');
Route::get('/info', [Aside\Manage\ManageController::class, 'info'])->name('admin.manage_info');
Route::post('/save', [Aside\Manage\ManageController::class, 'save'])->name('admin.manage_save');
Route::any('/delete', [Aside\Manage\ManageController::class, 'delete'])->name('admin.manage_delete');
//菜单
Route::prefix('menu')->group(function () {
Route::get('/', [Aside\Manage\MenuController::class, 'list'])->name('admin.menu');
Route::get('/info', [Aside\Manage\MenuController::class, 'info'])->name('admin.menu_info');
Route::post('/save', [Aside\Manage\MenuController::class, 'save'])->name('admin.menu_save');
Route::any('/delete', [Aside\Manage\MenuController::class, 'delete'])->name('admin.menu_delete');
});
//权限组
Route::prefix('group')->group(function () {
Route::get('/', [Aside\Manage\GroupController::class, 'list'])->name('admin.group');
Route::get('/info', [Aside\Manage\GroupController::class, 'info'])->name('admin.group_info');
Route::post('/save', [Aside\Manage\GroupController::class, 'save'])->name('admin.group_save');
Route::any('/delete', [Aside\Manage\GroupController::class, 'delete'])->name('admin.group_delete');
});
//部门
Route::prefix('dept')->group(function () {
Route::get('/', [Aside\Manage\DeptController::class, 'list'])->name('admin.dept');
Route::get('/info', [Aside\Manage\DeptController::class, 'info'])->name('admin.dept_info');
Route::post('/save', [Aside\Manage\DeptController::class, 'save'])->name('admin.dept_save');
Route::any('/delete', [Aside\Manage\DeptController::class, 'delete'])->name('admin.dept_delete');
});
});
});
//无需登录验证的路由组
Route::group([], function ($route) {
//demo
$route->post('/demo', [Aside\DemoController::class, 'test']);
Route::group([], function () {
Route::any('/login', [Aside\LoginController::class, 'login'])->name('admin.login.white');
});
});
... ...
... ... @@ -2,7 +2,8 @@
/**
* B端用户路由文件
*/
use \Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Route;
//必须登录验证的路由组
Route::middleware(['bloginauth'])->group(function () {
... ... @@ -13,26 +14,101 @@ Route::middleware(['bloginauth'])->group(function () {
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('/notice/', [\App\Http\Controllers\Bside\NoticeController::class, 'lists'])->name('notice_lists');
//用户相关路由
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::prefix('user')->group(function () {
Route::any('/', [\App\Http\Controllers\Bside\UserController::class, 'lists'])->name('user_lists');
Route::any('/add', [\App\Http\Controllers\Bside\UserController::class, 'add'])->name('user_add');
Route::any('/edit', [\App\Http\Controllers\Bside\UserController::class, 'edit'])->name('user_edit');
Route::any('/status', [\App\Http\Controllers\Bside\UserController::class, 'status'])->name('user_status');
Route::any('/info', [\App\Http\Controllers\Bside\UserController::class, 'info'])->name('user_info');
Route::any('/del', [\App\Http\Controllers\Bside\UserController::class, 'del'])->name('user_del');
});
//站内信
Route::prefix('mail')->group(function () {
Route::any('/', [\App\Http\Controllers\Bside\MailController::class, 'lists'])->name('mail_lists');
Route::any('/info', [\App\Http\Controllers\Bside\MailController::class, 'info'])->name('mail_info');
});
//用户角色相关路由
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('role')->group(function () {
Route::any('/', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'lists'])->name('project_role_lists');
Route::any('/get_role_menu', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'get_role_menu'])->name('project_get_role_add');
Route::any('/add', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'add'])->name('project_role_add');
Route::any('/edit', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'edit'])->name('project_role_edit');
Route::any('/info', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'status'])->name('project_role_info');
Route::any('/status', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'status'])->name('project_role_status');
Route::any('/del', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'del'])->name('project_role_del');
Route::any('/get_user_list', [\App\Http\Controllers\Bside\ProjectRoleController::class, 'get_user_list'])->name('project_role_get_user_list');
});
//group相关路
Route::prefix('group')->group(function () {
Route::any('/', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'lists'])->name('project_group_lists');
Route::any('/add', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'add'])->name('project_group_add');
Route::any('/edit', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'edit'])->name('project_group_edit');
Route::any('/info', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'info'])->name('project_group_info');
Route::any('/del', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'del'])->name('project_group_del');
Route::any('/get_user_lists', [\App\Http\Controllers\Bside\ProjectGroupController::class, 'get_user_lists'])->name('project_group_get_user_lists');
});
//新闻相关路由
Route::prefix('news')->group(function () {
//分类
Route::any('/category/', [\App\Http\Controllers\Bside\News\NewsCategoryController::class, 'lists'])->name('news_category_lists');
Route::any('/category/add', [\App\Http\Controllers\Bside\News\NewsCategoryController::class, 'add'])->name('news_category_add');
Route::any('/category/info', [\App\Http\Controllers\Bside\News\NewsCategoryController::class, 'info'])->name('news_category_info');
Route::any('/category/edit', [\App\Http\Controllers\Bside\News\NewsCategoryController::class, 'edit'])->name('news_category_edit');
Route::any('/category/del', [\App\Http\Controllers\Bside\News\NewsCategoryController::class, 'del'])->name('news_category_del');
Route::any('/category/status', [\App\Http\Controllers\Bside\News\NewsCategoryController::class, 'status'])->name('news_category_status');
//新闻
Route::any('/', [\App\Http\Controllers\Bside\News\NewsController::class, 'lists'])->name('news_category_lists');
Route::any('/get_category_list', [\App\Http\Controllers\Bside\News\NewsController::class, 'get_category_list'])->name('news_get_category_list');
Route::any('/add', [\App\Http\Controllers\Bside\News\NewsController::class, 'add'])->name('news_add');
Route::any('/info', [\App\Http\Controllers\Bside\News\NewsController::class, 'info'])->name('news_info');
Route::any('/edit', [\App\Http\Controllers\Bside\News\NewsController::class, 'edit'])->name('news_edit');
Route::any('/del', [\App\Http\Controllers\Bside\News\NewsController::class, 'del'])->name('news_del');
Route::any('/status', [\App\Http\Controllers\Bside\News\NewsController::class, 'status'])->name('news_status');
});
//博客相关路由
Route::prefix('blog')->group(function () {
//分类
Route::any('/category/', [\App\Http\Controllers\Bside\Blog\BlogCategoryController::class, 'lists'])->name('blog_category_lists');
Route::any('/category/add', [\App\Http\Controllers\Bside\Blog\BlogCategoryController::class, 'add'])->name('blog_category_add');
Route::any('/category/info', [\App\Http\Controllers\Bside\Blog\BlogCategoryController::class, 'info'])->name('blog_category_info');
Route::any('/category/edit', [\App\Http\Controllers\Bside\Blog\BlogCategoryController::class, 'edit'])->name('blog_category_edit');
Route::any('/category/del', [\App\Http\Controllers\Bside\Blog\BlogCategoryController::class, 'del'])->name('blog_category_del');
Route::any('/category/status', [\App\Http\Controllers\Bside\Blog\BlogCategoryController::class, 'status'])->name('blog_category_status');
//博客
Route::any('/', [\App\Http\Controllers\Bside\Blog\BlogController::class, 'lists'])->name('blog_lists');
Route::any('/add', [\App\Http\Controllers\Bside\Blog\BlogController::class, 'add'])->name('blog_add');
Route::any('/info', [\App\Http\Controllers\Bside\Blog\BlogController::class, 'info'])->name('blog_info');
Route::any('/edit', [\App\Http\Controllers\Bside\Blog\BlogController::class, 'edit'])->name('blog_edit');
Route::any('/del', [\App\Http\Controllers\Bside\Blog\BlogController::class, 'del'])->name('blog_del');
Route::any('/status', [\App\Http\Controllers\Bside\Blog\BlogController::class, 'status'])->name('blog_status');
//博客标签
Route::any('/label/', [\App\Http\Controllers\Bside\Blog\BlogLabelController::class, 'lists'])->name('blog_lists');
Route::any('/label/add', [\App\Http\Controllers\Bside\Blog\BlogLabelController::class, 'add'])->name('blog_add');
Route::any('/label/info', [\App\Http\Controllers\Bside\Blog\BlogLabelController::class, 'info'])->name('blog_info');
Route::any('/label/edit', [\App\Http\Controllers\Bside\Blog\BlogLabelController::class, 'edit'])->name('blog_edit');
Route::any('/label/del', [\App\Http\Controllers\Bside\Blog\BlogLabelController::class, 'del'])->name('blog_del');
Route::any('/label/status', [\App\Http\Controllers\Bside\Blog\BlogLabelController::class, 'status'])->name('blog_status');
});
//ai指令
Route::prefix('command')->group(function () {
//公用ai自动生成
Route::any('/ai_http_post', [\App\Http\Controllers\Bside\AiCommandController::class, 'ai_http_post'])->name('ai_http_post');
//新闻自动生成
Route::any('/ai_news', [\App\Http\Controllers\Bside\News\NewsController::class, 'ai_news'])->name('ai_news');
//博客自动生成
Route::any('/ai_blog', [\App\Http\Controllers\Bside\Blog\BlogController::class, 'ai_blog'])->name('ai_blog');
});
//产品
Route::prefix('product')->group(function () {
... ... @@ -66,11 +142,27 @@ Route::middleware(['bloginauth'])->group(function () {
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::prefix('dept')->group(function () {
Route::get('/', [\App\Http\Controllers\Bside\DeptController::class, 'index'])->name('dept');
Route::get('/info', [\App\Http\Controllers\Bside\DeptController::class, 'info'])->name('dept_info');
Route::post('/save', [\App\Http\Controllers\Bside\DeptController::class, 'save'])->name('dept_save');
Route::any('/delete', [\App\Http\Controllers\Bside\DeptController::class, 'delete'])->name('dept_delete');
});
//文件操作
Route::prefix('file')->group(function () {
Route::post('/upload', [\App\Http\Controllers\Bside\FileController::class, 'upload'])->name('file_upload');
});
Route::prefix('images')->group(function () {
Route::post('/upload', [\App\Http\Controllers\ImageController::class, 'upload'])->name('image_upload');
});
});
//无需登录验证的路由组
Route::group([], function () {
Route::any('/login', [\App\Http\Controllers\Bside\ComController::class, 'login'])->name('login');
Route::get('/file/download', [\App\Http\Controllers\Bside\FileController::class, 'download'])->name('file_download');
Route::get('/image/{hash}/{w}/{h}', [\App\Http\Controllers\ImageController::class,'index'])->name('image_show');
});
... ...