moshaorui 1 день тому
батько
коміт
865cf7fdb4

+ 12 - 0
app/Admin/Controllers/AuthController.php

@@ -67,6 +67,18 @@ class AuthController extends BaseAuthController
 
         if ($this->guard()->attempt($credentials, $remember)) {
 
+            #写入时区
+            $timeZoneName = $request->input('timeZoneName');
+            // 获取所有合法时区名称
+            $validTimeZones = DateTimeZone::listIdentifiers();
+            if (!in_array($timeZoneName, $validTimeZones)) {
+                // 如果时区不合法,则使用默认时区
+                $timeZoneName = 'UTC';
+            }
+            // 写入时区到session
+            Session::put('timeZoneName', $timeZoneName);
+            #写入时区 end
+
             // 登录成功后返回登录响应
             return $this->sendLoginResponse($request);
         }

+ 12 - 0
app/Distributor/Controllers/AuthController.php

@@ -4,6 +4,7 @@ namespace App\Distributor\Controllers;
 
 use App\Models\DistAdminDistributor;
 
+use DateTimeZone;
 use Dcat\Admin\Http\Controllers\AuthController as BaseAuthController;
 use Dcat\Admin\Admin;
 use Dcat\Admin\Form;
@@ -95,6 +96,17 @@ class AuthController extends BaseAuthController
                     $this->username() => $this->getFailedLoginMessage(),
                 ]);
             }
+            #写入时区
+            $timeZoneName = $request->input('timeZoneName');
+            // 获取所有合法时区名称
+            $validTimeZones = DateTimeZone::listIdentifiers();
+            if (!in_array($timeZoneName, $validTimeZones)) {
+                // 如果时区不合法,则使用默认时区
+                $timeZoneName = 'UTC';
+            }
+            // 写入时区到session
+            Session::put('timeZoneName', $timeZoneName);
+
             //将当前登录用户的公司信息存入session
             Session::put('distributor', $distributor->toArray());
             // 登录成功后返回登录响应

+ 8 - 12
app/Distributor/Controllers/SmmPostController.php

@@ -78,20 +78,15 @@ class SmmPostController extends AdminDistController
                 })
                 ->options([ 0=>admin_trans_label('graphic'), 1=>admin_trans_label('videos')])->default(0)->required();
 
-
-
-            //当前时间
-            $now = Carbon::now()->format('Y-m-d H:i:s');
+            //用户当前时间
+            $now = utcToLocalTime(Carbon::now());
             $form->datetime('send_time', admin_trans_label('send_time'))->placeholder(' ')->default($now)->required();
 
             $rootAccounts = SmmUserAccount::getUserAccounts();
             $listBoxOptions = [];
             foreach ($rootAccounts as $account) {
-                //查看发送次数是否超过限制
-            //    if (SmmPostLog::getPostQuota($account->getParent->name) > 0) {
                     //限额大于0才显示
                     $listBoxOptions[$account->id] = $account->name . ' ('.$account->getParent->name.')';
-            //    }
             }
 
             $form->checkbox('account_ids', admin_trans_label('accountsSelect'))->options($listBoxOptions)->required();
@@ -165,13 +160,14 @@ class SmmPostController extends AdminDistController
             }
 
             // 從北京時間字符串創建 Carbon 對象
-            $sendTime = Carbon::createFromFormat('Y-m-d H:i:s', $post['send_time'], 'Asia/Shanghai');
-
-            // 轉換為 UTC 時間
-            $send_time = $sendTime->setTimezone('UTC');
+//            $sendTime = Carbon::createFromFormat('Y-m-d H:i:s', $post['send_time'], 'Asia/Shanghai');
+//
+//            // 轉換為 UTC 時間
+//            $send_time = $sendTime->setTimezone('UTC');
+            $sendTime = localTimeToUtc($post['send_time']);
 
             //保存数据
-            SmmPost::create($post,$send_time,$image_video_url,getDistributorId());
+            SmmPost::create($post,$sendTime,$image_video_url,getDistributorId());
             // 生成发送记录
             $timer = new TimerSsmPost();
             $timer->createLog();

+ 54 - 0
app/helpers.php

@@ -339,3 +339,57 @@ if (!function_exists('toStoragePath')) {
         return storage_path('app/'.$path);
     }
 }
+
+
+
+/*
+ * 将UTC时间转换为当前浏览器时区时间
+ */
+if (!function_exists('utcToLocalTime')) {
+    function utcToLocalTime($utcTime) {
+        $timeZoneName = Session::get('timeZoneName') ?? 'UTC';
+
+        // 创建 UTC 时区对象
+        $utcTimezone = new DateTimeZone('UTC');
+
+        // 解析输入时间(支持字符串和时间戳)
+        if (is_numeric($utcTime)) {
+            $date = DateTime::createFromFormat('U', $utcTime, $utcTimezone);
+        } else {
+            $date = DateTime::createFromFormat('Y-m-d H:i:s', $utcTime, $utcTimezone);
+        }
+
+        // 转换到时区
+        $distTimezone = new DateTimeZone($timeZoneName);
+        $date->setTimezone($distTimezone);
+
+        return $date->format('Y-m-d H:i:s');
+    }
+}
+
+/*
+ * 将当前浏览器时区时间转换为UTC时间
+ */
+if (!function_exists('localTimeToUtc')) {
+    function localTimeToUtc($inputTime) {
+        $timeZoneName = Session::get('timeZoneName') ?? 'UTC';
+
+        // 创建分销商时区对象
+        $distTimezone = new DateTimeZone($timeZoneName);
+
+        // 解析输入时间(支持字符串和时间戳)
+        if (is_numeric($inputTime)) {
+            $date = DateTime::createFromFormat('U', $inputTime, $distTimezone);
+        } else {
+            $date = DateTime::createFromFormat('Y-m-d H:i:s', $inputTime, $distTimezone);
+        }
+
+        // 转换到 UTC 时区
+        $date->setTimezone(new DateTimeZone('UTC'));
+
+        return $date->format('Y-m-d H:i:s');
+    }
+}
+
+
+

+ 27 - 0
resources/views/admin/pages/login.blade.php

@@ -47,6 +47,8 @@
 
                     <input type="hidden" name="_token" value="{{ csrf_token() }}"/>
 
+                    <input type="hidden" name="timeZoneName" id="timeZoneName"  value=""/>
+
                     <fieldset class="form-label-group form-group position-relative has-icon-left">
                         <input
                             type="text"
@@ -169,7 +171,32 @@
 </div>
 
 <script>
+    var getTimeZoneInfo = function () {
+        const date = new Date();
+
+        // 尝试获取时区名称(现代浏览器)
+        let timeZoneName;
+        try {
+            timeZoneName = Intl.DateTimeFormat().resolvedOptions().timeZone;
+        } catch (e) {
+            timeZoneName = null;
+        }
+
+        // 计算偏移量(兼容所有浏览器)
+        const offsetMinutes = date.getTimezoneOffset();
+        const offsetHours = -offsetMinutes / 60;
+        const offsetString = `UTC${offsetHours >= 0 ? '+' : ''}${offsetHours}`;
+
+        return {
+            name: timeZoneName || 'Unknown', // 时区名称(如 "Asia/Shanghai")
+            offset: offsetString,            // 偏移量(如 "UTC+8")
+            offsetMinutes: offsetMinutes     // 分钟差(如 -480)
+        };
+    }
+
     Dcat.ready(function () {
+        $('#timeZoneName').val(getTimeZoneInfo().name);
+
         // ajax表单提交
         $('#login-form').form({
             validate: true,

+ 30 - 0
resources/views/distributor/pages/login.blade.php

@@ -47,6 +47,9 @@
 
                     <input type="hidden" name="_token" value="{{ csrf_token() }}"/>
 
+                    <input type="hidden" name="timeZoneName" id="timeZoneName"  value=""/>
+
+
                     <fieldset class="form-label-group form-group position-relative has-icon-left">
                         <input
                             type="text"
@@ -169,7 +172,33 @@
 </div>
 
 <script>
+    var getTimeZoneInfo = function () {
+        const date = new Date();
+
+        // 尝试获取时区名称(现代浏览器)
+        let timeZoneName;
+        try {
+            timeZoneName = Intl.DateTimeFormat().resolvedOptions().timeZone;
+        } catch (e) {
+            timeZoneName = null;
+        }
+
+        // 计算偏移量(兼容所有浏览器)
+        const offsetMinutes = date.getTimezoneOffset();
+        const offsetHours = -offsetMinutes / 60;
+        const offsetString = `UTC${offsetHours >= 0 ? '+' : ''}${offsetHours}`;
+
+        return {
+            name: timeZoneName || 'Unknown', // 时区名称(如 "Asia/Shanghai")
+            offset: offsetString,            // 偏移量(如 "UTC+8")
+            offsetMinutes: offsetMinutes     // 分钟差(如 -480)
+        };
+    }
+
     Dcat.ready(function () {
+
+        $('#timeZoneName').val(getTimeZoneInfo().name);
+
         // ajax表单提交
         $('#login-form').form({
             validate: true,
@@ -177,6 +206,7 @@
     });
 </script>
 <script>
+
     document.querySelectorAll('.lang-item').forEach(item => {
         item.addEventListener('click', function() {
             const lang = this.getAttribute('data-lang');