Merge remote-tracking branch 'origin/master' into akun
正在显示
11 个修改的文件
包含
134 行增加
和
37 行删除
| @@ -62,7 +62,7 @@ class RemainDay extends Command | @@ -62,7 +62,7 @@ class RemainDay extends Command | ||
| 62 | $list = Project::whereIn('type', [Project::TYPE_TWO,Project::TYPE_THREE,Project::TYPE_FOUR])->get(); | 62 | $list = Project::whereIn('type', [Project::TYPE_TWO,Project::TYPE_THREE,Project::TYPE_FOUR])->get(); |
| 63 | foreach ($list as $item){ | 63 | foreach ($list as $item){ |
| 64 | if(in_array($item->id,$this->ceaseProjectId)){//暂停的项目 | 64 | if(in_array($item->id,$this->ceaseProjectId)){//暂停的项目 |
| 65 | - if($item['type'] == Project::TYPE_TWO && $item->is_compliance == 1){ | 65 | + if(($item['type'] == Project::TYPE_TWO) && ($item->is_remain_today == 1)){ |
| 66 | $item->pause_days = $item->pause_days + 1; | 66 | $item->pause_days = $item->pause_days + 1; |
| 67 | } | 67 | } |
| 68 | if($item['type'] != Project::TYPE_THREE){ | 68 | if($item['type'] != Project::TYPE_THREE){ |
| @@ -80,6 +80,9 @@ class RemainDay extends Command | @@ -80,6 +80,9 @@ class RemainDay extends Command | ||
| 80 | }else{ | 80 | }else{ |
| 81 | if($item['type'] == Project::TYPE_TWO){ | 81 | if($item['type'] == Project::TYPE_TWO){ |
| 82 | $compliance_day = $item->finish_remain_day ?? 0; | 82 | $compliance_day = $item->finish_remain_day ?? 0; |
| 83 | + if($compliance_day == 0){ | ||
| 84 | + $item->pause_days = 0; | ||
| 85 | + } | ||
| 83 | $remain_day = $item['deploy_build']['service_duration'] + $item->pause_days - $compliance_day; | 86 | $remain_day = $item['deploy_build']['service_duration'] + $item->pause_days - $compliance_day; |
| 84 | }else{ | 87 | }else{ |
| 85 | if($item->uptime){ | 88 | if($item->uptime){ |
| @@ -189,11 +189,11 @@ class VideoTask extends Command | @@ -189,11 +189,11 @@ class VideoTask extends Command | ||
| 189 | public function getProjectKeyword($number,$keywords = []) | 189 | public function getProjectKeyword($number,$keywords = []) |
| 190 | { | 190 | { |
| 191 | 191 | ||
| 192 | - $keyword_id = Keyword::where('video', null)->whereIn("title", $keywords) | 192 | + $keyword_id = Keyword::where('video', null)->whereIn("title", $keywords)->whereNull('deleted_at') |
| 193 | ->where('route', 'not like', '%-tag')->whereNotNull('keyword_content')->limit($number)->pluck('id')->toArray(); | 193 | ->where('route', 'not like', '%-tag')->whereNotNull('keyword_content')->limit($number)->pluck('id')->toArray(); |
| 194 | $need = $number - count($keyword_id); | 194 | $need = $number - count($keyword_id); |
| 195 | if ($need > 0) { | 195 | if ($need > 0) { |
| 196 | - $keyword_arr_id = Keyword::where('video', null)->where('route', 'not like', '%-tag') | 196 | + $keyword_arr_id = Keyword::where('video', null)->where('route', 'not like', '%-tag')->whereNull('deleted_at') |
| 197 | ->whereNotNull('keyword_content')->whereNotIn('id', $keyword_id)->orderBy('id','asc')->limit($need)->pluck('id')->toArray(); | 197 | ->whereNotNull('keyword_content')->whereNotIn('id', $keyword_id)->orderBy('id','asc')->limit($need)->pluck('id')->toArray(); |
| 198 | } | 198 | } |
| 199 | $keyword_arr_id = array_merge($keyword_id, $keyword_arr_id); | 199 | $keyword_arr_id = array_merge($keyword_id, $keyword_arr_id); |
| @@ -318,8 +318,12 @@ class VideoTask extends Command | @@ -318,8 +318,12 @@ class VideoTask extends Command | ||
| 318 | } | 318 | } |
| 319 | } | 319 | } |
| 320 | } else { | 320 | } else { |
| 321 | - | ||
| 322 | - $image = $dom->find('.section-banner-wrap-block',0)->find('img', 0); | 321 | + $image = $dom->find('.section-banner-wrap-block',0); |
| 322 | + if($image != null){ | ||
| 323 | + $image = $image->find('img', 0); | ||
| 324 | + }else{ | ||
| 325 | + $image = null; | ||
| 326 | + } | ||
| 323 | } | 327 | } |
| 324 | if($image != null){ | 328 | if($image != null){ |
| 325 | $bg = $image->src; | 329 | $bg = $image->src; |
| @@ -10,8 +10,10 @@ namespace App\Console\Commands\Test; | @@ -10,8 +10,10 @@ namespace App\Console\Commands\Test; | ||
| 10 | 10 | ||
| 11 | use App\Helper\Arr; | 11 | use App\Helper\Arr; |
| 12 | use App\Models\Blog\Blog; | 12 | use App\Models\Blog\Blog; |
| 13 | +use App\Models\Blog\BlogCategory; | ||
| 13 | use App\Models\Com\KeywordVideoTask; | 14 | use App\Models\Com\KeywordVideoTask; |
| 14 | use App\Models\Com\KeywordVideoTaskLog; | 15 | use App\Models\Com\KeywordVideoTaskLog; |
| 16 | +use App\Models\CustomModule\CustomModuleCategory; | ||
| 15 | use App\Models\CustomModule\CustomModuleContent; | 17 | use App\Models\CustomModule\CustomModuleContent; |
| 16 | use App\Models\Devops\ServerConfig; | 18 | use App\Models\Devops\ServerConfig; |
| 17 | use App\Models\Devops\Servers; | 19 | use App\Models\Devops\Servers; |
| @@ -20,6 +22,8 @@ use App\Models\File\File; | @@ -20,6 +22,8 @@ use App\Models\File\File; | ||
| 20 | use App\Models\File\File as FileModel; | 22 | use App\Models\File\File as FileModel; |
| 21 | use App\Models\File\Image; | 23 | use App\Models\File\Image; |
| 22 | use App\Models\File\Image as ImageModel; | 24 | use App\Models\File\Image as ImageModel; |
| 25 | +use App\Models\News\News; | ||
| 26 | +use App\Models\News\NewsCategory; | ||
| 23 | use App\Models\Product\Keyword; | 27 | use App\Models\Product\Keyword; |
| 24 | use App\Models\Product\Product; | 28 | use App\Models\Product\Product; |
| 25 | use App\Models\Project\DeployOptimize; | 29 | use App\Models\Project\DeployOptimize; |
| @@ -52,25 +56,59 @@ class Demo extends Command | @@ -52,25 +56,59 @@ class Demo extends Command | ||
| 52 | */ | 56 | */ |
| 53 | protected $description = 'demo'; | 57 | protected $description = 'demo'; |
| 54 | 58 | ||
| 59 | +// public function handle(){ | ||
| 60 | +// $projectModel = new Project(); | ||
| 61 | +// $list = $projectModel->list(['id'=>503]); | ||
| 62 | +// foreach ($list as $v){ | ||
| 63 | +// echo date('Y-m-d H:i:s') . 'project_id:'.$v['id'] . PHP_EOL; | ||
| 64 | +// ProjectServer::useProject($v['id']); | ||
| 65 | +// $newsModel = new News(); | ||
| 66 | +// $blogList = $newsModel->list(['status'=>1],'id',['*'],'asc'); | ||
| 67 | +// foreach ($blogList as $blogV){ | ||
| 68 | +// $customContentModel = new CustomModuleContent(); | ||
| 69 | +// $id = $customContentModel->addReturnId([ | ||
| 70 | +// 'name'=>$blogV['name'], | ||
| 71 | +// 'status'=>0, | ||
| 72 | +// 'sort'=>$blogV['sort'], | ||
| 73 | +// 'remark'=>$blogV['remark'], | ||
| 74 | +// 'route'=>$blogV['url'], | ||
| 75 | +// 'image'=>$blogV['image'], | ||
| 76 | +// 'seo_title'=>$blogV['seo_title'], | ||
| 77 | +// 'seo_keywords'=>$blogV['seo_keywords'], | ||
| 78 | +// 'seo_description'=>$blogV['seo_description'], | ||
| 79 | +// 'project_id'=>$blogV['project_id'], | ||
| 80 | +// 'created_at'=>$blogV['created_at'], | ||
| 81 | +// 'updated_at'=>$blogV['updated_at'], | ||
| 82 | +// 'module_id'=>10, | ||
| 83 | +// 'video'=>null, | ||
| 84 | +// 'release_at'=>$blogV['release_at'], | ||
| 85 | +// 'operator_id'=>$blogV['operator_id'] | ||
| 86 | +// ]); | ||
| 87 | +// RouteMap::setRoute($blogV['url'],RouteMap::SOURCE_MODULE,$id,503); | ||
| 88 | +// } | ||
| 89 | +// DB::disconnect('custom_mysql'); | ||
| 90 | +// } | ||
| 91 | +// } | ||
| 55 | public function handle(){ | 92 | public function handle(){ |
| 56 | - $projectModel = new Project(); | ||
| 57 | - $list = $projectModel->list(['type'=>['!=',0],'delete_status'=>0]); | ||
| 58 | - foreach ($list as $v){ | ||
| 59 | - echo date('Y-m-d H:i:s') . 'project_id:'.$v['id'] . PHP_EOL; | ||
| 60 | - ProjectServer::useProject($v['id']); | ||
| 61 | - $templateComModel = new BTemplateCom(); | ||
| 62 | - $templateComModel->edit(['source'=>3,'is_list'=>1],['source'=>5,'is_list'=>0,'is_custom'=>0]); | ||
| 63 | - $templateComModel->edit(['source'=>4,'is_list'=>1],['source'=>7,'is_list'=>0,'is_custom'=>0]); | ||
| 64 | - DB::disconnect('custom_mysql'); | 93 | + ProjectServer::useProject(503); |
| 94 | + $newsCate = new NewsCategory(); | ||
| 95 | + $newsList = $newsCate->list(); | ||
| 96 | + foreach ($newsList as $v){ | ||
| 97 | + $data = [ | ||
| 98 | + 'name'=>$v['name'], | ||
| 99 | + 'status'=>0, | ||
| 100 | + 'sort'=>$v['sort'], | ||
| 101 | + 'pid'=>$v['pid'], | ||
| 102 | + 'route'=>$v['alias'], | ||
| 103 | + 'project_id'=>503, | ||
| 104 | + 'operator_id'=>$v['operator_id'], | ||
| 105 | + 'create_id'=>1101, | ||
| 106 | + 'module_id'=>10, | ||
| 107 | + ]; | ||
| 108 | + $moduleCateModel = new CustomModuleCategory(); | ||
| 109 | + $id = $moduleCateModel->addReturnId($data); | ||
| 110 | + RouteMap::setRoute($v['alias'],RouteMap::SOURCE_MODULE_CATE,$id,503); | ||
| 65 | } | 111 | } |
| 66 | - | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - public function synchronizationFile($path_name){ | ||
| 70 | - //同步到大文件 | ||
| 71 | - $file_path = config('filesystems.disks.cos')['cdn1'].$path_name; | ||
| 72 | - $directoryPath = pathinfo($path_name, PATHINFO_DIRNAME); | ||
| 73 | - $cmd = 'curl -F "file_path='.$file_path.'" -F "save_path=/www/wwwroot/cos'.$directoryPath.'" https://v6-file.globalso.com/upload.php'; | ||
| 74 | - return shell_exec($cmd); | 112 | + DB::disconnect('custom_mysql'); |
| 75 | } | 113 | } |
| 76 | } | 114 | } |
| @@ -55,13 +55,13 @@ class UpdateRoute extends Command | @@ -55,13 +55,13 @@ class UpdateRoute extends Command | ||
| 55 | */ | 55 | */ |
| 56 | public function handle(){ | 56 | public function handle(){ |
| 57 | $projectModel = new Project(); | 57 | $projectModel = new Project(); |
| 58 | - $list = $projectModel->list(['id'=>['in',[147]]]); | 58 | + $list = $projectModel->list(['id'=>['in',[1535]]]); |
| 59 | $data = []; | 59 | $data = []; |
| 60 | foreach ($list as $v){ | 60 | foreach ($list as $v){ |
| 61 | echo date('Y-m-d H:i:s') . 'project_id:'.$v['id'] . PHP_EOL; | 61 | echo date('Y-m-d H:i:s') . 'project_id:'.$v['id'] . PHP_EOL; |
| 62 | ProjectServer::useProject($v['id']); | 62 | ProjectServer::useProject($v['id']); |
| 63 | - $this->getProduct(); | ||
| 64 | -// $this->setProductKeyword(); | 63 | +// $this->getProduct(); |
| 64 | + $this->setProductKeyword(); | ||
| 65 | // $this->getBlog(); | 65 | // $this->getBlog(); |
| 66 | DB::disconnect('custom_mysql'); | 66 | DB::disconnect('custom_mysql'); |
| 67 | } | 67 | } |
| @@ -215,7 +215,7 @@ class UpdateRoute extends Command | @@ -215,7 +215,7 @@ class UpdateRoute extends Command | ||
| 215 | 215 | ||
| 216 | public function getProduct(){ | 216 | public function getProduct(){ |
| 217 | $productModel = new Product(); | 217 | $productModel = new Product(); |
| 218 | - $lists = $productModel->list(['status'=>2]); | 218 | + $lists = $productModel->list(['status'=>['!=',2]]); |
| 219 | if(!empty($lists)){ | 219 | if(!empty($lists)){ |
| 220 | foreach ($lists as $v){ | 220 | foreach ($lists as $v){ |
| 221 | if(!empty($v['route'])){ | 221 | if(!empty($v['route'])){ |
| @@ -177,4 +177,21 @@ class KeywordVideoController extends BaseController | @@ -177,4 +177,21 @@ class KeywordVideoController extends BaseController | ||
| 177 | $data['end_total'] = $keywordModel->formatQuery(['status'=>1])->count(); | 177 | $data['end_total'] = $keywordModel->formatQuery(['status'=>1])->count(); |
| 178 | $this->response('success',Code::SUCCESS,$data); | 178 | $this->response('success',Code::SUCCESS,$data); |
| 179 | } | 179 | } |
| 180 | + | ||
| 181 | + /** | ||
| 182 | + * @remark :当月视频总数量 | ||
| 183 | + * @name :getVideoCount | ||
| 184 | + * @author :lyh | ||
| 185 | + * @method :post | ||
| 186 | + * @time :2024/8/14 9:58 | ||
| 187 | + */ | ||
| 188 | + public function getVideoCount(){ | ||
| 189 | + // 当月的开始时间 | ||
| 190 | + $start_of_month = date("Y-m-01 00:00:00"); | ||
| 191 | + // 当月的结束时间:使用 strtotime() 计算最后一天 | ||
| 192 | + $end_of_month = date("Y-m-d 23:59:59", strtotime("last day of this month")); | ||
| 193 | + $taskLogModel = new KeywordVideoTaskLog(); | ||
| 194 | + $count = $taskLogModel->formatQuery(['created_at'=>['between',[$start_of_month,$end_of_month]]])->count(); | ||
| 195 | + $this->response('success',Code::SUCCESS,['count'=>$count]); | ||
| 196 | + } | ||
| 180 | } | 197 | } |
| @@ -37,15 +37,19 @@ class LanguageTxtController extends BaseController | @@ -37,15 +37,19 @@ class LanguageTxtController extends BaseController | ||
| 37 | */ | 37 | */ |
| 38 | public function saveLanguageTxt(){ | 38 | public function saveLanguageTxt(){ |
| 39 | $this->request->validate([ | 39 | $this->request->validate([ |
| 40 | - 'name'=>'required', | ||
| 41 | - 'en_name'=>'required', | 40 | + 'data'=>'required', |
| 42 | ],[ | 41 | ],[ |
| 43 | - 'name.required' => 'name不能为空', | ||
| 44 | - 'en_name'=>'自定义名称en_name不为空', | 42 | + 'data.required' => 'data不能为空', |
| 45 | ]); | 43 | ]); |
| 46 | $languageTxtModel = new LanguageTxt(); | 44 | $languageTxtModel = new LanguageTxt(); |
| 47 | - $id = $languageTxtModel->addReturnId($this->param); | ||
| 48 | - $this->response('success',Code::SUCCESS,['id'=>$id]); | 45 | + foreach ($this->param['data'] as $v){ |
| 46 | + if(isset($v['id']) && !empty($v['id'])){ | ||
| 47 | + $languageTxtModel->edit(['en_name'=>$v['en_name']],['id'=>$v['id']]); | ||
| 48 | + }else{ | ||
| 49 | + $languageTxtModel->addReturnId(['name'=>$v['name'], 'en_name'=>$v['en_name']]); | ||
| 50 | + } | ||
| 51 | + } | ||
| 52 | + $this->response('success'); | ||
| 49 | } | 53 | } |
| 50 | 54 | ||
| 51 | /** | 55 | /** |
| @@ -48,6 +48,11 @@ class AyrReleaseLogic extends BaseLogic | @@ -48,6 +48,11 @@ class AyrReleaseLogic extends BaseLogic | ||
| 48 | $info = $this->model->read(['platforms'=>$this->param['platforms'],'operator_id'=>$this->param['operator_id'],'project_id'=>$this->param['project_id'],'title'=>$this->param['title']]); | 48 | $info = $this->model->read(['platforms'=>$this->param['platforms'],'operator_id'=>$this->param['operator_id'],'project_id'=>$this->param['project_id'],'title'=>$this->param['title']]); |
| 49 | if($info === false){ | 49 | if($info === false){ |
| 50 | $this->model->add($this->param); | 50 | $this->model->add($this->param); |
| 51 | + }else{ | ||
| 52 | + $result_data = json_decode($this->param['result_data']); | ||
| 53 | + if(isset($result_data['status']) && $result_data['status'] == 'success'){ | ||
| 54 | + $this->model->edit($this->param,['id'=>$info['id']]); | ||
| 55 | + } | ||
| 51 | } | 56 | } |
| 52 | return $this->success(); | 57 | return $this->success(); |
| 53 | } | 58 | } |
| @@ -312,7 +312,8 @@ class TranslateLogic extends BaseLogic | @@ -312,7 +312,8 @@ class TranslateLogic extends BaseLogic | ||
| 312 | * @time :2024/5/17 15:11 | 312 | * @time :2024/5/17 15:11 |
| 313 | */ | 313 | */ |
| 314 | public function getRouteSource($route){ | 314 | public function getRouteSource($route){ |
| 315 | - $data = ['source'=>0,'source_id'=>0,'is_list'=>0,'is_custom'=>0]; | 315 | + $routes = $route; |
| 316 | + $data = ['source'=>0,'source_id'=>0,'is_list'=>0,'is_custom'=>0,'page'=>0]; | ||
| 316 | if(strtolower($route) == 'all'){ | 317 | if(strtolower($route) == 'all'){ |
| 317 | return $this->success($data); | 318 | return $this->success($data); |
| 318 | } | 319 | } |
| @@ -321,12 +322,20 @@ class TranslateLogic extends BaseLogic | @@ -321,12 +322,20 @@ class TranslateLogic extends BaseLogic | ||
| 321 | return $this->success($data); | 322 | return $this->success($data); |
| 322 | } | 323 | } |
| 323 | $route = basename($route); | 324 | $route = basename($route); |
| 325 | + $page = 0; | ||
| 326 | + if (is_numeric($route)) { | ||
| 327 | + $arr = explode('/',$routes); | ||
| 328 | + $page = $arr[1]; | ||
| 329 | + $route = $arr[0]; | ||
| 330 | + } | ||
| 324 | $routeModel = new RouteMap(); | 331 | $routeModel = new RouteMap(); |
| 325 | $routeInfo = $routeModel->read(['route'=>$route]); | 332 | $routeInfo = $routeModel->read(['route'=>$route]); |
| 326 | if($routeInfo === false){ | 333 | if($routeInfo === false){ |
| 327 | return $data; | 334 | return $data; |
| 328 | } | 335 | } |
| 329 | - return $this->resultData($routeInfo,$data); | 336 | + $data = $this->resultData($routeInfo,$data); |
| 337 | + $data['page'] = $page; | ||
| 338 | + return $data; | ||
| 330 | } | 339 | } |
| 331 | 340 | ||
| 332 | /** | 341 | /** |
app/Models/Inquiry/InquiryField.php
0 → 100644
| 1 | +<?php | ||
| 2 | +/** | ||
| 3 | + * @remark : | ||
| 4 | + * @name :InquiryField.php | ||
| 5 | + * @author :lyh | ||
| 6 | + * @method :post | ||
| 7 | + * @time :2024/8/13 9:57 | ||
| 8 | + */ | ||
| 9 | + | ||
| 10 | +namespace App\Models\Inquiry; | ||
| 11 | + | ||
| 12 | +use App\Models\Base; | ||
| 13 | + | ||
| 14 | +class InquiryField extends Base | ||
| 15 | +{ | ||
| 16 | + protected $connection = "custom_mysql"; | ||
| 17 | + protected $table = 'gl_inquiry_field'; | ||
| 18 | +} |
| @@ -109,7 +109,6 @@ class InquiryFormData extends Base | @@ -109,7 +109,6 @@ class InquiryFormData extends Base | ||
| 109 | */ | 109 | */ |
| 110 | public static function getCount($submit_at = []){ | 110 | public static function getCount($submit_at = []){ |
| 111 | return self::leftjoin('gl_inquiry_form', 'gl_inquiry_form.id', '=', 'gl_inquiry_form_data.form_id') | 111 | return self::leftjoin('gl_inquiry_form', 'gl_inquiry_form.id', '=', 'gl_inquiry_form_data.form_id') |
| 112 | - ->where('gl_inquiry_form.is_default', 0) | ||
| 113 | ->when($submit_at, function ($query, $submit_at) { | 112 | ->when($submit_at, function ($query, $submit_at) { |
| 114 | $query->whereBetween('submit_at',[$submit_at[0], $submit_at[1]]); | 113 | $query->whereBetween('submit_at',[$submit_at[0], $submit_at[1]]); |
| 115 | }) | 114 | }) |
| @@ -123,7 +122,6 @@ class InquiryFormData extends Base | @@ -123,7 +122,6 @@ class InquiryFormData extends Base | ||
| 123 | */ | 122 | */ |
| 124 | public static function getCountryCount($submit_at = []){ | 123 | public static function getCountryCount($submit_at = []){ |
| 125 | return self::leftjoin('gl_inquiry_form', 'gl_inquiry_form.id', '=', 'gl_inquiry_form_data.form_id') | 124 | return self::leftjoin('gl_inquiry_form', 'gl_inquiry_form.id', '=', 'gl_inquiry_form_data.form_id') |
| 126 | - ->where('gl_inquiry_form.is_default', 0) | ||
| 127 | ->when($submit_at, function ($query, $submit_at) { | 125 | ->when($submit_at, function ($query, $submit_at) { |
| 128 | $query->whereBetween('submit_at',[$submit_at[0], $submit_at[1]]); | 126 | $query->whereBetween('submit_at',[$submit_at[0], $submit_at[1]]); |
| 129 | }) | 127 | }) |
| @@ -351,6 +351,7 @@ Route::middleware(['aloginauth'])->group(function () { | @@ -351,6 +351,7 @@ Route::middleware(['aloginauth'])->group(function () { | ||
| 351 | Route::any('/edit', [Aside\Com\KeywordVideoController::class, 'edit'])->name('keyword_video_edit'); | 351 | Route::any('/edit', [Aside\Com\KeywordVideoController::class, 'edit'])->name('keyword_video_edit'); |
| 352 | Route::any('/getVideoTaskLog', [Aside\Com\KeywordVideoController::class, 'getVideoTaskLog'])->name('keyword_video_getVideoTaskLog'); | 352 | Route::any('/getVideoTaskLog', [Aside\Com\KeywordVideoController::class, 'getVideoTaskLog'])->name('keyword_video_getVideoTaskLog'); |
| 353 | Route::any('/taskNum', [Aside\Com\KeywordVideoController::class, 'taskNum'])->name('keyword_video_taskNum'); | 353 | Route::any('/taskNum', [Aside\Com\KeywordVideoController::class, 'taskNum'])->name('keyword_video_taskNum'); |
| 354 | + Route::any('/getVideoCount', [Aside\Com\KeywordVideoController::class, 'getVideoCount'])->name('keyword_video_getVideoCount'); | ||
| 354 | }); | 355 | }); |
| 355 | 356 | ||
| 356 | // 公共主题模版 | 357 | // 公共主题模版 |
-
请 注册 或 登录 后发表评论