123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- <?php
- namespace App\Http\Controllers;
- use Illuminate\Http\Request;
- use App\Services\LiquidRenderer;
- use App\Models\DistInquiry;
- use App\Services\MailService; // 导入 MailService
- class ContactController extends Controller
- {
- protected $liquidRenderer;
- public function __construct(LiquidRenderer $liquidRenderer)
- {
- $this->liquidRenderer = $liquidRenderer;
- }
- /**
- * 关键字过滤方法
- */
- private function filterKeywords($data)
- {
- // 检查是否启用内容过滤
- if (!config('content_filter.enabled', true)) {
- return [
- 'blocked' => false,
- 'data' => $data,
- 'filtered_words' => []
- ];
- }
- // 从配置文件获取过滤设置
- $blockedWords = config('content_filter.blocked_words', []);
- $fieldsToCheck = config('content_filter.filter_fields', ['customer_name', 'content']);
- $maxLengths = config('content_filter.max_length', []);
- $result = [
- 'blocked' => false,
- 'data' => $data,
- 'filtered_words' => []
- ];
- foreach ($fieldsToCheck as $field) {
- if (!isset($data[$field])) continue;
- $originalText = $data[$field];
- $cleanText = $originalText;
- // 长度检查
- $maxLength = $maxLengths[$field] ?? 5000;
- if (strlen($originalText) > $maxLength) {
- $result['blocked'] = true;
- break;
- }
- // 检查敏感词 - 直接阻止
- foreach ($blockedWords as $word) {
- if (stripos($originalText, $word) !== false) {
- $result['blocked'] = true;
- $result['filtered_words'][] = $word;
-
- // 记录过滤日志
- if (config('content_filter.log_filtered', false)) {
- \Log::warning('Content blocked due to sensitive word', [
- 'field' => $field,
- 'word' => $word,
- 'ip' => request()->ip(),
- 'user_agent' => request()->userAgent()
- ]);
- }
-
- break 2; // 跳出所有循环
- }
- }
- // 更新清理后的数据
- $result['data'][$field] = trim($originalText);
- }
- return $result;
- }
- function create()
- {
- // 构建导航数据 开始
- $breadcrumbs = [
- [
- 'url' => '/',
- 'name' => 'Home',
- ]
- ];
- $breadcrumbs[] = [
- 'url' => '#',
- 'name' => 'Contact Us',
- ];
- //模板支持多级目录,需要目录符号
- $output = LiquidRenderer::render('pages_sp_contact.liquid', [
- 'breadcrumbs' => $breadcrumbs,
- ]);
- return response($output);
- }
- function store(Request $request)
- {
- try {
- // 如果请求中有 Token,则进行验证
- if ($request->has('_token')) {
- if ($request->input('_token') !== csrf_token()) {
- return response()->json([
- 'status' => 'error',
- 'message' => 'Invalid token.',
- ], 403); // 返回 HTTP 403 错误
- }
- }
- // 验证请求数据
- $validatedData = $request->validate([
- 'customer_name' => 'required|string|max:255', // 必填,字符串,最大长度255
- 'content' => 'required|string', // 必填,字符串
- // 其他字段的验证规则可以在这里添加
- ]);
- // 关键字过滤
- $filteredResult = $this->filterKeywords($validatedData);
- if ($filteredResult['blocked']) {
- $response = [
- 'status' => 'error',
- 'message' => 'System error, please try again later.',
- ];
-
-
- return response()->json($response, 403);
- }
- // 从请求中获取所有数据
- $data = $request->all();
-
- // 应用过滤后的数据
- $data['customer_name'] = $filteredResult['data']['customer_name'];
- $data['content'] = $filteredResult['data']['content'];
- // 指定特殊字段的值
- $data['dist_id'] = 0; // app('dist')->id; // 指定当前登录的分销商ID
- $data['referer_url']=$request->headers->get('referer'); // 获取上一页的URL
- $data['ip_address'] = $request->server('HTTP_X_REAL_IP');
- if (empty($data['ip_address'])) {
- $forwardedFor = $request->server('HTTP_X_FORWARDED_FOR');
- if ($forwardedFor) {
- $ips = explode(',', $forwardedFor);
- $data['ip_address'] = trim($ips[0]); // 取第一个 IP 并去除空格
- } else {
- $data['ip_address'] = $request->ip(); // 备用方案
- }
- }
- $data['order_number']= generateOrderNumber('ORD');
- // 使用模型的 create 方法插入数据
- $distInquiry = DistInquiry::create($data);
- // 如果插入失败,抛出异常
- if (!$distInquiry) {
- throw new \Exception('submit failed, please try again later. ');
- }
- // 询盘数据
- $inquiryData = [
- 'order_number' => $distInquiry->order_number,
- 'customer_name' => $distInquiry->customer_name,
- 'email' => $distInquiry->email,
- 'whats_app' => $distInquiry->whats_app,
- 'consulting_products' => $distInquiry->consulting_products,
- 'freight_forwarder' => $distInquiry->freight_forwarder,
- 'business_model' => $distInquiry->business_model,
- 'content' => $distInquiry->content,
- 'referer_url' => $distInquiry->referer_url,
- 'ip'=> $data['ip_address'],
- ];
- // 使用 MailService 静态方法发送邮件
- $mailSent = MailService::sendInquiryMail($inquiryData);
- // 检查是否有重定向URL
- if ($request->has('redirect_url')) {
- return redirect($request->input('redirect_url'));
- }
- // 成功时的响应(没有重定向URL时返回JSON)
- $response = [
- 'status' => 'success'
- ];
- return response()->json($response, 200);
- } catch (\Exception $e) {
- // 捕获所有异常并返回错误信息
- $response = [
- 'status' => 'error',
- 'message' => 'submit failed, please try again later. ',
- ];
- // 检查是否有错误时的重定向URL
- if ($request->has('error_redirect_url')) {
- return redirect($request->input('error_redirect_url'))->with('error', $response['message']);
- }
- // 如果没有error_redirect_url但有redirect_url,也进行重定向
- elseif ($request->has('redirect_url')) {
- return redirect($request->input('redirect_url'))->with('error', $response['message']);
- }
- return response()->json($response, 500); // 返回 HTTP 500 错误
- }
- }
- }
|