目录结构调整
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use app\model\Area;
|
||||
use app\util\Util;
|
||||
use support\Request;
|
||||
|
||||
class AreaController
|
||||
{
|
||||
|
||||
public function getAll (Request $request)
|
||||
{
|
||||
$parentId = Util::getParam($request,'parent_id');
|
||||
$level = Util::getParam($request,'level')?:1;
|
||||
$list = $this->getRegions($parentId, $level);
|
||||
return Util::success($list);
|
||||
}
|
||||
|
||||
//递归查询
|
||||
function getRegions($parentId = null, $level = 1, $child = true) {
|
||||
$regions = [];
|
||||
|
||||
$where= array();
|
||||
if(!Util::isEmpty($parentId)){
|
||||
$where['parent_id'] = $parentId;
|
||||
}
|
||||
$where['level'] = $level;
|
||||
$results = Area::where($where)->get();
|
||||
|
||||
foreach ($results as $row) {
|
||||
if($child){
|
||||
$row['children'] = $this->getRegions($row['id'], $row['level'] + 1);
|
||||
}
|
||||
$regions[] = $row;
|
||||
}
|
||||
|
||||
return $regions;
|
||||
}
|
||||
|
||||
public function getCountry (Request $request)
|
||||
{
|
||||
$level = Util::getParam($request,'level')?:1;
|
||||
$list = $this->getRegions(null, $level,false);
|
||||
return Util::success($list);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use app\model\CarType;
|
||||
use app\model\Customer;
|
||||
use app\util\Util;
|
||||
use PDO;
|
||||
use support\Db;
|
||||
use support\Redis;
|
||||
use support\Request;
|
||||
|
||||
class CarTypeController
|
||||
{
|
||||
|
||||
public function getAll(Request $request)
|
||||
{
|
||||
$list = CarType::getAll();
|
||||
return Util::success($list);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use app\model\Channel;
|
||||
use app\model\Customer;
|
||||
use app\util\Util;
|
||||
use config\constants\Constants;
|
||||
use support\Log;
|
||||
use support\Request;
|
||||
|
||||
class CustomerController
|
||||
{
|
||||
/**
|
||||
* 客户分级
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function getGrade(Request $request)
|
||||
{
|
||||
$grade = [];
|
||||
foreach (Constants::GRADE as $key => $value) {
|
||||
$grade[] = [
|
||||
'id' => $key,
|
||||
'name' => $value,
|
||||
];
|
||||
}
|
||||
return Util::success($grade);
|
||||
}
|
||||
|
||||
/**
|
||||
* 商机
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function getMagnitude(Request $request)
|
||||
{
|
||||
$grade = [];
|
||||
foreach (Constants::MAGNITUDE as $key => $value) {
|
||||
$grade[] = [
|
||||
'id' => $key,
|
||||
'name' => $value,
|
||||
];
|
||||
}
|
||||
return Util::success($grade);
|
||||
}
|
||||
|
||||
/**
|
||||
* 客户渠道
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function getChannel(Request $request)
|
||||
{
|
||||
$list = Channel::getAll();
|
||||
return Util::success($list);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 客户列表
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function list(Request $request)
|
||||
{
|
||||
|
||||
$page = $request->input('page', 1);
|
||||
$perPage = $request->input('per_page', 10);
|
||||
|
||||
$where = [];
|
||||
|
||||
$userId = $request->user['id'];
|
||||
if (Util::isEmpty($userId)) {
|
||||
return Util::fail(['user_id' => $userId], trans('user_none'));
|
||||
}
|
||||
if ($request->user['role'] != 1) {
|
||||
$where['user_id'] = $userId;
|
||||
}
|
||||
|
||||
// 执行分页查询
|
||||
$data = Customer::where($where)
|
||||
->orderBy('id', 'desc')
|
||||
->paginate($perPage, ['*'], 'page', $page);
|
||||
|
||||
foreach ($data->items() as &$value) {
|
||||
$value = Customer::getCustomer($value);
|
||||
}
|
||||
|
||||
return Util::page($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 客户详情
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function detail(Request $request)
|
||||
{
|
||||
$id = Util::getParam($request, 'id');
|
||||
if (Util::isEmpty($id)) {
|
||||
return Util::fail([], 'id' . trans('not_null'));
|
||||
}
|
||||
|
||||
$res = Customer::select('id', 'user_id', 'grade', 'channel_id','car_type_id', 'country_id', 'magnitude', 'email', 'phone', 'WhatsApp', 'contacts', 'describe')
|
||||
->where('id', $id)
|
||||
->first();
|
||||
if ($res) {
|
||||
$res->toArray();
|
||||
} else {
|
||||
return Util::fail([], '记录不存在');
|
||||
}
|
||||
|
||||
$res = Customer::getCustomer($res);
|
||||
|
||||
return Util::success($res);
|
||||
}
|
||||
|
||||
/**
|
||||
* 客户录入
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function save(Request $request)
|
||||
{
|
||||
$id = Util::getParam($request, 'id');
|
||||
$channel_id = Util::getParam($request, 'channel_id');
|
||||
if (Util::isEmpty($channel_id)) {
|
||||
return Util::fail([], 'channel_id' . trans('not_null'));
|
||||
}
|
||||
$country_id = Util::getParam($request, 'country_id');
|
||||
if (Util::isEmpty($country_id)) {
|
||||
// return Util::fail([],'country_id'.trans('not_null'));
|
||||
}
|
||||
$car_type_id = Util::getParam($request, 'car_type_id');
|
||||
if (Util::isEmpty($car_type_id)) {
|
||||
return Util::fail([], 'car_type_id' . trans('not_null'));
|
||||
}
|
||||
$contacts = Util::getParam($request, 'contacts');
|
||||
$email = Util::getParam($request, 'email');
|
||||
$phone = Util::getParam($request, 'phone');
|
||||
if (Util::isEmpty($contacts) && Util::isEmpty($email) && Util::isEmpty($phone)) {
|
||||
return Util::fail([], 'country_id' . trans('not_null'));
|
||||
}
|
||||
|
||||
$data = [
|
||||
'user_id' => $request->user['id'],
|
||||
'grade' => Util::getParam($request, 'grade', 0),
|
||||
'channel_id' => $channel_id,
|
||||
'country_id' => $country_id,
|
||||
'car_type_id' => $car_type_id,
|
||||
'magnitude' => Util::getParam($request, 'magnitude', 0),
|
||||
'email' => $email,
|
||||
'phone' => $phone,
|
||||
'WhatsApp' => Util::getParam($request, 'WhatsApp',''),
|
||||
'contacts' => $contacts,
|
||||
'describe' => Util::getParam($request, 'describe'),
|
||||
'lat' => Util::getParam($request, 'lat',0),
|
||||
'lng' => Util::getParam($request, 'lng',0),
|
||||
'address' => Util::getParam($request, 'address',''),
|
||||
];
|
||||
|
||||
if (Util::isEmpty($id)) {
|
||||
$res = Customer::create($data);
|
||||
} else {
|
||||
$res = Customer::where('id', $id)
|
||||
->update($data);
|
||||
// Log::info('update', ['res' => $res]);
|
||||
(!$res)?: $res=Customer::find($id)->toArray();
|
||||
}
|
||||
|
||||
if ($res) {
|
||||
return Util::success($res,trans('save_success'));
|
||||
} else {
|
||||
return Util::fail($res,trans('save_fail'));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use app\model\Customer;
|
||||
use app\model\Follow;
|
||||
use app\util\Util;
|
||||
use config\constants\Constants;
|
||||
use Google\Cloud\Speech\V2\Client\SpeechClient;
|
||||
use Google\Cloud\Speech\V2\RecognitionConfig;
|
||||
use support\Request;
|
||||
|
||||
class FollowController
|
||||
{
|
||||
/**
|
||||
* 客户分级
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function getFollowType(Request $request)
|
||||
{
|
||||
$grade = [];
|
||||
foreach (Constants::FOLLOW as $key => $value) {
|
||||
$grade[] = [
|
||||
'status' => $key,
|
||||
'text' => $value,
|
||||
];
|
||||
}
|
||||
return Util::success($grade);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 跟进列表
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function list(Request $request)
|
||||
{
|
||||
|
||||
$page = $request->input('page', 1);
|
||||
$perPage = $request->input('per_page', 10);
|
||||
|
||||
//客户id
|
||||
$customer_id = Util::getParam($request,'customer_id');
|
||||
if(Util::isEmpty($customer_id)){
|
||||
return Util::fail([],'customer_id'.trans('not_null'));
|
||||
}
|
||||
|
||||
$where = [];
|
||||
$where['customer_id'] = $customer_id;
|
||||
|
||||
//用户角色
|
||||
$userId = $request->user['id'];
|
||||
if(Util::isEmpty($userId)){
|
||||
return Util::fail(['user_id'=>$userId],trans('user_none'));
|
||||
}
|
||||
if($request->user['role']!=1){
|
||||
$where['user_id'] = $userId;
|
||||
}
|
||||
|
||||
//跟进id
|
||||
$id = Util::getParam($request,'id');
|
||||
if(!Util::isEmpty($id)){
|
||||
$where['id'] = $id;
|
||||
}
|
||||
|
||||
// 执行分页查询
|
||||
$data = Follow::where($where)
|
||||
->orderBy('id', 'desc')
|
||||
->paginate($perPage, ['*'], 'page', $page);
|
||||
|
||||
|
||||
// $host = $request->host();
|
||||
$url = 'http:'.$request->url();
|
||||
foreach ($data->items() as &$value){
|
||||
$value = Follow::getFollow($value,$url);
|
||||
}
|
||||
|
||||
return Util::page($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 跟进详情
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function detail(Request $request)
|
||||
{
|
||||
//跟进id
|
||||
$id = Util::getParam($request,'id');
|
||||
if(Util::isEmpty($id)){
|
||||
return Util::fail([],'id'.trans('not_null'));
|
||||
}
|
||||
|
||||
$res = Follow::select('id','user_id','customer_id','type','picture','remark','audio','audio_text','lat','lng','address')
|
||||
->where('id',$id)
|
||||
->first();
|
||||
if($res){
|
||||
$res->toArray();
|
||||
}else{
|
||||
return Util::fail([],'记录不存在');
|
||||
}
|
||||
|
||||
$res = Follow::getFollow($res);
|
||||
|
||||
return Util::success($res);
|
||||
}
|
||||
|
||||
/**
|
||||
* 客户录入
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
*/
|
||||
public function save(Request $request)
|
||||
{
|
||||
$customer_id = Util::getParam($request,'customer_id');
|
||||
|
||||
if(Util::isEmpty($customer_id)){
|
||||
return Util::fail([],'customer_id'.trans('not_null'));
|
||||
}
|
||||
$type = Util::getParam($request,'type');
|
||||
if(Util::isEmpty($type)){
|
||||
return Util::fail([],'type'.trans('not_null'));
|
||||
}
|
||||
$picture = Util::getParam($request,'picture');
|
||||
if(Util::isEmpty($picture)){
|
||||
return Util::fail([],'picture'.trans('not_null'));
|
||||
}
|
||||
|
||||
$data = [
|
||||
'user_id'=>$request->user['id'],
|
||||
'customer_id'=>$customer_id,
|
||||
'type'=>$type,
|
||||
'picture'=>$picture,
|
||||
'remark'=>Util::getParam($request,'remark',''),
|
||||
'audio'=>Util::getParam($request,'audio',''),
|
||||
'audio_text'=>Util::getParam($request,'audio',''),
|
||||
'lat'=>Util::getParam($request,'lat',0),
|
||||
'lng'=>Util::getParam($request,'lng',0),
|
||||
'address1'=>Util::getParam($request,'address'),
|
||||
];
|
||||
|
||||
$res = Follow::create($data);
|
||||
|
||||
$customer = Customer::find($customer_id);
|
||||
$customer->follow_last = $res->created_at;
|
||||
$customer->save();
|
||||
|
||||
if ($res) {
|
||||
return Util::success($res,trans('save_success'));
|
||||
} else {
|
||||
return Util::fail($res,trans('save_fail'));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use support\Request;
|
||||
|
||||
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']);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
//use support\Request;
|
||||
//use support\Log;
|
||||
//use Webman\Http\Response;
|
||||
|
||||
use app\util\Util;
|
||||
use support\Log;
|
||||
use support\Request;
|
||||
|
||||
class UploadController
|
||||
{
|
||||
// 允许的文件类型
|
||||
protected $allowedMimeTypes = [
|
||||
'image/jpeg',
|
||||
'image/jpg',
|
||||
'image/png',
|
||||
'image/gif',
|
||||
'application/pdf',
|
||||
'text/plain'
|
||||
];
|
||||
|
||||
// 最大文件大小(5MB)
|
||||
protected $maxFileSize = 5 * 1024 * 1024;
|
||||
|
||||
public function upload(Request $request): \support\Response
|
||||
{
|
||||
try {
|
||||
// 获取上传的文件(支持多文件)
|
||||
$files = $request->file('files');
|
||||
|
||||
// 如果没有文件上传
|
||||
if (!$files) {
|
||||
throw new \Exception('未上传任何文件');
|
||||
}
|
||||
|
||||
// 单文件转换为数组统一处理
|
||||
if (!is_array($files)) {
|
||||
$files = [$files];
|
||||
}
|
||||
|
||||
$result = [];
|
||||
foreach ($files as $file) {
|
||||
// 检查文件是否上传成功
|
||||
if (!$file->isValid()) {
|
||||
throw new \Exception($file->getUploadErrorMessage());
|
||||
}
|
||||
|
||||
// 校验文件类型
|
||||
if (!in_array($file->getUploadMineType(), $this->allowedMimeTypes)) {
|
||||
throw new \Exception('不支持的文件类型: ' . $file->getUploadMineType());
|
||||
}
|
||||
|
||||
// 校验文件大小
|
||||
$fileSize = $file->getSize();
|
||||
if ($fileSize > $this->maxFileSize) {
|
||||
throw new \Exception('文件大小超过限制');
|
||||
}
|
||||
|
||||
// 生成唯一文件名(防止覆盖)
|
||||
$filename = uniqid() . '.' . $file->getUploadExtension();
|
||||
|
||||
// 保存路径(例如:runtime/uploads/202310)
|
||||
$savePath = runtime_path('uploads/' . date('Ym/d'));
|
||||
if (!is_dir($savePath)) {
|
||||
mkdir($savePath, 0755, true);
|
||||
}
|
||||
|
||||
// 移动文件到目标路径
|
||||
$file->move($savePath . '/' . $filename);
|
||||
|
||||
// 记录上传信息
|
||||
Log::info('文件上传成功', [
|
||||
'original_name' => $file->getUploadName(),
|
||||
'saved_path' => $savePath . '/' . $filename,
|
||||
'size' => $fileSize
|
||||
]);
|
||||
|
||||
$result = [
|
||||
'original_name' => $file->getUploadName(),
|
||||
'saved_name' => $filename,
|
||||
'path' => 'uploads/' . date('Ym') . '/' . $filename,
|
||||
'size' => $fileSize,
|
||||
'mime_type' => $file->getUploadMineType()
|
||||
];
|
||||
}
|
||||
|
||||
return Util::success($result,'上传成功');
|
||||
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('文件上传失败: ' . $e->getMessage());
|
||||
|
||||
return Util::fail([],$e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use app\model\User;
|
||||
use app\service\MailService;
|
||||
use app\util\JwtUtil;
|
||||
use app\util\Util;
|
||||
use support\Redis;
|
||||
use support\Request;
|
||||
|
||||
class UserController
|
||||
{
|
||||
/**
|
||||
* 不需要登录的方法
|
||||
*/
|
||||
protected $noNeedLogin = ['login', 'sendCode', 'register'];
|
||||
|
||||
public function login(Request $request)
|
||||
{
|
||||
$email = Util::getParam($request, 'email');
|
||||
if (Util::isEmpty($email)) {
|
||||
return Util::fail([], 'email' . trans('not_null'));
|
||||
}
|
||||
$password = Util::getParam($request, 'password');
|
||||
if (Util::isEmpty($password)) {
|
||||
return Util::fail([], 'password' . trans('not_null'));
|
||||
}
|
||||
$user = User::select(['id', 'name', 'sex', 'role', 'avatar', 'email', 'password'])
|
||||
->where('status', 0)
|
||||
->where('email', $request->post('email'))
|
||||
->first();
|
||||
if (!$user) {
|
||||
return Util::fail(['user' => $user], trans('user_none'));
|
||||
}
|
||||
$user = $user->toArray();
|
||||
|
||||
$userPassword = $user['password'];
|
||||
|
||||
//加密
|
||||
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
|
||||
|
||||
//验证密码
|
||||
if (!password_verify($userPassword, $hashedPassword)) {
|
||||
return Util::fail([], trans('password_error'));
|
||||
}
|
||||
$userId = $user['id']; // 实际从数据库获取
|
||||
|
||||
|
||||
Redis::set('user_' . $userId, $user);
|
||||
|
||||
//密码验证成功后加密生成 Token
|
||||
$token = JwtUtil::generateToken($userId);
|
||||
$result = $user;
|
||||
unset($result['password']);
|
||||
$result['token'] = $token;
|
||||
|
||||
return Util::success($result, trans('login_success'));
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送邮箱验证码
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
* @throws \Random\RandomException
|
||||
*/
|
||||
public function sendCode(Request $request)
|
||||
{
|
||||
$email = Util::getParam($request,'email');
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
return Util::fail([], 'email' . trans('not_null'));
|
||||
}
|
||||
|
||||
// 生成验证码
|
||||
$code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);
|
||||
|
||||
// 发送邮件
|
||||
$mailService = new MailService();
|
||||
if ($mailService->sendVerificationCode($email, $code)) {
|
||||
// 存储验证码到 Redis
|
||||
Redis::set("verification_code:{$email}", $code, 300);
|
||||
return Util::success([], '验证码已发送');
|
||||
}
|
||||
|
||||
return Util::fail([], '邮件发送失败');
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册
|
||||
* @param Request $request
|
||||
* @return \support\Response
|
||||
* @throws \Random\RandomException
|
||||
*/
|
||||
public function register(Request $request)
|
||||
{
|
||||
$email = Util::getParam($request,'email','asdf');
|
||||
$code = Util::getParam($request,'code');
|
||||
$sex = Util::getParam($request,'sex',0);
|
||||
$name = Util::getParam($request,'name',0);
|
||||
$password = Util::getParam($request,'password');
|
||||
$mobile = Util::getParam($request,'mobile');
|
||||
$id = Util::getParam($request,'id');
|
||||
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
return Util::fail([], 'email'.$email . trans('not_null'));
|
||||
}
|
||||
|
||||
$res = User::select('id', 'email')
|
||||
->where('email', $email)
|
||||
->first();
|
||||
// if (!Util::isEmpty($res)) {
|
||||
// return Util::fail([], trans('email_repeat'));
|
||||
// }
|
||||
|
||||
if (Util::isEmpty($name)) {
|
||||
return Util::fail([], 'name' . trans('not_null'));
|
||||
}
|
||||
|
||||
$verification_code = Redis::get("verification_code:{$email}");
|
||||
|
||||
if ($code != $verification_code) {
|
||||
return Util::fail([], trans('code_error'));
|
||||
}
|
||||
|
||||
//加密
|
||||
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
|
||||
|
||||
$data = [
|
||||
'mobile' => $mobile,
|
||||
'email' => $email,
|
||||
'name' => $name,
|
||||
'sex' => $sex,
|
||||
'role' => 1,
|
||||
'password' => $hashedPassword,
|
||||
];
|
||||
|
||||
if (Util::isEmpty($id)) {
|
||||
$res = User::create($data);
|
||||
} else {
|
||||
$res = User::where('id', $id)
|
||||
->update($data);
|
||||
// Log::info('update', ['res' => $res]);
|
||||
(!$res)?: $res=User::find($id)->toArray();
|
||||
}
|
||||
|
||||
if ($res) {
|
||||
return Util::success($res);
|
||||
} else {
|
||||
return Util::fail($res);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user