第一次提交
This commit is contained in:
commit
5e8f28f459
|
@ -0,0 +1,5 @@
|
|||
DATABASE_TYPE=mysql
|
||||
DATABASE_HOSTNAME=127.0.0.1
|
||||
DATABASE_NAME=add_hd
|
||||
DATABASE_USERNAME=root
|
||||
DATABASE_PASSWORD=123456
|
|
@ -0,0 +1,9 @@
|
|||
/runtime
|
||||
/.idea
|
||||
/.vscode
|
||||
/vendor
|
||||
*.log
|
||||
.env
|
||||
/tests/tmp
|
||||
/tests/.phpunit.result.cache
|
||||
/public/*
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2021 walkor<walkor@workerman.net> and contributors (see https://github.com/walkor/webman/contributors)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,21 @@
|
|||
apidoc
|
||||
```
|
||||
http://127.0.0.1:8787/apidoc/index.html#/
|
||||
|
||||
```
|
||||
Dev
|
||||
```
|
||||
win php windows.php
|
||||
linux
|
||||
```
|
||||
一些状态码
|
||||
```
|
||||
401 登录失效需要重新登录
|
||||
402 通用错误
|
||||
```
|
||||
使用的一些插件地址
|
||||
```
|
||||
easy-sms https://github.com/overtrue/easy-sms
|
||||
webman命令行 https://www.workerman.net/plugin/1
|
||||
php 解析html文档 https://simplehtmldom.sourceforge.io/docs/1.9/quick-start/
|
||||
```
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
namespace App\Utils;
|
||||
|
||||
class ApiResponse
|
||||
{
|
||||
public static function success($code = 200, $data = [], $message = '操作成功')
|
||||
{
|
||||
return json([
|
||||
'status' => 'success',
|
||||
'code' => $code,
|
||||
'data' => $data,
|
||||
'message' => $message
|
||||
]);
|
||||
}
|
||||
|
||||
public static function error($code = 400, $data = [], $message = '操作失败')
|
||||
{
|
||||
return json([
|
||||
'status' => 'error',
|
||||
'code' => $code,
|
||||
'message' => $message,
|
||||
'data' => $data
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
namespace App\Utils;
|
||||
|
||||
class FunctionResponse
|
||||
{
|
||||
public static function success($code = 200, $data = [], $message = '操作成功')
|
||||
{
|
||||
return [
|
||||
'status' => 'success',
|
||||
'code' => $code,
|
||||
'data' => $data,
|
||||
'message' => $message
|
||||
];
|
||||
}
|
||||
|
||||
public static function error($code = 400, $data = [], $message = '操作失败')
|
||||
{
|
||||
return [
|
||||
'status' => 'error',
|
||||
'code' => $code,
|
||||
'message' => $message,
|
||||
'data' => $data
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
namespace app\command;
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Helper\Table;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class ConfigMySQLCommand extends Command
|
||||
{
|
||||
protected static $defaultName = 'config:mysql';
|
||||
protected static $defaultDescription = '显示当前MySQL服务器配置';
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$output->writeln('MySQL配置信息如下:');
|
||||
$config = config('database');
|
||||
$headers = ['name', 'default', 'driver', 'host', 'port', 'database', 'username', 'password', 'unix_socket', 'charset', 'collation', 'prefix', 'strict', 'engine', 'schema', 'sslmode'];
|
||||
$rows = [];
|
||||
foreach ($config['connections'] as $name => $db_config) {
|
||||
$row = [];
|
||||
foreach ($headers as $key) {
|
||||
switch ($key) {
|
||||
case 'name':
|
||||
$row[] = $name;
|
||||
break;
|
||||
case 'default':
|
||||
$row[] = $config['default'] == $name ? 'true' : 'false';
|
||||
break;
|
||||
default:
|
||||
$row[] = $db_config[$key] ?? '';
|
||||
}
|
||||
}
|
||||
if ($config['default'] == $name) {
|
||||
array_unshift($rows, $row);
|
||||
} else {
|
||||
$rows[] = $row;
|
||||
}
|
||||
}
|
||||
$table = new Table($output);
|
||||
$table->setHeaders($headers);
|
||||
$table->setRows($rows);
|
||||
$table->render();
|
||||
return self::SUCCESS;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
namespace app\command;
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class CreateControllerCommand extends Command
|
||||
{
|
||||
protected static $defaultName = 'make:apicontroller';
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this->setDescription('Create a new controller')
|
||||
->setHelp('This command allows you to create a new controller...');
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
// 获取控制器名称
|
||||
$controllerName = $input->getArgument('name');
|
||||
if (!$controllerName) {
|
||||
$output->writeln('<error>Controller name is required</error>');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
// 创建控制器文件
|
||||
$controllerFile = __DIR__ . "/../../app/Controllers/api/{$controllerName}Controller.php";
|
||||
|
||||
if (file_exists($controllerFile)) {
|
||||
$output->writeln("<error>Controller {$controllerName} already exists!</error>");
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
// 控制器的基本代码模板
|
||||
$controllerTemplate = "<?php\n\nnamespace App\Controllers;\n\nclass {$controllerName}Controller\n{\n // Your controller code here\n}\n";
|
||||
|
||||
// 将控制器内容写入文件
|
||||
file_put_contents($controllerFile, $controllerTemplate);
|
||||
|
||||
$output->writeln("<info>Controller {$controllerName} created successfully!</info>");
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
use App\model\Carousel;
|
||||
use App\model\Project;
|
||||
use App\model\ProjectDetailed;
|
||||
use App\model\ProjectRegister;
|
||||
use App\model\Carouselad;
|
||||
use App\model\Mechanism;
|
||||
use Tinywan\Jwt\JwtToken;
|
||||
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
use support\Db;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("基础控制器")
|
||||
*/
|
||||
|
||||
class Apiv1Controller
|
||||
{
|
||||
protected $noNeedLogin = ['get_carousel', 'get_project', 'get_projectdetailed', 'get_mechanism_list'];
|
||||
public function index(Request $request)
|
||||
{
|
||||
static $readme;
|
||||
if (!$readme) {
|
||||
$readme = file_get_contents(base_path('README.md'));
|
||||
}
|
||||
return $readme;
|
||||
}
|
||||
|
||||
public function view(Request $request)
|
||||
{
|
||||
return view('index/view', ['name' => 'webman']);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取首页轮播图")
|
||||
* @Apidoc\Url("Apiv1/get_carousel")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_carousel(Request $request)
|
||||
{
|
||||
// return json(['code' => 0, 'msg' => 'ok']);
|
||||
$res['carousel'] = Carousel::all();
|
||||
$res['carouselad'] = Carouselad::all();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取所有项目")
|
||||
* @Apidoc\Url("Apiv1/get_project")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_project(Request $request)
|
||||
{
|
||||
//志愿者人数
|
||||
// $tmp=Project::all();
|
||||
// foreach($tmp as $k=>$v){
|
||||
// $res_volunteer=ProjectRegister::where('projectid',$v->id)->where('type',0)->count();
|
||||
// //被服务者人数
|
||||
// $res_servants=ProjectRegister::where('projectid',$v->id)->where('type',1)->count();
|
||||
// $ProjectDetailed = ProjectDetailed::where('projectid',$v->id)->first();
|
||||
// $data = array(
|
||||
// "id" => $v->id,
|
||||
// "created_at" => $v->created_at,
|
||||
// "updated_at" => $v->updated_at,
|
||||
// "img" => $v->img,
|
||||
// "start_time" => $v->start_time,
|
||||
// "end_time" => $v->end_time,
|
||||
// "address" => $v->address,
|
||||
// "title" => $v->title,
|
||||
// "type" => $v->type,
|
||||
// "volunteer_max"=>$ProjectDetailed->recruitingpersonnel,
|
||||
// "servants_max"=>$ProjectDetailed->registerserve,
|
||||
// "volunteer"=>$res_volunteer,
|
||||
// "servants"=>$res_servants
|
||||
// );
|
||||
// $res[]=$data;
|
||||
// }
|
||||
/**
|
||||
* ?优化
|
||||
*/
|
||||
$res = Db::table('project')
|
||||
->leftJoin('project_register as pr', 'project.id', '=', 'pr.projectid')
|
||||
->leftJoin('project_detailed as pd', 'project.id', '=', 'pd.projectid')
|
||||
->select(
|
||||
'project.*',
|
||||
'pd.recruitingpersonnel',
|
||||
'pd.registerserve',
|
||||
Db::raw('COUNT(CASE WHEN pr.type = 0 THEN 1 END) as volunteer'),
|
||||
Db::raw('COUNT(CASE WHEN pr.type = 1 THEN 1 END) as servants')
|
||||
)
|
||||
->groupBy('project.id')
|
||||
->orderBy('project.id', 'DESC')
|
||||
->get();
|
||||
|
||||
// 转换为期望的数据结构
|
||||
foreach ($res as &$v) {
|
||||
$v->volunteer_max = $v->recruitingpersonnel;
|
||||
$v->servants_max = $v->registerserve;
|
||||
unset($v->recruitingpersonnel, $v->registerserve); // 清理不需要的字段
|
||||
}
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取项目详细信息根据id")
|
||||
* @Apidoc\Url("Apiv1/get_projectdetailed")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Query("projectid", type="int",require=true, desc="项目id",default="1")
|
||||
* @Apidoc\Returned("projectdetailed", type="string", desc="项目详细信息")
|
||||
*/
|
||||
public function get_projectdetailed(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$res['project'] = Project::where('id', $data['projectid'])->first();
|
||||
$res['projectdetailed'] = ProjectDetailed::where('projectid', $data['projectid'])->first();
|
||||
//志愿者人数
|
||||
$res_volunteer = ProjectRegister::where('projectid', $data['projectid'])->where('type', 0)->count();
|
||||
//被服务者人数
|
||||
$res_servants = ProjectRegister::where('projectid', $data['projectid'])->where('type', 1)->count();
|
||||
$res['projectRegister'] = ProjectRegister::where('projectid', $data['projectid'])->get();
|
||||
$res['volunteer'] = $res_volunteer;
|
||||
$res['servants'] = $res_servants;
|
||||
$res['volunteer_max'] = $res['projectdetailed']->recruitingpersonnel;
|
||||
$res['servants_max'] = $res['projectdetailed']->registerserve;
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取所有养老机构")
|
||||
* @Apidoc\Url("Apiv1/get_mechanism_list")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_mechanism_list(Request $request)
|
||||
{
|
||||
$res = Mechanism::all();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取养老机构详细信息")
|
||||
* @Apidoc\Url("Apiv1/get_mechanism")
|
||||
* @Apidoc\Query("mechanism", type="int",require=true, desc="养老机构id",default="1")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_mechanism(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$res = Mechanism::where('id', $data['id'])->get();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
class IndexController
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
static $readme;
|
||||
if (!$readme) {
|
||||
$readme = file_get_contents(base_path('README.md'));
|
||||
}
|
||||
return $readme;
|
||||
}
|
||||
|
||||
public function view(Request $request)
|
||||
{
|
||||
return view('index/view', ['name' => 'webman']);
|
||||
}
|
||||
|
||||
public function json(Request $request)
|
||||
{
|
||||
// return json(['code' => 0, 'msg' => 'ok']);
|
||||
$users = [
|
||||
['id' => 1, 'name' => '张三'],
|
||||
['id' => 2, 'name' => '李四'],
|
||||
];
|
||||
return ApiResponse::success($users);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
namespace app\controller;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\Project;
|
||||
use App\model\ProjectRegister;
|
||||
use App\model\ProjectDetailed;
|
||||
use App\dao\MessageDao;
|
||||
class ProjectRegisterController
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 报名函数
|
||||
*/
|
||||
public function signup(Request $request)
|
||||
{
|
||||
$user = $request->data;
|
||||
$data = $request->post();
|
||||
/**
|
||||
* 通过中间件获取userid
|
||||
*/
|
||||
$userid=$user['id'];
|
||||
$projectid=$data['projectid'];
|
||||
$type=$data['type'];
|
||||
$search_type=$type==1?'registerserve':'recruitingpersonnel';
|
||||
$res=ProjectDetailed::where('projectid',$projectid)->first();
|
||||
$Project=Project::where('id',$projectid)->first();
|
||||
if(ProjectRegister::where('projectid',$projectid)->where('type','=',$type)->count()==$res->$search_type){
|
||||
return ApiResponse::success(402,[],"当前报名人数已经满员");
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询用户是否报名过
|
||||
*/
|
||||
$issignup=ProjectRegister::where('userid',$userid)->where('projectid',$projectid)->count();
|
||||
if($issignup==0){
|
||||
$ProjectRegister=new ProjectRegister();
|
||||
$ProjectRegister->projectid=$projectid;
|
||||
$ProjectRegister->type=$type;
|
||||
$ProjectRegister->userid=$userid;
|
||||
$ProjectRegister->save();
|
||||
MessageDao::SendMessage($userid,"系统提醒","您已成功报名 $Project->title ");
|
||||
return ApiResponse::success(200,[],"报名成功");
|
||||
}
|
||||
return ApiResponse::success(402,$issignup,"您已经报名过了");
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
|
||||
use Tinywan\Jwt\JwtToken;
|
||||
use App\model\Users;
|
||||
|
||||
class UserController
|
||||
{
|
||||
|
||||
/**
|
||||
* 不需要登录的方法
|
||||
*/
|
||||
protected $noNeedLogin = ['login','register'];
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
* 登录
|
||||
* @param Request $request
|
||||
* @return void
|
||||
*/
|
||||
public function login(Request $request)
|
||||
{
|
||||
// 获取请求数据
|
||||
$data = $request->post();
|
||||
|
||||
// 根据手机号查询用户
|
||||
$db = Users::where('phone', '=', $data['phone'])->first();
|
||||
|
||||
// 如果未找到用户,返回错误
|
||||
if (!$db) {
|
||||
return ApiResponse::error(402,[] ,'用户未注册');
|
||||
}
|
||||
|
||||
// 获取用户输入的密码
|
||||
$password = $data['password'];
|
||||
|
||||
// 验证密码是否正确
|
||||
if (password_verify($password, $db->password)) {
|
||||
$user = [
|
||||
'id' => $db->id,
|
||||
'nickname' => $db->nickname,
|
||||
'phone' => $db->phone
|
||||
];
|
||||
// 如果密码正确,生成 JWT 令牌
|
||||
$token = JwtToken::generateToken($user);
|
||||
|
||||
// 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
return ApiResponse::success(200, [
|
||||
'user' => $user, // 返回用户信息
|
||||
'token' => $token // 返回生成的 token
|
||||
]);
|
||||
} else {
|
||||
// 密码错误,返回错误响应
|
||||
return ApiResponse::error(402,[], '用户或密码错误');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册
|
||||
*/
|
||||
public function register(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$res = [];
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\admin\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\Admin;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
use Intervention\Image\ImageManagerStatic as Image;
|
||||
use Exception;
|
||||
use support\exception\BusinessException;
|
||||
use Tinywan\Jwt\JwtToken;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("用户控制器")
|
||||
*/
|
||||
class AccountController
|
||||
{
|
||||
/**
|
||||
* 不需要登录的方法
|
||||
*/
|
||||
protected $noNeedLogin = ['login', 'refresh'];
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 登录")
|
||||
* @Apidoc\Url("admin/api/v1/account/login")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Param("username", type="string",require=true, desc="用户名")
|
||||
* @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
* @Apidoc\Returned("token", type="object", desc="令牌")
|
||||
*/
|
||||
public function login(Request $request)
|
||||
{
|
||||
// 获取请求数据
|
||||
$data = $request->post();
|
||||
|
||||
// 根据手机号查询用户
|
||||
$db = Admin::where('username', '=', $data['username'])->first();
|
||||
|
||||
// 如果未找到用户,返回错误
|
||||
if (!$db) {
|
||||
return ApiResponse::error(402, [], '用户未注册');
|
||||
}
|
||||
|
||||
// 获取用户输入的密码
|
||||
$password = $data['password'];
|
||||
|
||||
// 验证密码是否正确
|
||||
if (password_verify($password, $db->password)) {
|
||||
$user = [
|
||||
'id' => $db->id,
|
||||
'nickname' => $db->nickname,
|
||||
'username' => $db->username
|
||||
];
|
||||
// 如果密码正确,生成 JWT 令牌
|
||||
$token = JwtToken::generateToken($user);
|
||||
|
||||
// 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
return ApiResponse::success(200, [
|
||||
'user' => $user, // 返回用户信息
|
||||
'token' => $token // 返回生成的 token
|
||||
]);
|
||||
} else {
|
||||
// 密码错误,返回错误响应
|
||||
return ApiResponse::error(402, [], '密码错误');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 刷新token")
|
||||
* @Apidoc\Url("admin/api/v1/account/refresh")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Param("refresh_token", type="string",require=true, desc="令牌")
|
||||
* @Apidoc\Returned("token", type="object", desc="令牌")
|
||||
*/
|
||||
public function refresh(Request $request) {
|
||||
$token = JwtToken::refreshToken();
|
||||
return ApiResponse::success(200, [
|
||||
'token' => $token // 返回生成的 token
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\admin\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\Carousel;
|
||||
use App\model\Carouselad;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("轮播图控制器")
|
||||
*/
|
||||
class CarouselController
|
||||
{
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取首页轮播图")
|
||||
* @Apidoc\Url("api/admin/v1/carousel/get_carousel")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_carousel(Request $request)
|
||||
{
|
||||
// return json(['code' => 0, 'msg' => 'ok']);
|
||||
$res = Carousel::all();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取首页底部轮播图")
|
||||
* @Apidoc\Url("api/admin/v1/carousel/get_carouselad")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_carouselad(Request $request)
|
||||
{
|
||||
$res = Carouselad::all();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 添加轮播图")
|
||||
* @Apidoc\Url("admin/api/v1/carousel/add")
|
||||
* @Apidoc\Param("type", type="int",require=true, desc="类型0是首页轮播图1是广告图")
|
||||
* @Apidoc\Param("img_url", type="string",require=true, desc="img_url")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function add(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
if ($data['type'] == 0) {
|
||||
$Carousel = new Carousel();
|
||||
} else {
|
||||
$Carousel = new Carouselad();
|
||||
}
|
||||
$Carousel->img_url = $data['img_url'];
|
||||
$Carousel->save();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 删除轮播图")
|
||||
* @Apidoc\Url("admin/api/v1/carousel/del")
|
||||
* @Apidoc\Param("type", type="int",require=true, desc="类型0是首页轮播图1是广告图")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="图片id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function del(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
if ($data['type'] == 0) {
|
||||
$Carousel = Carousel::where('id', $data['id'])->first();
|
||||
} else {
|
||||
$Carousel = Carouselad::where('id', $data['id'])->first();
|
||||
}
|
||||
$Carousel->delete();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 删除轮播图")
|
||||
* @Apidoc\Url("admin/api/v1/carousel/chang")
|
||||
* @Apidoc\Param("type", type="int",require=true, desc="类型0是首页轮播图1是广告图")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="图片id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function chang(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
if ($data['type'] == 0) {
|
||||
$Carousel = Carousel::where('id', $data['id'])->first();
|
||||
} else {
|
||||
$Carousel = Carouselad::where('id', $data['id'])->first();
|
||||
}
|
||||
$Carousel->img_url = $data['img_url'];
|
||||
$Carousel->save();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\admin\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\ProjectDetailed;
|
||||
use App\model\Project;
|
||||
use App\model\Hotinformation;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
/**
|
||||
* @Apidoc\Title("文章控制器")
|
||||
*/
|
||||
class HotinformationController{
|
||||
protected $noNeedLogin = ['get_list','get_details'];
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取所有文章")
|
||||
* @Apidoc\Url("admin/api/v1/hotinformation/get_list")
|
||||
* @Apidoc\Param("type", type="int",require=true, desc="0是热点资讯1是银龄")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_list(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$res = Hotinformation::where('type', $data['type'])->get();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取文章详细")
|
||||
* @Apidoc\Url("admin/api/v1/hotinformation/get_details")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="文章id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_details(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$res = Hotinformation::where('id', $data['id'])->first();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 编辑文章")
|
||||
* @Apidoc\Url("admin/api/v1/hotinformation/edi")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="文章id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function edi(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$hotinformation = Hotinformation::where('id', $data['id'])->first();
|
||||
if(!isset($hotinformation)){
|
||||
$hotinformation=new Hotinformation();
|
||||
}
|
||||
$hotinformation->title=$data['title'];
|
||||
$hotinformation->writer=$data['writer'];
|
||||
$hotinformation->content=$data['content'];
|
||||
$hotinformation->type=$data['type'];
|
||||
$hotinformation->img=$data['img'];
|
||||
$hotinformation->weight=$data['weight'];
|
||||
$hotinformation->save();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 删除文章")
|
||||
* @Apidoc\Url("admin/api/v1/hotinformation/del")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="文章id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function del(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$hotinformation = Hotinformation::where('id', $data['id'])->first();
|
||||
$hotinformation->delete();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\admin\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\ProjectDetailed;
|
||||
use App\model\Project;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
class projectController{
|
||||
protected $noNeedLogin = ['edi'];
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取首页轮播图")
|
||||
* @Apidoc\Url("admin/api/v1/project/edi")
|
||||
* @Apidoc\Param("projectid", type="int",require=true, desc="项目id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function edi(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
|
||||
if($data['projectid']>0){
|
||||
$project = Project::where('id', $data['projectid'])->first();
|
||||
$projectDetailed = ProjectDetailed::where('projectid', $data['projectid'])->first();
|
||||
}else{
|
||||
$project =new Project();
|
||||
$projectDetailed =new ProjectDetailed();
|
||||
}
|
||||
$project->img=$data['img'];
|
||||
$project->start_time=$data['start_time'];
|
||||
$project->end_time=$data['end_time'];
|
||||
$project->address=$data['address'];
|
||||
$project->title=$data['title'];
|
||||
$project->type=$data['type'];
|
||||
$project->save();
|
||||
$id=Project::where('img', $data['img'])->first();
|
||||
$id=$id->id;
|
||||
$projectDetailed->projectid = $id;
|
||||
$projectDetailed->recruitingpersonnel=(int)$data['recruitingpersonnel'];
|
||||
$projectDetailed->registerserve=(int)$data['registerserve'];
|
||||
$projectDetailed->servicedescription=$data['servicedescription'];
|
||||
$projectDetailed->totalnumberoftimecoins=(int)$data['totalnumberoftimecoins'];
|
||||
$projectDetailed->volunteergender=(int)$data['volunteergender'];
|
||||
$projectDetailed->volunteerage=(int)$data['volunteerage'];
|
||||
$projectDetailed->registrationisclosed=$data['registrationisclosed'];
|
||||
$projectDetailed->serviceduration=$minute=floor((strtotime($data['end_time'])-strtotime($data['start_time']))%86400/60);;
|
||||
$projectDetailed->save();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 删除")
|
||||
* @Apidoc\Url("admin/api/v1/project/del")
|
||||
* @Apidoc\Param("projectid", type="int",require=true, desc="项目id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function del(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$project = Project::where('id', $data['projectid'])->first();
|
||||
$projectDetailed = ProjectDetailed::where('projectid', $data['projectid'])->first();
|
||||
$project->delete();
|
||||
$projectDetailed->delete();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,208 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\admin\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\Users;
|
||||
use App\model\BankLog;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
use App\dao\BankDao;
|
||||
use Intervention\Image\ImageManagerStatic as Image;
|
||||
use Exception;
|
||||
use support\exception\BusinessException;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("上传文件控制器")
|
||||
*/
|
||||
class UploadController
|
||||
{
|
||||
protected $noNeedLogin = ['image','index','imageAiEditor'];
|
||||
/**
|
||||
* @Apidoc\Title("1.0 测试图片上传")
|
||||
* @Apidoc\Url("admin/api/v1/Upload/image")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function image(Request $request)
|
||||
{
|
||||
// 调用 base 方法上传文件,指定上传目录
|
||||
$data = $this->base($request, '/upload/img/' . date('Ymd'));
|
||||
|
||||
// 获取上传文件的实际路径
|
||||
$realpath = $data['realpath'];
|
||||
|
||||
try {
|
||||
// 验证文件类型
|
||||
$validMimeTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
|
||||
if (!in_array(mime_content_type($realpath), $validMimeTypes)) {
|
||||
unlink($realpath);
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => '只允许上传图片文件'
|
||||
]);
|
||||
}
|
||||
|
||||
// 使用 Intervention Image 处理图片
|
||||
$img = Image::make($realpath);
|
||||
$max_height = 11700;
|
||||
$max_width = 11700;
|
||||
$width = $img->width();
|
||||
$height = $img->height();
|
||||
$ratio = 1;
|
||||
|
||||
// 如果图片尺寸超过限制,则按比例缩放
|
||||
if ($height > $max_height || $width > $max_width) {
|
||||
$ratio = $width > $height ? $max_width / $width : $max_height / $height;
|
||||
}
|
||||
// 缩放并保存图片
|
||||
$img->resize($width * $ratio, $height * $ratio)->save($realpath);
|
||||
} catch (Exception $e) {
|
||||
// 出现异常时,删除上传的文件并返回错误信息
|
||||
unlink($realpath);
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '处理图片发生错误'
|
||||
]);
|
||||
}
|
||||
|
||||
// 返回成功的响应,包含图片的 URL、文件名和文件大小
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '上传成功',
|
||||
'data' => [
|
||||
'url' => $data['url'],
|
||||
'name' => $data['name'],
|
||||
'size' => $data['size'],
|
||||
]
|
||||
]);
|
||||
}
|
||||
public function index(Request $request){
|
||||
return ApiResponse::success(200,[]);
|
||||
}
|
||||
/**
|
||||
* 获取上传数据
|
||||
* @param Request $request
|
||||
* @param $relative_dir
|
||||
* @return array
|
||||
* @throws BusinessException|\Random\RandomException
|
||||
*/
|
||||
protected function base(Request $request, $relative_dir): array
|
||||
{
|
||||
$relative_dir = ltrim($relative_dir, '\\/');
|
||||
$file = current($request->file());
|
||||
|
||||
if (!$file || !$file->isValid()) {
|
||||
throw new BusinessException('未找到上传文件', 400);
|
||||
}
|
||||
|
||||
// 使用配置文件中定义的上传路径
|
||||
// $uploadPath = config('upload.path'); // 从配置文件中获取路径
|
||||
$uploadPath = public_path('uploads/images');
|
||||
$base_dir = rtrim($uploadPath, '\\/');
|
||||
|
||||
// 如果路径不存在,创建路径
|
||||
$full_dir = $base_dir . DIRECTORY_SEPARATOR . $relative_dir;
|
||||
if (!is_dir($full_dir)) {
|
||||
mkdir($full_dir, 0777, true);
|
||||
}
|
||||
|
||||
// 处理上传的文件
|
||||
$ext = $file->getUploadExtension() ?: null;
|
||||
$mime_type = $file->getUploadMimeType();
|
||||
$file_name = $file->getUploadName();
|
||||
$file_size = $file->getSize();
|
||||
|
||||
// 文件类型验证
|
||||
if (!$ext && $file_name === 'blob') {
|
||||
[$___image, $ext] = explode('/', $mime_type);
|
||||
unset($___image);
|
||||
}
|
||||
|
||||
$ext = strtolower($ext);
|
||||
$ext_forbidden_map = ['php', 'php3', 'php5', 'css', 'js', 'html', 'htm', 'asp', 'jsp'];
|
||||
if (in_array($ext, $ext_forbidden_map)) {
|
||||
throw new BusinessException('不支持该格式的文件上传', 400);
|
||||
}
|
||||
|
||||
// 生成文件路径
|
||||
$relative_path = $relative_dir . '/' . bin2hex(pack('Nn', time(), random_int(1, 65535))) . ".$ext";
|
||||
$full_path = $base_dir . DIRECTORY_SEPARATOR . $relative_path;
|
||||
|
||||
// 移动文件到新路径
|
||||
$file->move($full_path);
|
||||
|
||||
$image_with = $image_height = 0;
|
||||
if ($img_info = getimagesize($full_path)) {
|
||||
[$image_with, $image_height] = $img_info;
|
||||
$mime_type = $img_info['mime'];
|
||||
}
|
||||
|
||||
return [
|
||||
'url' => "https://weapp.ycylzj.com.cn/uploads/images/$relative_path",
|
||||
'name' => $file_name,
|
||||
'realpath' => $full_path,
|
||||
'size' => $file_size,
|
||||
'mime_type' => $mime_type,
|
||||
'image_with' => $image_with,
|
||||
'image_height' => $image_height,
|
||||
'ext' => $ext,
|
||||
];
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 AiEditor图片上传")
|
||||
* @Apidoc\Url("admin/api/v1/Upload/imageAiEditor")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function imageAiEditor(Request $request)
|
||||
{
|
||||
// 调用 base 方法上传文件,指定上传目录
|
||||
$data = $this->base($request, '/upload/img/' . date('Ymd'));
|
||||
|
||||
// 获取上传文件的实际路径
|
||||
$realpath = $data['realpath'];
|
||||
|
||||
try {
|
||||
// 验证文件类型
|
||||
$validMimeTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
|
||||
if (!in_array(mime_content_type($realpath), $validMimeTypes)) {
|
||||
unlink($realpath);
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => '只允许上传图片文件'
|
||||
]);
|
||||
}
|
||||
|
||||
// 使用 Intervention Image 处理图片
|
||||
$img = Image::make($realpath);
|
||||
$max_height = 11700;
|
||||
$max_width = 11700;
|
||||
$width = $img->width();
|
||||
$height = $img->height();
|
||||
$ratio = 1;
|
||||
|
||||
// 如果图片尺寸超过限制,则按比例缩放
|
||||
if ($height > $max_height || $width > $max_width) {
|
||||
$ratio = $width > $height ? $max_width / $width : $max_height / $height;
|
||||
}
|
||||
// 缩放并保存图片
|
||||
$img->resize($width * $ratio, $height * $ratio)->save($realpath);
|
||||
} catch (Exception $e) {
|
||||
// 出现异常时,删除上传的文件并返回错误信息
|
||||
unlink($realpath);
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '处理图片发生错误'
|
||||
]);
|
||||
}
|
||||
|
||||
// 返回成功的响应,包含图片的 URL、文件名和文件大小
|
||||
return json([
|
||||
'errorCode' => 0,
|
||||
'msg' => '上传成功',
|
||||
'data' => [
|
||||
'src' => $data['url'],
|
||||
'alt' => $data['url'],
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\admin\api\v1;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
use App\model\Volunteerservicecorp;
|
||||
use App\model\Users;
|
||||
use App\model\Volunteerservicecorpsdetailed;
|
||||
use App\model\Volunteerjoinrequest;
|
||||
use App\model\Message;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
use plugin\admin\app\model\User;
|
||||
use App\dao\VolunteerservicecorpsDao;
|
||||
/**
|
||||
* @Apidoc\Title("admin志愿者队伍控制器")
|
||||
*/
|
||||
|
||||
class VolunteerservicecorpsController
|
||||
{
|
||||
protected $noNeedLogin = ['get_volunteerservicecorp_list','get_volunteerservicecorp_details','del_volunteerservicecorp','add_volunteerservicecorp','edi_volunteerservicecorp'];
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 志愿队查询所有")
|
||||
* @Apidoc\Url("admin/api/v1/Volunteerservicecorps/get_volunteerservicecorp_list")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_volunteerservicecorp_list(Request $request)
|
||||
{
|
||||
$tmp = Volunteerservicecorp::all();
|
||||
$res = [];
|
||||
foreach ($tmp as $k => $v) {
|
||||
$tmp2 = Volunteerservicecorpsdetailed::where('groupid', $v->id)->get();
|
||||
$number = Volunteerservicecorpsdetailed::where('groupid', $v->id)->count();
|
||||
$leader = Users::where('id', $v->leaderid)->first(['nickname', 'phone', 'avatar']);
|
||||
foreach ($tmp2 as $key => $value) {
|
||||
$member[] = Users::where('id', $value->userid)->first(['nickname', 'phone', 'avatar']);
|
||||
}
|
||||
$res['group'][] = array('groupname' => $v->groupname, 'leaderid' => $v->leaderid, 'groupid' => $v->id, "category" => $v->category, 'img' => $v->img, 'number' => $number, 'leader' => $leader, 'member' => $member);
|
||||
}
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取志愿队伍详细信息根据id")
|
||||
* @Apidoc\Url("admin/api/v1/Volunteerservicecorps/get_volunteerservicecorp_details")
|
||||
* @Apidoc\Param("volunteerservicecorp_id", type="int",require=true, desc="队伍id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_volunteerservicecorp_details(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$volunteerservicecorp_id = $data['volunteerservicecorp_id'];
|
||||
$tmp = Volunteerservicecorp::where('id', $volunteerservicecorp_id)->get();
|
||||
$res = [];
|
||||
foreach ($tmp as $k => $v) {
|
||||
$tmp2 = Volunteerservicecorpsdetailed::where('groupid', $v->id)->get();
|
||||
$number = Volunteerservicecorpsdetailed::where('groupid', $v->id)->count();
|
||||
$leader = Users::where('id', $v->leaderid)->first(['nickname', 'phone', 'avatar']);
|
||||
foreach ($tmp2 as $key => $value) {
|
||||
$member[] = Users::where('id', $value->userid)->first(['nickname', 'phone', 'avatar']);
|
||||
}
|
||||
$res['group'] = array('groupname' => $v->groupname, 'leaderid' => $v->leaderid, "category" => $v->category, 'briefly' => $v->briefly, 'created_at' => $v->created_at, 'img' => $v->img, 'number' => $number, 'leader' => $leader, 'member' => $member);
|
||||
}
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 删除志愿队伍根据id")
|
||||
* @Apidoc\Url("admin/api/v1/Volunteerservicecorps/del_volunteerservicecorp")
|
||||
* @Apidoc\Param("groupid", type="int",require=true, desc="队伍id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function del_volunteerservicecorp(Request $request){
|
||||
$data = $request->post();
|
||||
VolunteerservicecorpsDao::del($data['groupid']);
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 增加志愿队伍")
|
||||
* @Apidoc\Url("admin/api/v1/Volunteerservicecorps/add_volunteerservicecorp")
|
||||
* @Apidoc\Param("leaderid", type="int",require=true, desc="组长用户id")
|
||||
* @Apidoc\Param("groupname", type="string",require=true, desc="组名称")
|
||||
* @Apidoc\Param("category", type="string",require=true, desc="组分类")
|
||||
* @Apidoc\Param("img", type="string",require=true, desc="首页图片url")
|
||||
* @Apidoc\Param("briefly", type="string",require=true, desc="队伍简介")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function add_volunteerservicecorp(Request $request){
|
||||
$data = $request->post();
|
||||
$col_array=['leaderid','groupname','category','img','briefly'];
|
||||
$Volunteerservicecorp=new Volunteerservicecorp();
|
||||
foreach($col_array as $v){
|
||||
$Volunteerservicecorp->$v=$data[$v];
|
||||
}
|
||||
$Volunteerservicecorp->save();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 修改志愿队伍")
|
||||
* @Apidoc\Url("admin/api/v1/Volunteerservicecorps/add_volunteerservicecorp")
|
||||
* @Apidoc\Param("leaderid", type="int",require=true, desc="组长用户id")
|
||||
* @Apidoc\Param("groupname", type="string",require=true, desc="组名称")
|
||||
* @Apidoc\Param("category", type="string",require=true, desc="组分类")
|
||||
* @Apidoc\Param("img", type="string",require=true, desc="首页图片url")
|
||||
* @Apidoc\Param("briefly", type="string",require=true, desc="队伍简介")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="队伍id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function edi_volunteerservicecorp(Request $request){
|
||||
$data = $request->post();
|
||||
$col_array=['leaderid','groupname','category','img','briefly'];
|
||||
$Volunteerservicecorp=Volunteerservicecorp::where('id',$data['id']);
|
||||
foreach($col_array as $v){
|
||||
$Volunteerservicecorp->$v=$data[$v];
|
||||
}
|
||||
$Volunteerservicecorp->save();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\Users;
|
||||
use App\model\BankLog;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
use App\dao\BankDao;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("时间币控制器")
|
||||
*/
|
||||
|
||||
class BankController
|
||||
{
|
||||
protected $noNeedLogin = ['index'];
|
||||
/**
|
||||
* @Apidoc\Title("1.0 测试")
|
||||
* @Apidoc\Url("api/v1/bank/index")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取当前用户时间币余额")
|
||||
* @Apidoc\Url("api/v1/bank/get")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Returned("timecoin", type="int", desc="余额")
|
||||
*/
|
||||
public function get(Request $request)
|
||||
{
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$res = Users::where('id', $userid)->first('timecoin');
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取当前用户时间币记录")
|
||||
* @Apidoc\Url("api/v1/bank/get_back_log")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_back_log(Request $request)
|
||||
{
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$res = BankLog::where('userid', $userid)->orderBy('created_at', 'desc')->limit(3)->get();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取当前用户时间币所有记录")
|
||||
* @Apidoc\Url("api/v1/bank/get_back_log_all")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_back_log_all(Request $request)
|
||||
{
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$res = BankLog::where('userid', $userid)->orderBy('created_at', 'desc')->get();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 转账时间币到其他用户")
|
||||
* @Apidoc\Url("api/v1/bank/transfer")
|
||||
* @Apidoc\Param("amount", type="int",require=true, desc="金额",default="1")
|
||||
* @Apidoc\Param("phone", type="int",require=true, desc="收款人手机号",default="我是你爹")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function transfer(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$amount = $data['amount'];
|
||||
$phone = $data['phone'];
|
||||
$res = BankDao::transfer($userid, $phone, $amount);
|
||||
if($res['status']=='error'){
|
||||
return ApiResponse::success(402, $res);
|
||||
}
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 增加时间币测试")
|
||||
* @Apidoc\Url("api/v1/bank/add")
|
||||
* @Apidoc\Param("amount", type="int",require=true, desc="金额",default="1")
|
||||
* @Apidoc\Param("remark", type="string",require=true, desc="备注",default="我是你爹")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function add(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$amount = $data['amount'];
|
||||
$remark = $data['remark'];
|
||||
BankDao::add($userid, $amount, $remark);
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 搜索转账人")
|
||||
* @Apidoc\Url("api/v1/bank/search_user")
|
||||
* @Apidoc\Param("key", type="string",require=true, desc="关键词",default="1")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function search_user(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$users = Users::where('nickname', 'like', '%' . $data['key'] . '%')
|
||||
->orWhere('phone', 'like', '%' . $data['key'] . '%')
|
||||
->get(['id','nickname','phone']);
|
||||
return ApiResponse::success(200, $users);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\Users;
|
||||
use App\model\Contact;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
use App\dao\BankDao;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("联系人控制器")
|
||||
*/
|
||||
|
||||
class ContactController
|
||||
{
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取当前用户联系人列表")
|
||||
* @Apidoc\Url("api/v1/contact/get")
|
||||
* @Apidoc\Param("id", type="int",require=false, desc="联系人id",default="")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get(Request $request)
|
||||
{
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$data = $request->post();
|
||||
if (isset($data['id'])) {
|
||||
$res = Contact::where('userid', $userid)->where('id', $data['id'])->first(['id', 'name', 'phone', 'relationship']);
|
||||
} else {
|
||||
$res = Contact::where('userid', $userid)->get(['id', 'name', 'phone', 'relationship']);
|
||||
}
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 增加联系人")
|
||||
* @Apidoc\Url("api/v1/contact/add_contact")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Param("name", type="string",require=true, desc="联系人姓名",default="我是你爹")
|
||||
* @Apidoc\Param("phone", type="int",require=true, desc="手机号",default="")
|
||||
* @Apidoc\Param("relationship", type="int",require=true, desc="关系",default="0")
|
||||
*/
|
||||
public function add_contact(Request $request)
|
||||
{
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$data = $request->post();
|
||||
|
||||
$count=Contact::where('userid',$userid)->where('phone',$data['phone'])->count();
|
||||
if($count>0){
|
||||
return ApiResponse::success(402, [],'联系人手机号已存在');
|
||||
}
|
||||
|
||||
$contact = new Contact();
|
||||
$contact->name = $data['name'];
|
||||
$contact->phone = $data['phone'];
|
||||
$contact->relationship = $data['relationship'];
|
||||
$contact->userid = $userid;
|
||||
$contact->save();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 编辑联系人")
|
||||
* @Apidoc\Url("api/v1/contact/edi_contact")
|
||||
* @Apidoc\Param("name", type="string",require=true, desc="联系人姓名",default="我是你爹")
|
||||
* @Apidoc\Param("phone", type="int",require=true, desc="手机号",default="")
|
||||
* @Apidoc\Param("relationship", type="int",require=true, desc="关系",default="0")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="记录id",default="0")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function edi_contact(Request $request)
|
||||
{
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$data = $request->post();
|
||||
$contact = Contact::where('userid', $userid)->where('id', $data['id'])->first();
|
||||
$contact->name = $data['name'];
|
||||
$contact->phone = $data['phone'];
|
||||
$contact->relationship = $data['relationship'];
|
||||
$contact->userid = $userid;
|
||||
$contact->save();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 删除联系人")
|
||||
* @Apidoc\Url("api/v1/contact/del_contact")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="记录id",default="0")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function del_contact(Request $request)
|
||||
{
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$data = $request->post();
|
||||
$contact = Contact::where('userid', $userid)->where('id', $data['id'])->first();
|
||||
$contact->delete();
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
use App\model\Dictionary;
|
||||
// use App\dao\UserDao;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("客服字典")
|
||||
*/
|
||||
class DictionaryController
|
||||
{
|
||||
/**d
|
||||
* @Apidoc\Title("查找所有客服字典")
|
||||
* @Apidoc\Url("/api/v1/dictionary/lists")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function lists()
|
||||
{
|
||||
//根据id查找用户
|
||||
$db = Dictionary::all();
|
||||
//操作不成功
|
||||
if (!$db) {
|
||||
return ApiResponse::error (402, '操作失败');
|
||||
}
|
||||
return ApiResponse::success (200, $db );
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("根据id更新客服字典")
|
||||
* @Apidoc\Url("/api/v1/dictionary/updateId")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Query("id", type="string",require=true, desc="id",default="1")
|
||||
* @Apidoc\Query("key", type="string",require=true, desc="key",default="1")
|
||||
* @Apidoc\Query("value", type="string",require=true, desc="value",default="1")
|
||||
*/
|
||||
public function updateId(Request $request)
|
||||
{
|
||||
|
||||
|
||||
$data = $request->post();
|
||||
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
$db = Dictionary::where('key', $key)->first();
|
||||
$db->value = $value;
|
||||
$db->save();
|
||||
}
|
||||
//根据id改数据库中的数据
|
||||
if (!$db) {
|
||||
return ApiResponse::error (402, '操作失败');
|
||||
}
|
||||
return ApiResponse::success (200, $db );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
use App\model\ExchangeRate;
|
||||
// use App\dao\UserDao;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("汇率")
|
||||
*/
|
||||
class ExchangeRateController
|
||||
{
|
||||
/**
|
||||
* @Apidoc\Title("查找所有汇率")
|
||||
* @Apidoc\Url("/api/v1/ExchangeRate/lists")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function lists()
|
||||
{
|
||||
//根据id查找用户
|
||||
$db = ExchangeRate::all();
|
||||
//操作不成功
|
||||
if (!$db) {
|
||||
return ApiResponse::error (402, '操作失败');
|
||||
}
|
||||
return ApiResponse::success (200, $db );
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("根据id更新汇率")
|
||||
* @Apidoc\Url("/api/v1/ExchangeRate/updateId")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Query("id", type="string",require=true, desc="id",default="1")
|
||||
* @Apidoc\Query("points", type="string",require=true, desc="points",default="1")
|
||||
* @Apidoc\Query("type", type="string",require=true, desc="type",default="1")
|
||||
*/
|
||||
public function updateId(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
foreach ($data as $key => $value) {
|
||||
$db = ExchangeRate::where('type', $key)->first();
|
||||
$db->points = $value;
|
||||
$db->save();
|
||||
}
|
||||
//根据id改数据库中的数据
|
||||
if (!$db) {
|
||||
return ApiResponse::error (402, '操作失败');
|
||||
}
|
||||
return ApiResponse::success (200, $db );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\Users;
|
||||
use App\model\Hotinformation;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
use App\dao\BankDao;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("文章控制器")
|
||||
*/
|
||||
|
||||
class HotinformationController
|
||||
{
|
||||
protected $noNeedLogin = ['get_list','get_details'];
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取所有文章")
|
||||
* @Apidoc\Url("api/v1/hotinformation/get_list")
|
||||
* @Apidoc\Param("type", type="int",require=true, desc="0是热点资讯1是银龄")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_list(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$res = Hotinformation::where('type', $data['type'])->get();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取文章详细")
|
||||
* @Apidoc\Url("api/v1/hotinformation/get_details")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="文章id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_details(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$res = Hotinformation::where('id', $data['id'])->first();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use Webman\Controller;
|
||||
use support\Request;
|
||||
use support\Response;
|
||||
use Webman\File;
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
class ImageController
|
||||
{
|
||||
// 显示上传图片的页面
|
||||
public function showUploadForm()
|
||||
{
|
||||
return view('admin.image_upload');
|
||||
}
|
||||
|
||||
// 处理图片上传
|
||||
public function upload(Request $request)
|
||||
{
|
||||
// 获取上传的文件
|
||||
$file = $request->file('image');
|
||||
|
||||
// 验证文件是否上传成功
|
||||
if ($file && $file->isValid()) {
|
||||
// 设置保存路径
|
||||
$uploadPath = public_path('uploads/images');
|
||||
// 生成文件名,防止重名
|
||||
$filename = uniqid('img_', true) . '.' . $file->getUploadExtension();
|
||||
// 保存文件
|
||||
$file->move($uploadPath. $filename);
|
||||
|
||||
// 返回成功消息
|
||||
return ApiResponse::success(200, [
|
||||
'status' => 'success',
|
||||
'message' => '上传成功!',
|
||||
'file' => "/uploads/images/{$filename}",
|
||||
]);
|
||||
}
|
||||
|
||||
// 上传失败
|
||||
return ApiResponse::success(200, [
|
||||
'status' => 'error',
|
||||
'message' => '文件上传失败,请重试。',
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,219 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
use App\model\Invite;
|
||||
// use App\dao\UserDao;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("用户层级")
|
||||
*/
|
||||
class InviteController
|
||||
{
|
||||
/**
|
||||
* @Apidoc\Title("根据username找父级")
|
||||
* @Apidoc\Url("/api/v1/Invite/getDayId")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Query("id", type="string",require=true, desc="账户id",default="1")
|
||||
*/
|
||||
public function getDayId(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
//根据id查找用户
|
||||
$db = Invite::where('invitename', $data['id'])->first();
|
||||
//操作不成功
|
||||
if (!$db) {
|
||||
return ApiResponse::error (402, '操作失败');
|
||||
}
|
||||
return ApiResponse::success (200, $db );
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("根据username找子级")
|
||||
* @Apidoc\Url("/api/v1/Invite/getSonId")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Query("id", type="string",require=true, desc="账户id",default="1")
|
||||
*/
|
||||
public function getSonId(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$db = Invite::where('username', $data['id'])->get();
|
||||
|
||||
// 如果查询结果为空,返回错误信息
|
||||
if ($db->isEmpty()) {
|
||||
return ApiResponse::error(402, '操作失败');
|
||||
}
|
||||
|
||||
// 成功时返回查询结果
|
||||
return ApiResponse::success(200, $db);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 登录")
|
||||
// * @Apidoc\Url("api/v1/user/login")
|
||||
// * @Apidoc\Method("POST")
|
||||
// * @Apidoc\Param("phone", type="string",require=true, desc="用户名|手机号")
|
||||
// * @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
// * @Apidoc\Returned("user", type="object", desc="用户信息")
|
||||
// * @Apidoc\Returned("token", type="object", desc="令牌")
|
||||
// */
|
||||
// public function login(Request $request)
|
||||
// {
|
||||
// // 获取请求数据
|
||||
// $data = $request->post();
|
||||
|
||||
// // 根据手机号查询用户
|
||||
// $db = Users::where('phone', '=', $data['phone'])->first();
|
||||
|
||||
// // 如果未找到用户,返回错误
|
||||
// if (!$db) {
|
||||
// return ApiResponse::error(402, '用户未注册');
|
||||
// }
|
||||
|
||||
// // 获取用户输入的密码
|
||||
// $password = $data['password'];
|
||||
|
||||
// // 验证密码是否正确
|
||||
// if (password_verify($password, $db->password)) {
|
||||
// $user = [
|
||||
// 'id' => $db->id,
|
||||
// 'nickname' => $db->nickname,
|
||||
// 'phone' => $db->phone
|
||||
// ];
|
||||
// // 如果密码正确,生成 JWT 令牌
|
||||
// $token = JwtToken::generateToken($user);
|
||||
|
||||
// // 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
// return ApiResponse::success(200, [
|
||||
// 'user' => $user, // 返回用户信息
|
||||
// 'token' => $token // 返回生成的 token
|
||||
// ]);
|
||||
// } else {
|
||||
// // 密码错误,返回错误响应
|
||||
// return ApiResponse::error(402, '密码错误');
|
||||
// }
|
||||
// }
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 注册")
|
||||
// * @Apidoc\Url("api/v1/user/register")
|
||||
// * @Apidoc\Method("POST")
|
||||
// * @Apidoc\Param("phone", type="string",require=true, desc="用户名|手机号")
|
||||
// * @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
// * @Apidoc\Param("idcard", type="string",require=true, desc="身份证号")
|
||||
// * @Apidoc\Returned("token", type="object", desc="令牌")
|
||||
// */
|
||||
// public function register(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = UserDao::register($data['phone'], $data['password'], $data['idcard']);
|
||||
// if ($user['code'] != 200) {
|
||||
// return ApiResponse::error(402, [], $user['message']);
|
||||
// }
|
||||
// $db = Users::where('phone', '=', $data['phone'])->first();
|
||||
// $user = [
|
||||
// 'id' => $db->id,
|
||||
// 'nickname' => $db->nickname,
|
||||
// 'phone' => $db->phone
|
||||
// ];
|
||||
// // 如果密码正确,生成 JWT 令牌
|
||||
// $token = JwtToken::generateToken($user);
|
||||
// $msg = new Message();
|
||||
// $msg->title ="系统提醒";
|
||||
// $msg->content = "您已注册成功";
|
||||
// $msg->type =0;
|
||||
// $msg->userid =$db->id;
|
||||
// $msg->parameters="";
|
||||
// // 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
// return ApiResponse::success(200, [
|
||||
// 'user' => $user, // 返回用户信息
|
||||
// 'token' => $token // 返回生成的 token
|
||||
// ]);
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 修改用户信息")
|
||||
// * @Apidoc\Url("api/v1/user/edi")
|
||||
// * @Apidoc\Method("POST")
|
||||
// * @Apidoc\Param("nickname", type="string",require=true, desc="昵称")
|
||||
// * @Apidoc\Param("oldpassword", type="string",require=true, desc="旧密码")
|
||||
// * @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
// */
|
||||
// public function edi(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = $request->data;
|
||||
// $userid = $user['id'];
|
||||
// $db = Users::where('id', '=', $userid)->first();
|
||||
// if (isset($data['password']) && $data['password'] != '') {
|
||||
// if (password_verify($data['oldpassword'], $db->password)) {
|
||||
// UserDao::chang_passwd($userid, $data['password']);
|
||||
// return ApiResponse::success(200, [], "修改密码成功");
|
||||
// }
|
||||
// return ApiResponse::success(402, [], "旧密码错误");
|
||||
// }
|
||||
// if (isset($data['nickname']) && $data['nickname'] != '') {
|
||||
// UserDao::chang_nickname($userid, $data['nickname']);
|
||||
|
||||
// $user = [
|
||||
// 'id' => $db->id,
|
||||
// 'nickname' => $data['nickname'],
|
||||
// ];
|
||||
// // 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
// return ApiResponse::success(200, [
|
||||
// 'user' => $user, // 返回用户信息
|
||||
// ]);
|
||||
// }
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 获取用户信息")
|
||||
// * @Apidoc\Url("api/v1/user/get_info")
|
||||
// * @Apidoc\Method("POST")
|
||||
// */
|
||||
// public function get_info(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = $request->data;
|
||||
// $userid = $user['id'];
|
||||
// $db = Users::where('id', '=', $userid)->first(['phone', 'nickname']);
|
||||
// return ApiResponse::success(200, $db);
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 设置用户短信是否接受")
|
||||
// * @Apidoc\Url("api/v1/user/set_msg_setting")
|
||||
// * @Apidoc\Param("acceptmessages", type="int",require=true, desc="1接受0不接受")
|
||||
// * @Apidoc\Method("POST")
|
||||
// */
|
||||
// public function set_msg_setting(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = $request->data;
|
||||
// $userid = $user['id'];
|
||||
// $db = Users::where('id', '=', $userid)->first();
|
||||
// $db->acceptmessages=$data['acceptmessages'];
|
||||
// $db->save();
|
||||
// return ApiResponse::success(200, $db);
|
||||
// }
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 获取用户短信设置")
|
||||
// * @Apidoc\Url("api/v1/user/get_msg_setting")
|
||||
// * @Apidoc\Method("POST")
|
||||
// */
|
||||
// public function get_msg_setting(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = $request->data;
|
||||
// $userid = $user['id'];
|
||||
// $db = Users::where('id', '=', $userid)->first(['acceptmessages']);
|
||||
// return ApiResponse::success(200, $db);
|
||||
// }
|
||||
}
|
|
@ -0,0 +1,266 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
use App\model\Jobuser;
|
||||
// use App\dao\UserDao;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("JOB用户控制器")
|
||||
*/
|
||||
class JobuserController
|
||||
{
|
||||
/**
|
||||
* @Apidoc\Title("获取JOB用户列表")
|
||||
* @Apidoc\Url("/api/v1/jobuser/lists")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Param(name="black", type="string", desc="是否黑户", required=false)
|
||||
* @Apidoc\Param(name="username", type="string", desc="账号", required=false)
|
||||
*/
|
||||
public function lists(Request $request)
|
||||
{
|
||||
// 获取请求体中的参数
|
||||
$params = $request->all();
|
||||
|
||||
// 初始化查询构造器
|
||||
$query = Jobuser::query();
|
||||
|
||||
|
||||
if ($params['black'] === null) {
|
||||
// 查询 black 字段为 null 的记录
|
||||
$query->whereNull('black');
|
||||
} else {
|
||||
// 查询 black 字段等于指定值的记录
|
||||
$query->where('black', $params['black']);
|
||||
}
|
||||
|
||||
$query->when(!empty($params['username']), function ($query) use ($params) {
|
||||
$query->where('username', 'like', '%' . $params['username'] . '%');
|
||||
});
|
||||
$db = $query->get();
|
||||
return ApiResponse::success (200, $db);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("拉黑账户")
|
||||
* @Apidoc\Url("/api/v1/jobuser/getBlack")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Query("id", type="string",require=true, desc="账户id",default="1")
|
||||
*/
|
||||
public function getBlack(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
//根据id更改数据black字段的值
|
||||
$db = Jobuser::where('id', $data['id'])->update(['black'=>1]);
|
||||
//操作不成功
|
||||
if (!$db) {
|
||||
return ApiResponse::error (402, '操作失败');
|
||||
}
|
||||
return ApiResponse::success (200, $db );
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("洗白账户")
|
||||
* @Apidoc\Url("/api/v1/jobuser/getOutBlack")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Query("id", type="string",require=true, desc="账户id",default="1")
|
||||
*/
|
||||
public function getOutBlack(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
//根据id更改数据black字段的值
|
||||
$db = Jobuser::where('id', $data['id'])->update(['black'=>null]);
|
||||
//操作不成功
|
||||
if (!$db) {
|
||||
return ApiResponse::error (402, '操作失败');
|
||||
}
|
||||
return ApiResponse::success (200, $db );
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("根据id找账户")
|
||||
* @Apidoc\Url("/api/v1/jobuser/getUserById")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Query("id", type="string",require=true, desc="账户id",default="1")
|
||||
*/
|
||||
public function getUserById(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
//根据id查找用户
|
||||
$db = Jobuser::where('user_id', $data['id'])->first();
|
||||
//操作不成功
|
||||
if (!$db) {
|
||||
return ApiResponse::error (402, '操作失败');
|
||||
}
|
||||
return ApiResponse::success (200, $db );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 登录")
|
||||
// * @Apidoc\Url("api/v1/user/login")
|
||||
// * @Apidoc\Method("POST")
|
||||
// * @Apidoc\Param("phone", type="string",require=true, desc="用户名|手机号")
|
||||
// * @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
// * @Apidoc\Returned("user", type="object", desc="用户信息")
|
||||
// * @Apidoc\Returned("token", type="object", desc="令牌")
|
||||
// */
|
||||
// public function login(Request $request)
|
||||
// {
|
||||
// // 获取请求数据
|
||||
// $data = $request->post();
|
||||
|
||||
// // 根据手机号查询用户
|
||||
// $db = Users::where('phone', '=', $data['phone'])->first();
|
||||
|
||||
// // 如果未找到用户,返回错误
|
||||
// if (!$db) {
|
||||
// return ApiResponse::error(402, '用户未注册');
|
||||
// }
|
||||
|
||||
// // 获取用户输入的密码
|
||||
// $password = $data['password'];
|
||||
|
||||
// // 验证密码是否正确
|
||||
// if (password_verify($password, $db->password)) {
|
||||
// $user = [
|
||||
// 'id' => $db->id,
|
||||
// 'nickname' => $db->nickname,
|
||||
// 'phone' => $db->phone
|
||||
// ];
|
||||
// // 如果密码正确,生成 JWT 令牌
|
||||
// $token = JwtToken::generateToken($user);
|
||||
|
||||
// // 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
// return ApiResponse::success(200, [
|
||||
// 'user' => $user, // 返回用户信息
|
||||
// 'token' => $token // 返回生成的 token
|
||||
// ]);
|
||||
// } else {
|
||||
// // 密码错误,返回错误响应
|
||||
// return ApiResponse::error(402, '密码错误');
|
||||
// }
|
||||
// }
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 注册")
|
||||
// * @Apidoc\Url("api/v1/user/register")
|
||||
// * @Apidoc\Method("POST")
|
||||
// * @Apidoc\Param("phone", type="string",require=true, desc="用户名|手机号")
|
||||
// * @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
// * @Apidoc\Param("idcard", type="string",require=true, desc="身份证号")
|
||||
// * @Apidoc\Returned("token", type="object", desc="令牌")
|
||||
// */
|
||||
// public function register(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = UserDao::register($data['phone'], $data['password'], $data['idcard']);
|
||||
// if ($user['code'] != 200) {
|
||||
// return ApiResponse::error(402, [], $user['message']);
|
||||
// }
|
||||
// $db = Users::where('phone', '=', $data['phone'])->first();
|
||||
// $user = [
|
||||
// 'id' => $db->id,
|
||||
// 'nickname' => $db->nickname,
|
||||
// 'phone' => $db->phone
|
||||
// ];
|
||||
// // 如果密码正确,生成 JWT 令牌
|
||||
// $token = JwtToken::generateToken($user);
|
||||
// $msg = new Message();
|
||||
// $msg->title ="系统提醒";
|
||||
// $msg->content = "您已注册成功";
|
||||
// $msg->type =0;
|
||||
// $msg->userid =$db->id;
|
||||
// $msg->parameters="";
|
||||
// // 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
// return ApiResponse::success(200, [
|
||||
// 'user' => $user, // 返回用户信息
|
||||
// 'token' => $token // 返回生成的 token
|
||||
// ]);
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 修改用户信息")
|
||||
// * @Apidoc\Url("api/v1/user/edi")
|
||||
// * @Apidoc\Method("POST")
|
||||
// * @Apidoc\Param("nickname", type="string",require=true, desc="昵称")
|
||||
// * @Apidoc\Param("oldpassword", type="string",require=true, desc="旧密码")
|
||||
// * @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
// */
|
||||
// public function edi(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = $request->data;
|
||||
// $userid = $user['id'];
|
||||
// $db = Users::where('id', '=', $userid)->first();
|
||||
// if (isset($data['password']) && $data['password'] != '') {
|
||||
// if (password_verify($data['oldpassword'], $db->password)) {
|
||||
// UserDao::chang_passwd($userid, $data['password']);
|
||||
// return ApiResponse::success(200, [], "修改密码成功");
|
||||
// }
|
||||
// return ApiResponse::success(402, [], "旧密码错误");
|
||||
// }
|
||||
// if (isset($data['nickname']) && $data['nickname'] != '') {
|
||||
// UserDao::chang_nickname($userid, $data['nickname']);
|
||||
|
||||
// $user = [
|
||||
// 'id' => $db->id,
|
||||
// 'nickname' => $data['nickname'],
|
||||
// ];
|
||||
// // 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
// return ApiResponse::success(200, [
|
||||
// 'user' => $user, // 返回用户信息
|
||||
// ]);
|
||||
// }
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 获取用户信息")
|
||||
// * @Apidoc\Url("api/v1/user/get_info")
|
||||
// * @Apidoc\Method("POST")
|
||||
// */
|
||||
// public function get_info(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = $request->data;
|
||||
// $userid = $user['id'];
|
||||
// $db = Users::where('id', '=', $userid)->first(['phone', 'nickname']);
|
||||
// return ApiResponse::success(200, $db);
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 设置用户短信是否接受")
|
||||
// * @Apidoc\Url("api/v1/user/set_msg_setting")
|
||||
// * @Apidoc\Param("acceptmessages", type="int",require=true, desc="1接受0不接受")
|
||||
// * @Apidoc\Method("POST")
|
||||
// */
|
||||
// public function set_msg_setting(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = $request->data;
|
||||
// $userid = $user['id'];
|
||||
// $db = Users::where('id', '=', $userid)->first();
|
||||
// $db->acceptmessages=$data['acceptmessages'];
|
||||
// $db->save();
|
||||
// return ApiResponse::success(200, $db);
|
||||
// }
|
||||
// /**
|
||||
// * @Apidoc\Title("1.0 获取用户短信设置")
|
||||
// * @Apidoc\Url("api/v1/user/get_msg_setting")
|
||||
// * @Apidoc\Method("POST")
|
||||
// */
|
||||
// public function get_msg_setting(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $user = $request->data;
|
||||
// $userid = $user['id'];
|
||||
// $db = Users::where('id', '=', $userid)->first(['acceptmessages']);
|
||||
// return ApiResponse::success(200, $db);
|
||||
// }
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\Mechanism;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("养老机构控制器")
|
||||
*/
|
||||
|
||||
class MechanismController
|
||||
{
|
||||
protected $noNeedLogin = ['get_mechanism_list','get_mechanism_details'];
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取所有养老机构")
|
||||
* @Apidoc\Url("api/v1/mechanism/get_mechanism_list")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_mechanism_list(Request $request)
|
||||
{
|
||||
$res = Mechanism::all();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取养老机构详细信息")
|
||||
* @Apidoc\Url("api/v1/mechanism/get_mechanism_details")
|
||||
* @Apidoc\Param("id", type="int",require=true, desc="养老机构id",default="1")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_mechanism_details(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$res = Mechanism::where('id', $data['id'])->first();
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
|
||||
use Tinywan\Jwt\JwtToken;
|
||||
use App\model\Message;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("消息提醒控制器")
|
||||
*/
|
||||
class MessageController{
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取所有消息")
|
||||
* @Apidoc\Url("api/v1/message/get_list")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Returned("list", type="object", desc="用户消息列表")
|
||||
*/
|
||||
public function get_list(Request $request){
|
||||
$user = $request->data;
|
||||
$userid=$user['id'];
|
||||
/**
|
||||
* 通过中间件获取userid
|
||||
*/
|
||||
$userid=$user['id'];
|
||||
$res = Message::where('userid',$userid)->get();
|
||||
return ApiResponse::success(200,$res);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
use App\model\Users;
|
||||
use App\model\BankLog;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
use App\dao\BankDao;
|
||||
use App\model\Mechanism;
|
||||
use App\model\Hotinformation;
|
||||
use simplehtmldom\HtmlDocument;
|
||||
/**
|
||||
* @Apidoc\Title("自己用的批量修改控制器")
|
||||
*/
|
||||
class SetController
|
||||
{
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取所有养老机构")
|
||||
* @Apidoc\Url("api/v1/Set/chang_url")
|
||||
* @Apidoc\Param("url", type="string",require=true, desc="url",default="http://")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function chang_url(Request $request)
|
||||
{
|
||||
$url = "39.98.251.138";
|
||||
$res = Hotinformation::all();
|
||||
foreach($res as $k => $v){
|
||||
$html = new HtmlDocument();
|
||||
$html->load($v->content);
|
||||
$img = $html->find('img');
|
||||
foreach ($img as $paragraph) {
|
||||
$paragraph->src=str_replace("127.0.0.1:8787", $url, $paragraph->src);
|
||||
}
|
||||
$change_img_attr=$html->save();
|
||||
$v->img=str_replace("127.0.0.1:8787", $url, $v->img);
|
||||
$v->content = $change_img_attr;
|
||||
$v->save();
|
||||
}
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,186 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
|
||||
use Tinywan\Jwt\JwtToken;
|
||||
use App\model\Users;
|
||||
use App\model\Message;
|
||||
use App\dao\UserDao;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("用户控制器")
|
||||
*/
|
||||
class UserController
|
||||
{
|
||||
|
||||
/**
|
||||
* 不需要登录的方法
|
||||
*/
|
||||
protected $noNeedLogin = ['login', 'register'];
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 登录")
|
||||
* @Apidoc\Url("api/v1/user/login")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Param("phone", type="string",require=true, desc="用户名|手机号")
|
||||
* @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
* @Apidoc\Returned("user", type="object", desc="用户信息")
|
||||
* @Apidoc\Returned("token", type="object", desc="令牌")
|
||||
*/
|
||||
public function login(Request $request)
|
||||
{
|
||||
// 获取请求数据
|
||||
$data = $request->post();
|
||||
|
||||
// 根据手机号查询用户
|
||||
$db = Users::where('phone', '=', $data['phone'])->first();
|
||||
|
||||
// 如果未找到用户,返回错误
|
||||
if (!$db) {
|
||||
return ApiResponse::error(402, '用户未注册');
|
||||
}
|
||||
|
||||
// 获取用户输入的密码
|
||||
$password = $data['password'];
|
||||
|
||||
// 验证密码是否正确
|
||||
if (password_verify($password, $db->password)) {
|
||||
$user = [
|
||||
'id' => $db->id,
|
||||
'nickname' => $db->nickname,
|
||||
'phone' => $db->phone
|
||||
];
|
||||
// 如果密码正确,生成 JWT 令牌
|
||||
$token = JwtToken::generateToken($user);
|
||||
|
||||
// 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
return ApiResponse::success(200, [
|
||||
'user' => $user, // 返回用户信息
|
||||
'token' => $token // 返回生成的 token
|
||||
]);
|
||||
} else {
|
||||
// 密码错误,返回错误响应
|
||||
return ApiResponse::error(402, '密码错误');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 注册")
|
||||
* @Apidoc\Url("api/v1/user/register")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Param("phone", type="string",require=true, desc="用户名|手机号")
|
||||
* @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
* @Apidoc\Param("idcard", type="string",require=true, desc="身份证号")
|
||||
* @Apidoc\Returned("token", type="object", desc="令牌")
|
||||
*/
|
||||
public function register(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$user = UserDao::register($data['phone'], $data['password'], $data['idcard']);
|
||||
if ($user['code'] != 200) {
|
||||
return ApiResponse::error(402, [], $user['message']);
|
||||
}
|
||||
$db = Users::where('phone', '=', $data['phone'])->first();
|
||||
$user = [
|
||||
'id' => $db->id,
|
||||
'nickname' => $db->nickname,
|
||||
'phone' => $db->phone
|
||||
];
|
||||
// 如果密码正确,生成 JWT 令牌
|
||||
$token = JwtToken::generateToken($user);
|
||||
$msg = new Message();
|
||||
$msg->title ="系统提醒";
|
||||
$msg->content = "您已注册成功";
|
||||
$msg->type =0;
|
||||
$msg->userid =$db->id;
|
||||
$msg->parameters="";
|
||||
// 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
return ApiResponse::success(200, [
|
||||
'user' => $user, // 返回用户信息
|
||||
'token' => $token // 返回生成的 token
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 修改用户信息")
|
||||
* @Apidoc\Url("api/v1/user/edi")
|
||||
* @Apidoc\Method("POST")
|
||||
* @Apidoc\Param("nickname", type="string",require=true, desc="昵称")
|
||||
* @Apidoc\Param("oldpassword", type="string",require=true, desc="旧密码")
|
||||
* @Apidoc\Param("password", type="string",require=true, desc="密码")
|
||||
*/
|
||||
public function edi(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$db = Users::where('id', '=', $userid)->first();
|
||||
if (isset($data['password']) && $data['password'] != '') {
|
||||
if (password_verify($data['oldpassword'], $db->password)) {
|
||||
UserDao::chang_passwd($userid, $data['password']);
|
||||
return ApiResponse::success(200, [], "修改密码成功");
|
||||
}
|
||||
return ApiResponse::success(402, [], "旧密码错误");
|
||||
}
|
||||
if (isset($data['nickname']) && $data['nickname'] != '') {
|
||||
UserDao::chang_nickname($userid, $data['nickname']);
|
||||
|
||||
$user = [
|
||||
'id' => $db->id,
|
||||
'nickname' => $data['nickname'],
|
||||
];
|
||||
// 返回成功响应和用户信息(可以将 token 添加到响应中)
|
||||
return ApiResponse::success(200, [
|
||||
'user' => $user, // 返回用户信息
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取用户信息")
|
||||
* @Apidoc\Url("api/v1/user/get_info")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_info(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$db = Users::where('id', '=', $userid)->first(['phone', 'nickname']);
|
||||
return ApiResponse::success(200, $db);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("1.0 设置用户短信是否接受")
|
||||
* @Apidoc\Url("api/v1/user/set_msg_setting")
|
||||
* @Apidoc\Param("acceptmessages", type="int",require=true, desc="1接受0不接受")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function set_msg_setting(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$db = Users::where('id', '=', $userid)->first();
|
||||
$db->acceptmessages=$data['acceptmessages'];
|
||||
$db->save();
|
||||
return ApiResponse::success(200, $db);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取用户短信设置")
|
||||
* @Apidoc\Url("api/v1/user/get_msg_setting")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_msg_setting(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$db = Users::where('id', '=', $userid)->first(['acceptmessages']);
|
||||
return ApiResponse::success(200, $db);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,178 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
use App\model\Volunteerservicecorp;
|
||||
use App\model\Users;
|
||||
use App\model\Volunteerservicecorpsdetailed;
|
||||
use App\model\Volunteerjoinrequest;
|
||||
use App\model\Message;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
use plugin\admin\app\model\User;
|
||||
use App\dao\MessageDao;
|
||||
/**
|
||||
* @Apidoc\Title("志愿者队伍控制器")
|
||||
*/
|
||||
|
||||
class VolunteerservicecorpsController
|
||||
{
|
||||
protected $noNeedLogin = [];
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取所有志愿队伍")
|
||||
* @Apidoc\Url("api/v1/Volunteerservicecorps/get_volunteerservicecorp_list")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_volunteerservicecorp_list(Request $request)
|
||||
{
|
||||
$tmp = Volunteerservicecorp::all();
|
||||
$res = [];
|
||||
foreach ($tmp as $k => $v) {
|
||||
$tmp2 = Volunteerservicecorpsdetailed::where('groupid', $v->id)->get();
|
||||
$number = Volunteerservicecorpsdetailed::where('groupid', $v->id)->count();
|
||||
$leader = Users::where('id', $v->leaderid)->first(['nickname', 'phone', 'avatar']);
|
||||
foreach ($tmp2 as $key => $value) {
|
||||
$member[] = Users::where('id', $value->userid)->first(['nickname', 'phone', 'avatar']);
|
||||
}
|
||||
$res['group'][] = array('groupname' => $v->groupname, 'leaderid' => $v->leaderid, 'groupid' => $v->id, "category" => $v->category, 'img' => $v->img, 'number' => $number, 'leader' => $leader, 'member' => $member);
|
||||
}
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 获取志愿队伍详细信息根据id")
|
||||
* @Apidoc\Url("api/v1/Volunteerservicecorps/get_volunteerservicecorp_details")
|
||||
* @Apidoc\Param("volunteerservicecorp_id", type="int",require=true, desc="队伍id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function get_volunteerservicecorp_details(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$volunteerservicecorp_id = $data['volunteerservicecorp_id'];
|
||||
$tmp = Volunteerservicecorp::where('id', $volunteerservicecorp_id)->get();
|
||||
$res = [];
|
||||
foreach ($tmp as $k => $v) {
|
||||
$tmp2 = Volunteerservicecorpsdetailed::where('groupid', $v->id)->get();
|
||||
$number = Volunteerservicecorpsdetailed::where('groupid', $v->id)->count();
|
||||
$leader = Users::where('id', $v->leaderid)->first(['nickname', 'phone', 'avatar']);
|
||||
foreach ($tmp2 as $key => $value) {
|
||||
$member[] = Users::where('id', $value->userid)->first(['nickname', 'phone', 'avatar']);
|
||||
}
|
||||
$res['group'] = array('groupname' => $v->groupname, 'leaderid' => $v->leaderid, "category" => $v->category, 'briefly' => $v->briefly, 'created_at' => $v->created_at, 'img' => $v->img, 'number' => $number, 'leader' => $leader, 'member' => $member);
|
||||
}
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 志愿队伍报名接口")
|
||||
* @Apidoc\Url("api/v1/Volunteerservicecorps/join")
|
||||
* @Apidoc\Param("groupid", type="int",require=true, desc="队伍id")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function join(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$groupid = $data['groupid'];
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
//志愿者队伍
|
||||
$isjoin = Volunteerservicecorpsdetailed::where('groupid', $groupid)->where('userid', $userid)->count();
|
||||
//志愿者申请
|
||||
$filed = Volunteerjoinrequest::where('groupid', $groupid)->where('userid', $userid)->count();
|
||||
if ($isjoin > 0) {
|
||||
return ApiResponse::success(402, [], "您已经报名过了");
|
||||
}
|
||||
if ($filed > 0) {
|
||||
return ApiResponse::success(402, [], "申请已提交,待审核");
|
||||
}
|
||||
$tmp = Volunteerservicecorp::where('id', $groupid)->first();
|
||||
$volunteerjoinrequest = new volunteerjoinrequest();
|
||||
$volunteerjoinrequest->userid = $userid;
|
||||
$volunteerjoinrequest->groupid = $groupid;
|
||||
$volunteerjoinrequest->status = 0;
|
||||
$volunteerjoinrequest->remark = "";
|
||||
$volunteerjoinrequest->save();
|
||||
MessageDao::SendMessage($userid,"系统通知","$tmp->groupname 申请已提交 等待队长审批");
|
||||
//TODO这里没写队长通知 时间来不及
|
||||
// Unset($Message);
|
||||
// $Message = new Message();
|
||||
// $Message->content = "您有一条待审批消息";
|
||||
// $Message->title = "系统通知";
|
||||
$user = User::where('id', $userid)->first();
|
||||
$json['nickname'] = $user->nickname;
|
||||
$json['userid'] = $user->id;
|
||||
$json['groupid'] = $groupid;
|
||||
// $Message->parameters = json_encode($json);
|
||||
// $Message->userid = $tmp->leaderid;
|
||||
// $Message->save();
|
||||
MessageDao::SendMessage($tmp->leaderid,"系统通知","您有一条待审批消息",json_encode($json));
|
||||
return ApiResponse::success(200, []);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 志愿队伍搜索接口")
|
||||
* @Apidoc\Url("api/v1/Volunteerservicecorps/search")
|
||||
* @Apidoc\Param("type", type="int",require=true, desc="0是按照类型搜索1是按照名称")
|
||||
* @Apidoc\Param("key", type="string",require=true, desc="key")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function search(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$type = $data['type'];
|
||||
$key = $data['key'];
|
||||
var_dump($type);
|
||||
if ($type == 1) {
|
||||
$Volunteerservicecorp = Volunteerservicecorp::where('groupname', 'like', '%' . $key . '%')->get();
|
||||
} else {
|
||||
$Volunteerservicecorp = Volunteerservicecorp::where('category', 'like', '%' . $key . '%')->get();
|
||||
}
|
||||
$tmp = $Volunteerservicecorp;
|
||||
$res = [];
|
||||
foreach ($tmp as $k => $v) {
|
||||
$tmp2 = Volunteerservicecorpsdetailed::where('groupid', $v->id)->get();
|
||||
$number = Volunteerservicecorpsdetailed::where('groupid', $v->id)->count();
|
||||
$leader = Users::where('id', $v->leaderid)->first(['nickname', 'phone', 'avatar']);
|
||||
foreach ($tmp2 as $key => $value) {
|
||||
$member[] = Users::where('id', $value->userid)->first(['nickname', 'phone', 'avatar']);
|
||||
}
|
||||
$res['group'][] = array('groupname' => $v->groupname, 'leaderid' => $v->leaderid, 'groupid' => $v->id, "category" => $v->category, 'img' => $v->img, 'number' => $number, 'leader' => $leader, 'member' => $member);
|
||||
}
|
||||
return ApiResponse::success(200, $res);
|
||||
}
|
||||
/**
|
||||
* @Apidoc\Title("1.0 志愿队伍审批接口")
|
||||
* @Apidoc\Url("api/v1/Volunteerservicecorps/approval")
|
||||
* @Apidoc\Param("type", type="int",require=true, desc="0同意1不同意")
|
||||
* @Apidoc\Param("groupid", type="int",require=true, desc="队伍id")
|
||||
* @Apidoc\Param("userid", type="int",require=true, desc="userid")
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function approval(Request $request)
|
||||
{
|
||||
$data = $request->post();
|
||||
$user = $request->data;
|
||||
$userid = $user['id'];
|
||||
$Volunteerservicecorp = Volunteerservicecorp::where('id', $data['groupid'])->first();
|
||||
if ($userid != $Volunteerservicecorp->leaderid) {
|
||||
return ApiResponse::success(402, [], '不是队长没有审核权限');
|
||||
}
|
||||
if ($user['type'] == 0) {
|
||||
$volunteerservicecorpsdetailed = new Volunteerservicecorpsdetailed();
|
||||
$volunteerservicecorpsdetailed->userid = $data['userid'];
|
||||
$volunteerservicecorpsdetailed->groupid = $data['groupid'];
|
||||
$volunteerservicecorpsdetailed->save();
|
||||
$volunteerjoinrequest = volunteerjoinrequest::where('groupid', $data['groupid'])->where('userid', $data['userid'])->first();
|
||||
$volunteerjoinrequest->status = 2;
|
||||
$volunteerjoinrequest->save();
|
||||
$Volunteerservicecorp = Volunteerservicecorp::where('id', $data['groupid'])->first();
|
||||
MessageDao::SendMessage($data['userid'],"系统通知","您加入的志愿队 $Volunteerservicecorp->groupname 已同意申请");
|
||||
return ApiResponse::success(200, [], '成功');
|
||||
}
|
||||
$volunteerjoinrequest = volunteerjoinrequest::where('groupid', $data['groupid'])->where('userid', $data['userid'])->first();
|
||||
$volunteerjoinrequest->status = 1;
|
||||
MessageDao::SendMessage($data['userid'],"系统通知","您加入的志愿队 $Volunteerservicecorp->groupname 已拒绝您的申请");
|
||||
$volunteerjoinrequest->save();
|
||||
return ApiResponse::success(200, [], '成功');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api\v1;
|
||||
|
||||
use support\Request;
|
||||
use hg\apidoc\annotation as Apidoc;
|
||||
|
||||
use App\Utils\ApiResponse;
|
||||
|
||||
use App\model\Withdraw;
|
||||
// use App\dao\UserDao;
|
||||
|
||||
/**
|
||||
* @Apidoc\Title("提现管理")
|
||||
*/
|
||||
class WithdrawController
|
||||
{
|
||||
/**
|
||||
* @Apidoc\Title("查找所有提现记录")
|
||||
* @Apidoc\Url("/api/v1/withdraw/lists")
|
||||
* @Apidoc\Param(name="black", type="string", desc="是否黑户", required=false)
|
||||
* @Apidoc\Param(name="username", type="string", desc="账号", required=false)
|
||||
* @Apidoc\Method("POST")
|
||||
*/
|
||||
public function lists(Request $request)
|
||||
{
|
||||
//根据id查找用户
|
||||
$db = Withdraw::all();
|
||||
//操作不成功
|
||||
if (!$db) {
|
||||
return ApiResponse::error (402, '操作失败');
|
||||
}
|
||||
return ApiResponse::success (200, $db );
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @Apidoc\Title("根据username找子级")
|
||||
// * @Apidoc\Url("/api/v1/Invite/getSonId")
|
||||
// * @Apidoc\Method("POST")
|
||||
// * @Apidoc\Query("id", type="string",require=true, desc="账户id",default="1")
|
||||
// */
|
||||
// public function getSonId(Request $request)
|
||||
// {
|
||||
// $data = $request->post();
|
||||
// $db = Invite::where('username', $data['id'])->get();
|
||||
|
||||
// // 如果查询结果为空,返回错误信息
|
||||
// if ($db->isEmpty()) {
|
||||
// return ApiResponse::error(402, '操作失败');
|
||||
// }
|
||||
|
||||
// // 成功时返回查询结果
|
||||
// return ApiResponse::success(200, $db);
|
||||
// }
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
<?php
|
||||
|
||||
namespace app\dao;
|
||||
|
||||
use App\model\Users;
|
||||
use App\model\BankLog;
|
||||
use plugin\admin\app\model\User;
|
||||
|
||||
class BankDao {
|
||||
/**
|
||||
* 转账函数
|
||||
*
|
||||
* @param int $senderAccountId - 发送账户ID
|
||||
* @param int $receiverAccountId - 接收账户手机号
|
||||
* @param float $amount - 转账金额
|
||||
* @return array - 返回转账结果
|
||||
*/
|
||||
public static function transfer($senderAccountId, $receiverAccountId, $amount) {
|
||||
// 假设账户数据存储在一个简单的数组或数据库中
|
||||
// 模拟账户余额数据(实际应用中应查询数据库)
|
||||
$senderAccount=Users::where('id',$senderAccountId)->first();
|
||||
$receiverAccount=Users::where('phone',$receiverAccountId)->first();
|
||||
|
||||
// 检查接收账户是否存在
|
||||
if (!isset($receiverAccount)) {
|
||||
return ['status' => 'error', 'message' => '接收账户不存在'];
|
||||
}
|
||||
|
||||
// 检查转账金额是否合法
|
||||
if ($amount <= 0) {
|
||||
return ['status' => 'error', 'message' => '时间币必须大于0'];
|
||||
}
|
||||
|
||||
// 检查发送账户余额是否足够
|
||||
if ($senderAccount->timecoin < $amount) {
|
||||
return ['status' => 'error', 'message' => '时间币余额不足'];
|
||||
}
|
||||
|
||||
// 执行转账操作
|
||||
self::add($senderAccount->id,$amount-$amount*2,"赠送给 $receiverAccountId 时间币 $amount");
|
||||
self::add($receiverAccount->id,$amount,"收到 $senderAccount->phone 赠予 时间币 $amount");
|
||||
|
||||
return [
|
||||
'status' => 'success',
|
||||
'message' => '转账成功',
|
||||
];
|
||||
}
|
||||
/**
|
||||
* 增加时间币 传入负数就是减法
|
||||
*
|
||||
* @param [type] $userid 用户id
|
||||
* @param [type] $amount 金额
|
||||
* @param [type] $remark 备注
|
||||
* @return void
|
||||
*/
|
||||
public static function add($userid, $amount,$remark) {
|
||||
$user = Users::where('id',$userid)->first();
|
||||
$log=new BankLog();
|
||||
$log->userid=$userid;
|
||||
$log->money=$amount;
|
||||
$log->remark=$remark;
|
||||
$log->save();
|
||||
$user->timecoin+=$amount;
|
||||
$user->Save();
|
||||
|
||||
}
|
||||
/**
|
||||
* 减少用户时间币 好像废弃了
|
||||
*
|
||||
* @param [type] $userid 用户id
|
||||
* @param [type] $amount 金额
|
||||
* @param [type] $remark 备注
|
||||
* @return void
|
||||
*/
|
||||
public static function subtraction($userid, $amount,$remark) {
|
||||
$user = Users::where('id',$userid)->first('timecoin');
|
||||
$log=new BankLog();
|
||||
$log->userid=$userid;
|
||||
$log->money=$amount;
|
||||
$log->remark=$remark;
|
||||
$log->save();
|
||||
$user->timecoin-=$amount;
|
||||
$user->Save();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace app\dao;
|
||||
|
||||
use App\model\Message;
|
||||
use App\model\BankLog;
|
||||
use plugin\admin\app\model\User;
|
||||
|
||||
class MessageDao {
|
||||
/**
|
||||
* 发送消息 提醒
|
||||
*
|
||||
* @param [int] $to_user_id 用户id
|
||||
* @param [string] $title 标题
|
||||
* @param [string] $content 内容
|
||||
* @param string $parameters 携带参数
|
||||
* @return void
|
||||
*/
|
||||
public static function SendMessage($to_user_id,$title,$content,$parameters=""){
|
||||
$Message = new Message();
|
||||
$Message->content = $content;
|
||||
$Message->title = $title;
|
||||
$Message->parameters = $parameters;
|
||||
$Message->userid = $to_user_id;
|
||||
$Message->save();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
<?php
|
||||
|
||||
namespace app\dao;
|
||||
|
||||
use App\model\Users;
|
||||
use App\model\BankLog;
|
||||
use App\Utils\FunctionResponse;
|
||||
|
||||
|
||||
class UserDao
|
||||
{
|
||||
/**
|
||||
* 用户注册函数
|
||||
*
|
||||
* @param string $phone 手机号
|
||||
* @param string $password 密码
|
||||
* @param string $idcard 身份证号
|
||||
* @return mixed
|
||||
*/
|
||||
public static function register($phone, $password, $idcard)
|
||||
{
|
||||
// 检测手机号是否唯一
|
||||
if (Users::where('phone', $phone)->count() > 0) {
|
||||
return FunctionResponse::error(400, [], '手机号已存在');
|
||||
}
|
||||
|
||||
// 检测身份证号码 并提取信息
|
||||
$idCardInfo = self::getDetailsFromIdCard($idcard);
|
||||
if ($idCardInfo['code'] !== 200) {
|
||||
return $idCardInfo; // 返回错误信息
|
||||
}
|
||||
|
||||
// 你可以在此处添加更多的注册逻辑,例如:存储用户信息到数据库
|
||||
|
||||
// 假设我们通过 Users 模型来创建用户
|
||||
$user = new Users();
|
||||
$user->phone = $phone;
|
||||
$user->password = password_hash($password, PASSWORD_DEFAULT); // 密码加密
|
||||
$user->cardid = $idcard;
|
||||
$user->birthday = $idCardInfo['data']['birthDate']; // 出生日期
|
||||
$user->gender = $idCardInfo['data']['gender']; // 性别
|
||||
$user->avatar = ''; // 头像
|
||||
$user->save();
|
||||
|
||||
return FunctionResponse::success(200, ['$phone' => $phone], '注册成功');
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查身份证号,提取身份证号信息
|
||||
*
|
||||
* @param string $idCard
|
||||
* @return array
|
||||
*/
|
||||
private static function getDetailsFromIdCard($idCard)
|
||||
{
|
||||
$birthDate = '';
|
||||
$gender = '';
|
||||
|
||||
// 校验并处理18位身份证
|
||||
if (strlen($idCard) === 18) {
|
||||
// 提取出生日期
|
||||
$birthDate = substr($idCard, 6, 8); // 获取出生日期(YYYYMMDD)
|
||||
|
||||
// 性别判断:顺序码第17位奇数为男,偶数为女
|
||||
$genderCode = (int) $idCard[16];
|
||||
$gender = $genderCode % 2;
|
||||
} else {
|
||||
return FunctionResponse::error(400, [], '身份证格式不对');
|
||||
}
|
||||
|
||||
// 格式化出生日期
|
||||
$birthYear = substr($birthDate, 0, 4);
|
||||
$birthMonth = substr($birthDate, 4, 2);
|
||||
$birthDay = substr($birthDate, 6, 2);
|
||||
$formattedBirthDate = $birthYear . '-' . $birthMonth . '-' . $birthDay;
|
||||
|
||||
return FunctionResponse::success(200, [
|
||||
'birthDate' => $formattedBirthDate, // 出生日期格式化
|
||||
'gender' => $gender, // 性别
|
||||
]);
|
||||
}
|
||||
/**
|
||||
* 手机号是否唯一
|
||||
* @param [string] $phone
|
||||
* @return [bole] 有手机号返回 true 没有返回flase
|
||||
*/
|
||||
private static function isThePhoneNumberUnique($phone)
|
||||
{
|
||||
return Users::where('phone', $phone)->count() > 0;
|
||||
}
|
||||
/**
|
||||
* 修改密码
|
||||
* @param [int] $userid 用户id
|
||||
* @param [string] $phone 密码
|
||||
*/
|
||||
public static function chang_passwd($userid,$password){
|
||||
//哈希密码
|
||||
$hasa_password=password_hash($password, PASSWORD_DEFAULT);
|
||||
Users::where('id', $userid)->update(['password' => $hasa_password]);
|
||||
}
|
||||
/**
|
||||
* 修改用户名
|
||||
* @param [int] $userid 用户id
|
||||
* @param [string] $nickname 用户名
|
||||
*/
|
||||
public static function chang_nickname($userid,$nickname){
|
||||
Users::where('id', $userid)->update(['nickname' => $nickname]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
namespace app\dao;
|
||||
|
||||
use App\model\Users;
|
||||
use App\model\BankLog;
|
||||
use App\Utils\FunctionResponse;
|
||||
|
||||
use App\model\Volunteerservicecorp;
|
||||
|
||||
use App\model\Volunteerservicecorpsdetailed;
|
||||
use App\model\Volunteerjoinrequest;
|
||||
/**
|
||||
* 志愿者服务队Dao层
|
||||
*/
|
||||
class VolunteerservicecorpsDao {
|
||||
/**
|
||||
* 删除志愿者服务队
|
||||
* 连带审批记录一起删除
|
||||
* @param [type] $groupid
|
||||
* @return void
|
||||
*/
|
||||
public static function del($groupid){
|
||||
$Volunteerservicecorpsdetailed = Volunteerservicecorpsdetailed::where('groupid', $groupid)->first();
|
||||
$Volunteerservicecorpsdetailed->delete();
|
||||
$Volunteerservicecorp = Volunteerservicecorp::where('id', $groupid)->first();
|
||||
$Volunteerservicecorp->delete();
|
||||
$Volunteerjoinrequest=Volunteerjoinrequest::where('groupid', $groupid)->get();
|
||||
foreach($Volunteerjoinrequest as $k => $v){
|
||||
$v->delete();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
<?php
|
||||
/**
|
||||
* Here is your custom functions.
|
||||
*/
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace App\Middleware;
|
||||
|
||||
use Webman\MiddlewareInterface;
|
||||
use Webman\Http\Request;
|
||||
use Webman\Http\Response;
|
||||
|
||||
class CorsMiddleware implements MiddlewareInterface
|
||||
{
|
||||
public function process(Request $request, callable $handler) : Response
|
||||
{
|
||||
// 如果是options请求则返回一个空响应,否则继续向洋葱芯穿越,并得到一个响应
|
||||
$response = $request->method() == 'OPTIONS' ? response('') : $handler($request);
|
||||
// 给响应添加跨域相关的http头
|
||||
$response->withHeaders([
|
||||
'Access-Control-Allow-Credentials' => 'true',
|
||||
'Access-Control-Allow-Origin' => $request->header('origin', '*'),
|
||||
'Access-Control-Allow-Methods' => $request->header('access-control-request-method', '*'),
|
||||
'Access-Control-Allow-Headers' => $request->header('access-control-request-headers', '*'),
|
||||
]);
|
||||
return $response;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
namespace App\Middleware;
|
||||
|
||||
use Tinywan\Jwt\JwtToken;
|
||||
use App\Utils\ApiResponse;
|
||||
use Webman\Http\Request;
|
||||
use Webman\Http\Response;
|
||||
use Webman\MiddlewareInterface;
|
||||
|
||||
use ReflectionClass;
|
||||
|
||||
class JwtAuthMiddleware implements MiddlewareInterface
|
||||
{
|
||||
/**
|
||||
* 处理请求
|
||||
*
|
||||
* @param Request $request
|
||||
* @param callable $handler
|
||||
* @return Response
|
||||
*/
|
||||
public function process(Request $request, callable $handler): Response
|
||||
{
|
||||
|
||||
|
||||
/**
|
||||
* 通过反射获取不需要登录的方法
|
||||
*/
|
||||
$controller = new ReflectionClass($request->controller);
|
||||
/**
|
||||
* apidoc 直接继续向洋葱芯穿越
|
||||
*/
|
||||
if($controller->name=='hg\apidoc\Controller'){
|
||||
return $handler($request);
|
||||
}
|
||||
$noNeedLogin = $controller->getDefaultProperties()['noNeedLogin'] ?? [];
|
||||
if (in_array($request->action, $noNeedLogin)) {
|
||||
// 不需要登录的方法继续向洋葱芯穿越
|
||||
return $handler($request);
|
||||
}
|
||||
|
||||
// 获取 Authorization 头部中的 token,通常格式为 "Bearer <token>"
|
||||
$token = $request->header('Authorization') ?? '';
|
||||
|
||||
// 检查 token 是否为空
|
||||
if (empty($token)) {
|
||||
return ApiResponse::error(401, ['error' => '缺少令牌'], '未授权');
|
||||
}
|
||||
|
||||
// 移除 Bearer 前缀并获取纯 token
|
||||
// if (strpos($token, 'Bearer ') === 0) {
|
||||
// $token = substr($token, 7); // 去掉 "Bearer " 部分
|
||||
// }
|
||||
|
||||
try {
|
||||
// 解码 token,返回用户信息
|
||||
$decoded = JwtToken::getExtend($token);
|
||||
// var_dump($decoded);
|
||||
} catch (\Exception $e) {
|
||||
// 解码失败,返回无效令牌错误
|
||||
return ApiResponse::error(401, ['error' => '无效的令牌'], '未授权');
|
||||
}
|
||||
|
||||
// 将解码后的用户信息存储到请求对象的 user 属性中
|
||||
// $request = $request->withAttribute('user', $decoded);
|
||||
$request->data = $decoded;
|
||||
// 继续处理请求,传递给下一个中间件或控制器,并返回响应
|
||||
return $handler($request);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
namespace app\middleware;
|
||||
|
||||
use Webman\MiddlewareInterface;
|
||||
use Webman\Http\Response;
|
||||
use Webman\Http\Request;
|
||||
|
||||
/**
|
||||
* Class StaticFile
|
||||
* @package app\middleware
|
||||
*/
|
||||
class StaticFile implements MiddlewareInterface
|
||||
{
|
||||
public function process(Request $request, callable $next): Response
|
||||
{
|
||||
// Access to files beginning with. Is prohibited
|
||||
if (strpos($request->path(), '/.') !== false) {
|
||||
return response('<h1>403 forbidden</h1>', 403);
|
||||
}
|
||||
/** @var Response $response */
|
||||
$response = $next($request);
|
||||
// Add cross domain HTTP header
|
||||
/*$response->withHeaders([
|
||||
'Access-Control-Allow-Origin' => '*',
|
||||
'Access-Control-Allow-Credentials' => 'true',
|
||||
]);*/
|
||||
return $response;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id ID(主键)
|
||||
* @property string $username 用户名
|
||||
* @property string $nickname 昵称
|
||||
* @property string $password 密码
|
||||
* @property string $avatar 头像
|
||||
* @property string $email 邮箱
|
||||
* @property string $mobile 手机
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property string $login_at 登录时间
|
||||
* @property string $roles 角色
|
||||
* @property integer $status 状态 0正常 1禁用
|
||||
*/
|
||||
class Admin extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'wa_admins';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property integer $userid 关联用户id
|
||||
* @property integer $money
|
||||
* @property string $remark 备注
|
||||
*/
|
||||
class BankLog extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'bank_log';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property string $img_url 图片地址
|
||||
*/
|
||||
class Carousel extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'carousel';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property string $img_url 图片url
|
||||
*/
|
||||
class Carouselad extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'carouselad';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property integer $userid 用户id
|
||||
* @property integer $relationship 亲属关系0父母1子女2配偶3其他
|
||||
* @property string $name 姓名
|
||||
* @property integer $phone 电话
|
||||
*/
|
||||
class Contact extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'contact';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property string $key key
|
||||
* @property string $value value
|
||||
*/
|
||||
class Dictionary extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'dictionary';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
class ExchangeRate extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'exchange_rate';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property string $title 标题
|
||||
* @property string $writer 作者
|
||||
* @property string $content 内容
|
||||
* @property integer $type 类型0是热点资讯1是银龄动态
|
||||
* @property string $img 图片地址
|
||||
*/
|
||||
class Hotinformation extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'hotinformation';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
class Invite extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'invite';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
|
||||
public $timestamps = false;
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
class Jobuser extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'user';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
public $timestamps = false;
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property string $name 名称
|
||||
* @property integer $level 星级最高五级
|
||||
* @property string $address 地址
|
||||
* @property integer $bed 床位数
|
||||
* @property string $characteristic 特色
|
||||
* @property string $briefIntroduction 简介
|
||||
* @property string $imgurl 首页图片地址
|
||||
*/
|
||||
class Mechanism extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'mechanism';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property string $title 标题
|
||||
* @property string $content 内容
|
||||
* @property integer $type 消息类型 0通知1会话
|
||||
* @property integer $userid 用户id
|
||||
* @property string $parameters 携带参数
|
||||
*/
|
||||
class Message extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'message';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property string $img 首页图
|
||||
* @property string $start_time 开始时间
|
||||
* @property string $end_time 结束时间
|
||||
* @property string $address 地址
|
||||
* @property string $title 标题
|
||||
* @property string $type 分类
|
||||
*/
|
||||
class Project extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'project';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property integer $projectid 对应项目id(主键)
|
||||
* @property integer $serviceduration 服务时长单位分钟
|
||||
* @property integer $recruitingpersonnel 招募人数志愿者
|
||||
* @property integer $registerserve 招募人数被服务者
|
||||
* @property string $servicedescription 服务说明
|
||||
* @property integer $totalnumberoftimecoins 时间币/每个人
|
||||
* @property integer $volunteergender 志愿者性别要求1为男0为女
|
||||
* @property integer $volunteerage 志愿者年龄
|
||||
* @property string $registrationisclosed 报名截止日期
|
||||
*/
|
||||
class ProjectDetailed extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'project_detailed';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'projectid';
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property integer $projectid 项目id
|
||||
* @property integer $type 类型0是志愿者1是被服务者
|
||||
* @property integer $userid 用户id
|
||||
*/
|
||||
class ProjectRegister extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'project_register';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
class Test extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'test';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
/**
|
||||
* Indicates if the model should be timestamped.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
public $timestamps = false;
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property string $cardid 身份证号码
|
||||
* @property integer $phone 手机号码
|
||||
* @property string $nickname 昵称
|
||||
* @property integer $timecoin 时间币
|
||||
* @property integer $gender 性别1男性0女性
|
||||
* @property integer $status 1是启用0是禁止
|
||||
* @property string $birthday 出生日期
|
||||
* @property string $avatar 头像url地址
|
||||
* @property string $password 密码
|
||||
*/
|
||||
class Users extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'users';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property integer $userid 申请加入用户id
|
||||
* @property integer $status 状态码0提交申请1通过未加入2已完成
|
||||
* @property string $remark 用户申请备注
|
||||
* @property integer $groupid 用户申请的志愿队id
|
||||
*/
|
||||
class Volunteerjoinrequest extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'volunteerjoinrequest';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property integer $leaderid 组长id
|
||||
* @property string $groupname 组名
|
||||
* @property string $category 类目|分割
|
||||
* @property string $img 主要图
|
||||
* @property string $briefly 队伍简介
|
||||
*/
|
||||
class Volunteerservicecorp extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'volunteerservicecorps';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
/**
|
||||
* @property integer $id 主键(主键)
|
||||
* @property string $created_at 创建时间
|
||||
* @property string $updated_at 更新时间
|
||||
* @property integer $userid 用户id
|
||||
* @property integer $groupid 对应的组id
|
||||
*/
|
||||
class Volunteerservicecorpsdetailed extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'volunteerservicecorpsdetailed';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use support\Model;
|
||||
|
||||
class Withdraw extends Model
|
||||
{
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'withdraw';
|
||||
|
||||
/**
|
||||
* The primary key associated with the table.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
|
||||
public $timestamps = false;
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace app\process;
|
||||
|
||||
use Webman\App;
|
||||
|
||||
class Http extends App
|
||||
{
|
||||
|
||||
}
|
|
@ -0,0 +1,258 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
namespace app\process;
|
||||
|
||||
use FilesystemIterator;
|
||||
use RecursiveDirectoryIterator;
|
||||
use RecursiveIteratorIterator;
|
||||
use SplFileInfo;
|
||||
use Workerman\Timer;
|
||||
use Workerman\Worker;
|
||||
|
||||
/**
|
||||
* Class FileMonitor
|
||||
* @package process
|
||||
*/
|
||||
class Monitor
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $paths = [];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $extensions = [];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $loadedFiles = [];
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public static $lockFile = __DIR__ . '/../../runtime/monitor.lock';
|
||||
|
||||
/**
|
||||
* Pause monitor
|
||||
* @return void
|
||||
*/
|
||||
public static function pause()
|
||||
{
|
||||
file_put_contents(static::$lockFile, time());
|
||||
}
|
||||
|
||||
/**
|
||||
* Resume monitor
|
||||
* @return void
|
||||
*/
|
||||
public static function resume(): void
|
||||
{
|
||||
clearstatcache();
|
||||
if (is_file(static::$lockFile)) {
|
||||
unlink(static::$lockFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether monitor is paused
|
||||
* @return bool
|
||||
*/
|
||||
public static function isPaused(): bool
|
||||
{
|
||||
clearstatcache();
|
||||
return file_exists(static::$lockFile);
|
||||
}
|
||||
|
||||
/**
|
||||
* FileMonitor constructor.
|
||||
* @param $monitorDir
|
||||
* @param $monitorExtensions
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($monitorDir, $monitorExtensions, array $options = [])
|
||||
{
|
||||
static::resume();
|
||||
$this->paths = (array)$monitorDir;
|
||||
$this->extensions = $monitorExtensions;
|
||||
foreach (get_included_files() as $index => $file) {
|
||||
$this->loadedFiles[$file] = $index;
|
||||
if (strpos($file, 'webman-framework/src/support/App.php')) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!Worker::getAllWorkers()) {
|
||||
return;
|
||||
}
|
||||
$disableFunctions = explode(',', ini_get('disable_functions'));
|
||||
if (in_array('exec', $disableFunctions, true)) {
|
||||
echo "\nMonitor file change turned off because exec() has been disabled by disable_functions setting in " . PHP_CONFIG_FILE_PATH . "/php.ini\n";
|
||||
} else {
|
||||
if ($options['enable_file_monitor'] ?? true) {
|
||||
Timer::add(1, function () {
|
||||
$this->checkAllFilesChange();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$memoryLimit = $this->getMemoryLimit($options['memory_limit'] ?? null);
|
||||
if ($memoryLimit && ($options['enable_memory_monitor'] ?? true)) {
|
||||
Timer::add(60, [$this, 'checkMemory'], [$memoryLimit]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $monitorDir
|
||||
* @return bool
|
||||
*/
|
||||
public function checkFilesChange($monitorDir): bool
|
||||
{
|
||||
static $lastMtime, $tooManyFilesCheck;
|
||||
if (!$lastMtime) {
|
||||
$lastMtime = time();
|
||||
}
|
||||
clearstatcache();
|
||||
if (!is_dir($monitorDir)) {
|
||||
if (!is_file($monitorDir)) {
|
||||
return false;
|
||||
}
|
||||
$iterator = [new SplFileInfo($monitorDir)];
|
||||
} else {
|
||||
// recursive traversal directory
|
||||
$dirIterator = new RecursiveDirectoryIterator($monitorDir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS);
|
||||
$iterator = new RecursiveIteratorIterator($dirIterator);
|
||||
}
|
||||
$count = 0;
|
||||
foreach ($iterator as $file) {
|
||||
$count ++;
|
||||
/** var SplFileInfo $file */
|
||||
if (is_dir($file->getRealPath())) {
|
||||
continue;
|
||||
}
|
||||
// check mtime
|
||||
if (in_array($file->getExtension(), $this->extensions, true) && $lastMtime < $file->getMTime()) {
|
||||
$lastMtime = $file->getMTime();
|
||||
if (DIRECTORY_SEPARATOR === '/' && isset($this->loadedFiles[$file->getRealPath()])) {
|
||||
echo "$file updated but cannot be reloaded because only auto-loaded files support reload.\n";
|
||||
continue;
|
||||
}
|
||||
$var = 0;
|
||||
exec('"'.PHP_BINARY . '" -l ' . $file, $out, $var);
|
||||
if ($var) {
|
||||
continue;
|
||||
}
|
||||
echo $file . " updated and reload\n";
|
||||
// send SIGUSR1 signal to master process for reload
|
||||
if (DIRECTORY_SEPARATOR === '/') {
|
||||
posix_kill(posix_getppid(), SIGUSR1);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$tooManyFilesCheck && $count > 1000) {
|
||||
echo "Monitor: There are too many files ($count files) in $monitorDir which makes file monitoring very slow\n";
|
||||
$tooManyFilesCheck = 1;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function checkAllFilesChange(): bool
|
||||
{
|
||||
if (static::isPaused()) {
|
||||
return false;
|
||||
}
|
||||
foreach ($this->paths as $path) {
|
||||
if ($this->checkFilesChange($path)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $memoryLimit
|
||||
* @return void
|
||||
*/
|
||||
public function checkMemory($memoryLimit)
|
||||
{
|
||||
if (static::isPaused() || $memoryLimit <= 0) {
|
||||
return;
|
||||
}
|
||||
$ppid = posix_getppid();
|
||||
$childrenFile = "/proc/$ppid/task/$ppid/children";
|
||||
if (!is_file($childrenFile) || !($children = file_get_contents($childrenFile))) {
|
||||
return;
|
||||
}
|
||||
foreach (explode(' ', $children) as $pid) {
|
||||
$pid = (int)$pid;
|
||||
$statusFile = "/proc/$pid/status";
|
||||
if (!is_file($statusFile) || !($status = file_get_contents($statusFile))) {
|
||||
continue;
|
||||
}
|
||||
$mem = 0;
|
||||
if (preg_match('/VmRSS\s*?:\s*?(\d+?)\s*?kB/', $status, $match)) {
|
||||
$mem = $match[1];
|
||||
}
|
||||
$mem = (int)($mem / 1024);
|
||||
if ($mem >= $memoryLimit) {
|
||||
posix_kill($pid, SIGINT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get memory limit
|
||||
* @return float
|
||||
*/
|
||||
protected function getMemoryLimit($memoryLimit)
|
||||
{
|
||||
if ($memoryLimit === 0) {
|
||||
return 0;
|
||||
}
|
||||
$usePhpIni = false;
|
||||
if (!$memoryLimit) {
|
||||
$memoryLimit = ini_get('memory_limit');
|
||||
$usePhpIni = true;
|
||||
}
|
||||
|
||||
if ($memoryLimit == -1) {
|
||||
return 0;
|
||||
}
|
||||
$unit = strtolower($memoryLimit[strlen($memoryLimit) - 1]);
|
||||
if ($unit === 'g') {
|
||||
$memoryLimit = 1024 * (int)$memoryLimit;
|
||||
} else if ($unit === 'm') {
|
||||
$memoryLimit = (int)$memoryLimit;
|
||||
} else if ($unit === 'k') {
|
||||
$memoryLimit = ((int)$memoryLimit / 1024);
|
||||
} else {
|
||||
$memoryLimit = ((int)$memoryLimit / (1024 * 1024));
|
||||
}
|
||||
if ($memoryLimit < 30) {
|
||||
$memoryLimit = 30;
|
||||
}
|
||||
if ($usePhpIni) {
|
||||
$memoryLimit = (int)(0.8 * $memoryLimit);
|
||||
}
|
||||
return $memoryLimit;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="shortcut icon" href="/favicon.ico"/>
|
||||
<title>webman</title>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
hello <?=htmlspecialchars($name)?>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,66 @@
|
|||
{
|
||||
"name": "workerman/webman",
|
||||
"type": "project",
|
||||
"keywords": [
|
||||
"high performance",
|
||||
"http service"
|
||||
],
|
||||
"homepage": "https://www.workerman.net",
|
||||
"license": "MIT",
|
||||
"description": "High performance HTTP Service Framework.",
|
||||
"authors": [
|
||||
{
|
||||
"name": "walkor",
|
||||
"email": "walkor@workerman.net",
|
||||
"homepage": "https://www.workerman.net",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"email": "walkor@workerman.net",
|
||||
"issues": "https://github.com/walkor/webman/issues",
|
||||
"forum": "https://wenda.workerman.net/",
|
||||
"wiki": "https://workerman.net/doc/webman",
|
||||
"source": "https://github.com/walkor/webman"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.2",
|
||||
"workerman/webman-framework": "^1.5.0",
|
||||
"monolog/monolog": "^2.0",
|
||||
"webman/admin": "^0.6.33",
|
||||
"tinywan/jwt": "^1.6",
|
||||
"webman-micro/migrations": "^1.0",
|
||||
"webman/console": "^1.3",
|
||||
"vlucas/phpdotenv": "^5.6",
|
||||
"hg/apidoc": "^5.2",
|
||||
"hhink/webman-sms": "^1.0",
|
||||
"simplehtmldom/simplehtmldom": "^2.0@RC"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-event": "For better performance. "
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"": "./",
|
||||
"app\\": "./app",
|
||||
"App\\": "./app",
|
||||
"app\\View\\Components\\": "./app/view/components"
|
||||
},
|
||||
"files": [
|
||||
"./support/helpers.php"
|
||||
]
|
||||
},
|
||||
"scripts": {
|
||||
"post-package-install": [
|
||||
"support\\Plugin::install"
|
||||
],
|
||||
"post-package-update": [
|
||||
"support\\Plugin::install"
|
||||
],
|
||||
"pre-package-uninstall": [
|
||||
"support\\Plugin::uninstall"
|
||||
]
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
use support\Request;
|
||||
|
||||
return [
|
||||
'debug' => true,
|
||||
'error_reporting' => E_ALL,
|
||||
'default_timezone' => 'Asia/Shanghai',
|
||||
'request_class' => Request::class,
|
||||
'public_path' => base_path() . DIRECTORY_SEPARATOR . 'public',
|
||||
'runtime_path' => base_path(false) . DIRECTORY_SEPARATOR . 'runtime',
|
||||
'controller_suffix' => 'Controller',
|
||||
'controller_reuse' => false,
|
||||
];
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [
|
||||
'files' => [
|
||||
base_path() . '/app/functions.php',
|
||||
base_path() . '/support/Request.php',
|
||||
base_path() . '/support/Response.php',
|
||||
]
|
||||
];
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [
|
||||
support\bootstrap\Session::class,
|
||||
support\bootstrap\LaravelDb::class,
|
||||
];
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [
|
||||
'default' => 'file',
|
||||
'stores' => [
|
||||
'file' => [
|
||||
'driver' => 'file',
|
||||
'path' => runtime_path('cache')
|
||||
],
|
||||
'redis' => [
|
||||
'driver' => 'redis',
|
||||
'connection' => 'default'
|
||||
],
|
||||
'array' => [
|
||||
'driver' => 'array'
|
||||
]
|
||||
]
|
||||
];
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return new Webman\Container;
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
return [
|
||||
'default' => 'mysql',
|
||||
'connections' => [
|
||||
// 'mysql' => [
|
||||
// 'driver' => 'mysql',
|
||||
// 'host' => '149.129.107.38',
|
||||
// 'port' => '3306',
|
||||
// 'database' => 'wechatapplet',
|
||||
// 'username' => 'wechatapplet',
|
||||
// 'password' => 'Br6D722xXGB4tR7Z',
|
||||
// 'charset' => 'utf8mb4',
|
||||
// 'collation' => 'utf8mb4_general_ci',
|
||||
// 'prefix' => '',
|
||||
// 'strict' => true,
|
||||
// 'engine' => null,
|
||||
// ],
|
||||
'mysql' => [
|
||||
'driver' => 'mysql',
|
||||
'host' => '127.0.0.1',
|
||||
'port' => '3306',
|
||||
'database' => 'app_hd',
|
||||
'username' => 'root',
|
||||
'password' => '123456',
|
||||
'charset' => 'utf8mb4',
|
||||
'collation' => 'utf8mb4_general_ci',
|
||||
'prefix' => '',
|
||||
'strict' => true,
|
||||
'engine' => null,
|
||||
],
|
||||
],
|
||||
];
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [];
|
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
];
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [
|
||||
'' => support\exception\Handler::class,
|
||||
];
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [
|
||||
'default' => [
|
||||
'handlers' => [
|
||||
[
|
||||
'class' => Monolog\Handler\RotatingFileHandler::class,
|
||||
'constructor' => [
|
||||
runtime_path() . '/logs/webman.log',
|
||||
7, //$maxFiles
|
||||
Monolog\Logger::DEBUG,
|
||||
],
|
||||
'formatter' => [
|
||||
'class' => Monolog\Formatter\LineFormatter::class,
|
||||
'constructor' => [null, 'Y-m-d H:i:s', true],
|
||||
],
|
||||
]
|
||||
],
|
||||
],
|
||||
];
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [
|
||||
'' => [
|
||||
// ... 这里省略其它中间件
|
||||
app\middleware\CorsMiddleware::class,
|
||||
app\middleware\JwtAuthMiddleware::class,
|
||||
]
|
||||
];
|
|
@ -0,0 +1,97 @@
|
|||
<?php
|
||||
return [
|
||||
'enable' => true,
|
||||
'apidoc' => [
|
||||
// (选配)文档标题,显示在左上角与首页
|
||||
'title' => 'Apidoc',
|
||||
// (选配)文档描述,显示在首页
|
||||
'desc' => '',
|
||||
// (必须)设置文档的应用/版本
|
||||
'apps' => [
|
||||
[
|
||||
// (必须)标题
|
||||
'title'=>'Api接口',
|
||||
// (必须)控制器目录地址
|
||||
'path'=>'app\controller',
|
||||
// (必须)唯一的key
|
||||
'key'=>'api',
|
||||
]
|
||||
],
|
||||
// (必须)指定通用注释定义的文件地址
|
||||
'definitions' => "app\common\controller\Definitions",
|
||||
// (必须)自动生成url规则,当接口不添加@Apidoc\Url ("xxx")注解时,使用以下规则自动生成
|
||||
'auto_url' => [
|
||||
// 字母规则,lcfirst=首字母小写;ucfirst=首字母大写;
|
||||
'letter_rule' => "lcfirst",
|
||||
// url前缀
|
||||
'prefix'=>"",
|
||||
],
|
||||
// (选配)是否自动注册路由
|
||||
'auto_register_routes'=>false,
|
||||
// (必须)缓存配置
|
||||
'cache' => [
|
||||
// 是否开启缓存
|
||||
'enable' => false,
|
||||
],
|
||||
// (必须)权限认证配置
|
||||
'auth' => [
|
||||
// 是否启用密码验证
|
||||
'enable' => false,
|
||||
// 全局访问密码
|
||||
'password' => "123456",
|
||||
// 密码加密盐
|
||||
'secret_key' => "apidoc#hg_code",
|
||||
// 授权访问后的有效期
|
||||
'expire' => 24*60*60
|
||||
],
|
||||
// 全局参数
|
||||
'params'=>[
|
||||
// (选配)全局的请求Header
|
||||
'header'=>[
|
||||
// name=字段名,type=字段类型,require=是否必须,default=默认值,desc=字段描述
|
||||
['name'=>'Authorization','type'=>'string','require'=>true,'desc'=>'身份令牌Token'],
|
||||
],
|
||||
// (选配)全局的请求Query
|
||||
'query'=>[
|
||||
// 同上 header
|
||||
],
|
||||
// (选配)全局的请求Body
|
||||
'body'=>[
|
||||
// 同上 header
|
||||
],
|
||||
],
|
||||
// 全局响应体
|
||||
'responses'=>[
|
||||
// 成功响应体
|
||||
'success'=>[
|
||||
['name'=>'code','desc'=>'业务代码','type'=>'int','require'=>1],
|
||||
['name'=>'message','desc'=>'业务信息','type'=>'string','require'=>1],
|
||||
//参数同上 headers;main=true来指定接口Returned参数挂载节点
|
||||
['name'=>'data','desc'=>'业务数据','main'=>true,'type'=>'object','require'=>1],
|
||||
],
|
||||
// 异常响应体
|
||||
'error'=>[
|
||||
['name'=>'code','desc'=>'业务代码','type'=>'int','require'=>1,'md'=>'/docs/HttpError.md'],
|
||||
['name'=>'message','desc'=>'业务信息','type'=>'string','require'=>1],
|
||||
]
|
||||
],
|
||||
//(选配)默认作者
|
||||
'default_author'=>'',
|
||||
//(选配)默认请求类型
|
||||
'default_method'=>'GET',
|
||||
//(选配)Apidoc允许跨域访问
|
||||
'allowCrossDomain'=>false,
|
||||
/**
|
||||
* (选配)解析时忽略带@注解的关键词,当注解中存在带@字符并且非Apidoc注解,如 @key test,此时Apidoc页面报类似以下错误时:
|
||||
* [Semantical Error] The annotation "@key" in method xxx() was never imported. Did you maybe forget to add a "use" statement for this annotation?
|
||||
*/
|
||||
'ignored_annitation'=>[],
|
||||
|
||||
// (选配)数据库配置
|
||||
'database'=>[],
|
||||
// (选配)Markdown文档
|
||||
'docs' => [],
|
||||
// (选配)接口生成器配置 注意:是一个二维数组
|
||||
'generator' =>[]
|
||||
]
|
||||
];
|
|
@ -0,0 +1,3 @@
|
|||
<?php
|
||||
// 注册Apidoc路由
|
||||
hg\apidoc\providers\WebmanService::register();
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Overtrue\EasySms\Strategies\OrderStrategy;
|
||||
|
||||
return [
|
||||
'enable' => true,
|
||||
|
||||
// HTTP 请求的超时时间(秒)
|
||||
'timeout' => 5.0,
|
||||
|
||||
// 默认发送配置
|
||||
'default' => [
|
||||
// 网关调用策略,默认:顺序调用
|
||||
'strategy' => OrderStrategy::class,
|
||||
|
||||
// 默认可用的发送网关
|
||||
'gateways' => [
|
||||
'aliyun',
|
||||
],
|
||||
],
|
||||
// 可用的网关配置
|
||||
'gateways' => [
|
||||
'errorlog' => [
|
||||
'file' => '/tmp/easy-sms.log',
|
||||
],
|
||||
'aliyun' => [
|
||||
'access_key_id' => '************',
|
||||
'access_key_secret' => '**********************',
|
||||
'sign_name' => '签名',
|
||||
],
|
||||
],
|
||||
];
|
|
@ -0,0 +1,71 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'enable' => true,
|
||||
'jwt' => [
|
||||
// 算法类型 HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、Ed25519
|
||||
'algorithms' => 'HS256',
|
||||
// access令牌秘钥
|
||||
'access_secret_key' => '2022d3d3LmJq',
|
||||
// access令牌过期时间,单位:秒。默认 2 小时
|
||||
'access_exp' => 7200,
|
||||
// refresh令牌秘钥
|
||||
'refresh_secret_key' => '2022KTxigxc9o50c',
|
||||
// refresh令牌过期时间,单位:秒。默认 7 天
|
||||
'refresh_exp' => 604800,
|
||||
// refresh 令牌是否禁用,默认不禁用 false
|
||||
'refresh_disable' => false,
|
||||
// 令牌签发者
|
||||
'iss' => 'webman.tinywan.cn',
|
||||
// 某个时间点后才能访问,单位秒。(如:30 表示当前时间30秒后才能使用)
|
||||
'nbf' => 0,
|
||||
// 时钟偏差冗余时间,单位秒。建议这个余地应该不大于几分钟。
|
||||
'leeway' => 60,
|
||||
// 单设备登录
|
||||
'is_single_device' => false,
|
||||
// 缓存令牌时间,单位:秒。默认 7 天
|
||||
'cache_token_ttl' => 604800,
|
||||
// 缓存令牌前缀
|
||||
'cache_token_pre' => 'JWT:TOKEN:',
|
||||
// 用户信息模型
|
||||
'user_model' => function($uid){
|
||||
return [];
|
||||
},
|
||||
|
||||
/**
|
||||
* access令牌私钥
|
||||
*/
|
||||
'access_private_key' => <<<EOD
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
...
|
||||
-----END RSA PRIVATE KEY-----
|
||||
EOD,
|
||||
|
||||
/**
|
||||
* access令牌公钥
|
||||
*/
|
||||
'access_public_key' => <<<EOD
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
...
|
||||
-----END PUBLIC KEY-----
|
||||
EOD,
|
||||
|
||||
/**
|
||||
* refresh令牌私钥
|
||||
*/
|
||||
'refresh_private_key' => <<<EOD
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
...
|
||||
-----END RSA PRIVATE KEY-----
|
||||
EOD,
|
||||
|
||||
/**
|
||||
* refresh令牌公钥
|
||||
*/
|
||||
'refresh_public_key' => <<<EOD
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
...
|
||||
-----END PUBLIC KEY-----
|
||||
EOD,
|
||||
],
|
||||
];
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
return [
|
||||
'enable' => true,
|
||||
"paths" => [
|
||||
"migrations" => "database/migrations",
|
||||
"seeds" => "database/seeders"
|
||||
],
|
||||
"environments" => [
|
||||
"default_migration_table" => "phinxlog",
|
||||
"default_environment" => "product",
|
||||
"product" => [
|
||||
"adapter" => "mysql",
|
||||
"host" => getenv("DB_HOST", '149.129.107.38'),
|
||||
"name" => getenv("DB_NAME", 'wechatapplet'),
|
||||
"user" => getenv("DB_USER", 'wechatapplet'),
|
||||
"pass" => getenv("DB_PASSWORD", 'Br6D722xXGB4tR7Z'),
|
||||
"port" => getenv("DB_PORT", '3306'),
|
||||
"charset" => "utf8"
|
||||
]
|
||||
]
|
||||
];
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
WebmanMicro\Migrations\Command\Breakpoint::class,
|
||||
WebmanMicro\Migrations\Command\Create::class,
|
||||
WebmanMicro\Migrations\Command\Migrate::class,
|
||||
WebmanMicro\Migrations\Command\Rollback::class,
|
||||
WebmanMicro\Migrations\Command\SeedCreate::class,
|
||||
WebmanMicro\Migrations\Command\SeedRun::class,
|
||||
WebmanMicro\Migrations\Command\Status::class,
|
||||
WebmanMicro\Migrations\Command\ListAliases::class,
|
||||
WebmanMicro\Migrations\Command\Test::class
|
||||
];
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
return [
|
||||
'enable' => true,
|
||||
|
||||
'build_dir' => BASE_PATH . DIRECTORY_SEPARATOR . 'build',
|
||||
|
||||
'phar_filename' => 'webman.phar',
|
||||
|
||||
'bin_filename' => 'webman.bin',
|
||||
|
||||
'signature_algorithm'=> Phar::SHA256, //set the signature algorithm for a phar and apply it. The signature algorithm must be one of Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, or Phar::OPENSSL.
|
||||
|
||||
'private_key_file' => '', // The file path for certificate or OpenSSL private key file.
|
||||
|
||||
'exclude_pattern' => '#^(?!.*(composer.json|/.github/|/.idea/|/.git/|/.setting/|/runtime/|/vendor-bin/|/build/|/vendor/webman/admin/))(.*)$#',
|
||||
|
||||
'exclude_files' => [
|
||||
'.env', 'LICENSE', 'composer.json', 'composer.lock', 'start.php', 'webman.phar', 'webman.bin'
|
||||
],
|
||||
|
||||
'custom_ini' => '
|
||||
memory_limit = 256M
|
||||
',
|
||||
];
|
|
@ -0,0 +1,4 @@
|
|||
<?php
|
||||
return [
|
||||
'enable' => true,
|
||||
];
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [
|
||||
Webman\Event\BootStrap::class,
|
||||
];
|
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
use Webman\Event\EventListCommand;
|
||||
|
||||
return [
|
||||
EventListCommand::class
|
||||
];
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
use support\Log;
|
||||
use support\Request;
|
||||
use app\process\Http;
|
||||
|
||||
global $argv;
|
||||
|
||||
return [
|
||||
'webman' => [
|
||||
'handler' => Http::class,
|
||||
'listen' => 'http://0.0.0.0:8787',
|
||||
'count' => cpu_count() * 4,
|
||||
'user' => '',
|
||||
'group' => '',
|
||||
'reusePort' => false,
|
||||
'eventLoop' => '',
|
||||
'context' => [],
|
||||
'constructor' => [
|
||||
'requestClass' => Request::class,
|
||||
'logger' => Log::channel('default'),
|
||||
'appPath' => app_path(),
|
||||
'publicPath' => public_path()
|
||||
]
|
||||
],
|
||||
// File update detection and automatic reload
|
||||
'monitor' => [
|
||||
'handler' => app\process\Monitor::class,
|
||||
'reloadable' => false,
|
||||
'constructor' => [
|
||||
// Monitor these directories
|
||||
'monitorDir' => array_merge([
|
||||
app_path(),
|
||||
config_path(),
|
||||
base_path() . '/process',
|
||||
base_path() . '/support',
|
||||
base_path() . '/resource',
|
||||
base_path() . '/.env',
|
||||
], glob(base_path() . '/plugin/*/app'), glob(base_path() . '/plugin/*/config'), glob(base_path() . '/plugin/*/api')),
|
||||
// Files with these suffixes will be monitored
|
||||
'monitorExtensions' => [
|
||||
'php', 'html', 'htm', 'env'
|
||||
],
|
||||
'options' => [
|
||||
'enable_file_monitor' => !in_array('-d', $argv) && DIRECTORY_SEPARATOR === '/',
|
||||
'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/',
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [
|
||||
'default' => [
|
||||
'host' => '127.0.0.1',
|
||||
'password' => null,
|
||||
'port' => 6379,
|
||||
'database' => 0,
|
||||
],
|
||||
];
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
use Webman\Route;
|
||||
use App\Middleware\JwtAuthMiddleware;
|
||||
Route::any('/login', [app\controller\UserController::class, 'login'])->middleware([JwtAuthMiddleware::class]);
|
||||
Route::any('/signup', [app\controller\ProjectRegisterController::class, 'signup'])->middleware([JwtAuthMiddleware::class]);
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
return [
|
||||
'event_loop' => '',
|
||||
'stop_timeout' => 2,
|
||||
'pid_file' => runtime_path() . '/webman.pid',
|
||||
'status_file' => runtime_path() . '/webman.status',
|
||||
'stdout_file' => runtime_path() . '/logs/stdout.log',
|
||||
'log_file' => runtime_path() . '/logs/workerman.log',
|
||||
'max_package_size' => 10 * 1024 * 1024
|
||||
];
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
use Webman\Session\FileSessionHandler;
|
||||
use Webman\Session\RedisSessionHandler;
|
||||
use Webman\Session\RedisClusterSessionHandler;
|
||||
|
||||
return [
|
||||
|
||||
'type' => 'file', // or redis or redis_cluster
|
||||
|
||||
'handler' => FileSessionHandler::class,
|
||||
|
||||
'config' => [
|
||||
'file' => [
|
||||
'save_path' => runtime_path() . '/sessions',
|
||||
],
|
||||
'redis' => [
|
||||
'host' => '127.0.0.1',
|
||||
'port' => 6379,
|
||||
'auth' => '',
|
||||
'timeout' => 2,
|
||||
'database' => '',
|
||||
'prefix' => 'redis_session_',
|
||||
],
|
||||
'redis_cluster' => [
|
||||
'host' => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'],
|
||||
'timeout' => 2,
|
||||
'auth' => '',
|
||||
'prefix' => 'redis_session_',
|
||||
]
|
||||
],
|
||||
|
||||
'session_name' => 'PHPSID',
|
||||
|
||||
'auto_update_timestamp' => false,
|
||||
|
||||
'lifetime' => 7*24*60*60,
|
||||
|
||||
'cookie_lifetime' => 365*24*60*60,
|
||||
|
||||
'cookie_path' => '/',
|
||||
|
||||
'domain' => '',
|
||||
|
||||
'http_only' => true,
|
||||
|
||||
'secure' => false,
|
||||
|
||||
'same_site' => '',
|
||||
|
||||
'gc_probability' => [1, 1000],
|
||||
|
||||
];
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Static file settings
|
||||
*/
|
||||
return [
|
||||
'enable' => true,
|
||||
'middleware' => [ // Static file Middleware
|
||||
//app\middleware\StaticFile::class,
|
||||
],
|
||||
];
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Multilingual configuration
|
||||
*/
|
||||
return [
|
||||
// Default language
|
||||
'locale' => 'zh_CN',
|
||||
// Fallback language
|
||||
'fallback_locale' => ['zh_CN', 'en'],
|
||||
// Folder where language files are stored
|
||||
'path' => base_path() . '/resource/translations',
|
||||
];
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
use support\view\Raw;
|
||||
use support\view\Twig;
|
||||
use support\view\Blade;
|
||||
use support\view\ThinkPHP;
|
||||
|
||||
return [
|
||||
'handler' => Raw::class
|
||||
];
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Phinx\Migration\AbstractMigration;
|
||||
|
||||
final class V20250105020018 extends AbstractMigration
|
||||
{
|
||||
/**
|
||||
* Change Method.
|
||||
*
|
||||
* Write your reversible migrations using this method.
|
||||
*
|
||||
* More information on writing migrations is available here:
|
||||
* https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
|
||||
*
|
||||
* Remember to call "create()" or "update()" and NOT "save()" when working
|
||||
* with the Table class.
|
||||
*/
|
||||
public function change(): void
|
||||
{
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,127 @@
|
|||
<?php
|
||||
namespace plugin\admin\api;
|
||||
|
||||
use plugin\admin\app\model\Role;
|
||||
use plugin\admin\app\model\Rule;
|
||||
use support\exception\BusinessException;
|
||||
use function admin;
|
||||
|
||||
/**
|
||||
* 对外提供的鉴权接口
|
||||
*/
|
||||
class Auth
|
||||
{
|
||||
/**
|
||||
* 判断权限
|
||||
* 如果没有权限则抛出异常
|
||||
* @param string $controller
|
||||
* @param string $action
|
||||
* @return void
|
||||
* @throws \ReflectionException|BusinessException
|
||||
*/
|
||||
public static function access(string $controller, string $action)
|
||||
{
|
||||
$code = 0;
|
||||
$msg = '';
|
||||
if (!static::canAccess($controller, $action, $code, $msg)) {
|
||||
throw new BusinessException($msg, $code);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否有权限
|
||||
* @param string $controller
|
||||
* @param string $action
|
||||
* @param int $code
|
||||
* @param string $msg
|
||||
* @return bool
|
||||
* @throws \ReflectionException|BusinessException
|
||||
*/
|
||||
public static function canAccess(string $controller, string $action, int &$code = 0, string &$msg = ''): bool
|
||||
{
|
||||
// 无控制器信息说明是函数调用,函数不属于任何控制器,鉴权操作应该在函数内部完成。
|
||||
if (!$controller) {
|
||||
return true;
|
||||
}
|
||||
// 获取控制器鉴权信息
|
||||
$class = new \ReflectionClass($controller);
|
||||
$properties = $class->getDefaultProperties();
|
||||
$noNeedLogin = $properties['noNeedLogin'] ?? [];
|
||||
$noNeedAuth = $properties['noNeedAuth'] ?? [];
|
||||
|
||||
// 不需要登录
|
||||
if (in_array($action, $noNeedLogin)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 获取登录信息
|
||||
$admin = admin();
|
||||
if (!$admin) {
|
||||
$msg = '请登录';
|
||||
// 401是未登录固定的返回码
|
||||
$code = 401;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 不需要鉴权
|
||||
if (in_array($action, $noNeedAuth)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 当前管理员无角色
|
||||
$roles = $admin['roles'];
|
||||
if (!$roles) {
|
||||
$msg = '无权限';
|
||||
$code = 2;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 角色没有规则
|
||||
$rules = Role::whereIn('id', $roles)->pluck('rules');
|
||||
$rule_ids = [];
|
||||
foreach ($rules as $rule_string) {
|
||||
if (!$rule_string) {
|
||||
continue;
|
||||
}
|
||||
$rule_ids = array_merge($rule_ids, explode(',', $rule_string));
|
||||
}
|
||||
if (!$rule_ids) {
|
||||
$msg = '无权限';
|
||||
$code = 2;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 超级管理员
|
||||
if (in_array('*', $rule_ids)){
|
||||
return true;
|
||||
}
|
||||
|
||||
// 如果action为index,规则里有任意一个以$controller开头的权限即可
|
||||
if (strtolower($action) === 'index') {
|
||||
$rule = Rule::where(function ($query) use ($controller, $action) {
|
||||
$controller_like = str_replace('\\', '\\\\', $controller);
|
||||
$query->where('key', 'like', "$controller_like@%")->orWhere('key', $controller);
|
||||
})->whereIn('id', $rule_ids)->first();
|
||||
if ($rule) {
|
||||
return true;
|
||||
}
|
||||
$msg = '无权限';
|
||||
$code = 2;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 查询是否有当前控制器的规则
|
||||
$rule = Rule::where(function ($query) use ($controller, $action) {
|
||||
$query->where('key', "$controller@$action")->orWhere('key', $controller);
|
||||
})->whereIn('id', $rule_ids)->first();
|
||||
|
||||
if (!$rule) {
|
||||
$msg = '无权限';
|
||||
$code = 2;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
<?php
|
||||
|
||||
namespace plugin\admin\api;
|
||||
|
||||
class Install
|
||||
{
|
||||
/**
|
||||
* 安装
|
||||
*
|
||||
* @param $version
|
||||
* @return void
|
||||
*/
|
||||
public static function install($version)
|
||||
{
|
||||
// 导入菜单
|
||||
Menu::import(static::getMenus());
|
||||
}
|
||||
|
||||
/**
|
||||
* 卸载
|
||||
*
|
||||
* @param $version
|
||||
* @return void
|
||||
*/
|
||||
public static function uninstall($version)
|
||||
{
|
||||
// 删除菜单
|
||||
foreach (static::getMenus() as $menu) {
|
||||
Menu::delete($menu['name']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新
|
||||
*
|
||||
* @param $from_version
|
||||
* @param $to_version
|
||||
* @param $context
|
||||
* @return void
|
||||
*/
|
||||
public static function update($from_version, $to_version, $context = null)
|
||||
{
|
||||
// 删除不用的菜单
|
||||
if (isset($context['previous_menus'])) {
|
||||
static::removeUnnecessaryMenus($context['previous_menus']);
|
||||
}
|
||||
// 导入新菜单
|
||||
Menu::import(static::getMenus());
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新前数据收集等
|
||||
*
|
||||
* @param $from_version
|
||||
* @param $to_version
|
||||
* @return array|array[]
|
||||
*/
|
||||
public static function beforeUpdate($from_version, $to_version)
|
||||
{
|
||||
// 在更新之前获得老菜单,通过context传递给 update
|
||||
return ['previous_menus' => static::getMenus()];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取菜单
|
||||
*
|
||||
* @return array|mixed
|
||||
*/
|
||||
public static function getMenus()
|
||||
{
|
||||
clearstatcache();
|
||||
if (is_file($menu_file = __DIR__ . '/../config/menu.php')) {
|
||||
$menus = include $menu_file;
|
||||
return $menus ?: [];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除不需要的菜单
|
||||
*
|
||||
* @param $previous_menus
|
||||
* @return void
|
||||
*/
|
||||
public static function removeUnnecessaryMenus($previous_menus)
|
||||
{
|
||||
$menus_to_remove = array_diff(Menu::column($previous_menus, 'name'), Menu::column(static::getMenus(), 'name'));
|
||||
foreach ($menus_to_remove as $name) {
|
||||
Menu::delete($name);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue