上学笔记,Laravel程序架构设计思路之使用动作类

澳门葡京备用网址 1

前言

前言

Laravel 的Validation卓殊强大有无数用法,那里给出链接方便查阅
此地有两份文档,Laravel英文文档和Laravel汉语文档,即便英文水准有限,但是日子充分的情况下依旧渐渐啃一啃英文文档。

当大家谈论到应用程序的架构的时候,平时会问到一个经典的题材,那就是“那段代码应该置身哪个地方比较好”。
因为 Laravel
是一个一定灵活的框架,所以要回应那几个难题其实没那么不难。我应当把自己的事体逻辑写在
Model 层,仍旧 Controller 层,或者是其余地点?

当我们谈论到应用程序的架构的时候,平常会问到一个经典的难点,这就是“那段代码应该置身何地相比好”。
因为 Laravel
是一个一定灵活的框架,所以要回应这些难点莫过于没那么不难。我应当把我的业务逻辑写在
Model 层,仍然 Controller 层,或者是此外地点?

当我们谈论到应用程序的架构的时候,平日会问到一个经典的难点,那就是“那段代码应该置身哪个地方比较好”。
因为 Laravel
是一个一定灵活的框架,所以要应对那个难题莫过于没那么不难。我应当把我的工作逻辑写在
Model 层,仍旧 Controller 层,或者是其余地方?

自定义表明规则

Laravel的验证措施很多,可是出于大家业务的急需,并不可能满意大家拥有的要求。由于Laravel没有像验证email一样的平整验证手机号码(差距地方的电话号码当然也不平等),所以上边我们自定义一个认证手机号码的规则
‘phone_number’。
是因为只添加一个表明,所以在app/Providers/AppServiceProvider.php中定义,

use Illuminate\Support\Facades\Validator;
public function boot(){
    Validator::extend('phone_number', function($attribute, $value, $parameters, $validator) {
        if(preg_match("/^1[34578]\d{9}$/", $value)){
            return true;
        }
        return false;
    });
}

一经要自定义七个说明规则,最好写一个类公事引入在上述boot方法中。

现在我们付出这么些注解的报错音讯,文档中注脚在表达语言包中添加验证新闻,那我们在resoueces/lang/en/validation.php中如下地方添加报错音讯,

<?php
return [
    'phone_number'    => 'Phone number format is wrong.',
    'accepted'             => 'The :attribute must be accepted.',
     ......

如此就达成自定义表达规则了,可以擅自使用了,例如

public function register(Request $request){
    $this->validate($request[
        'phone' => 'required|phone_number',
    ]);
}

当你的应用程序仅有一个接入点,把工作逻辑写在 Controller
层是足以的。可是现在更广泛的的意况是,有广大接入点去调用相同的效用模块。

当你的应用程序仅有一个接入点,把事情逻辑写在 Controller
层是可以的。但是现在更常见的的情况是,有过多接入点去调用相同的效能模块。

当您的应用程序仅有一个接入点,把作业逻辑写在 Controller
层是可以的。不过现在更常见的的图景是,有广大接入点去调用相同的功用模块。

表单请求验证( Form Request Validation )

由于在app/HTTP/Controller/UserController.php中有诸多有关用户的function,那里打算动用表单请求验证提交过来的值,在命令行中键入

php artisan make:request UserValidation

会生成app/HTTP/Requests/UserValidation.php文件,在rules方法中完结验证逻辑

public function rules()    {
    return $rules = [
        'user.name' => 'required',
        'user.password' => 'required',
    ];
}

唯独如今那里出现难点,由于传过来的是user数组,好像并不可能印证到传过来的值,如今题材没有缓解。

澳门葡京备用网址,注:
上述难点已解决,是由于在app/HTTP/Requests/UserValidation.php文件中,另一个function中的再次来到值为false,所以博得的值永远是Forbidden。只需要改为return
true即可,代码如下

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize(){
    //ci'chu
    return true;
}

调用如下,

use App\Http\Requests\UsersValidation;
public function login(UserValidation $request){
    //function
}

比如,太多数的应用程序都有用户注册的成效,它的流水线是调用一个控制器然后回去一个注册成功或者失利的视图。假设那几个应用程序还有移动端,那就很可能要提供一套针对移动端用户注册的
API ,因为它须求回到的多寡格式是 JSON 。而且选择 Laravel 的 artisan
命令来创设用户也很广泛,尤其是在项目中期的开发阶段。

诸如,太多数的应用程序都有用户注册的法力,它的流水线是调用一个操纵器然后回到一个报了名成功如故失败的视图。若是那些应用程序还有移动端,那就很可能要提供一套针对移动端用户注册的
API ,因为它要求重返的多少格式是 JSON 。而且使用 Laravel 的 artisan
命令来创立用户也很常见,尤其是在项目先前时期的开发阶段。

比如说,太多数的应用程序都有用户注册的效应,它的流水线是调用一个决定器然后重回一个注册成功照旧败北的视图。假设这几个应用程序还有移动端,那就很可能要提供一套针对移动端用户注册的
API ,因为它要求重返的多少格式是 JSON 。而且动用 Laravel 的 artisan
命令来成立用户也很普遍,尤其是在项目中期的开发阶段。

上学笔记,Laravel程序架构设计思路之使用动作类。展现验证error massage

题目讲述:做项目时使用前后端分离做项目,后端只交付接口,前端按接口已毕页面。由于后端用Laravel框架,在用户登录的时候会评释前端提交过来的参数,验证通过了本来不是难题,若验证未通过,后端会直接报错,前端则不会接到重返值,也就不会有任何提示,那种情状怎样缓解?
那里引用一下大牛的博文,Vue.js——vue-resource全攻略。
里面化解难题的一对代码如下,

this.$http.get('/someUrl', [options]).then((response) => { 
    // 响应成功回调
}, (response) => {
    // 响应错误回调
});

澳门葡京备用网址 2

澳门葡京备用网址 3

澳门葡京备用网址 4

表单请求验证#

地方那两段代码可能看起来没有什么样难题的,不过,随着工作逻辑的加码,就会来得代码很冗余。举个例子,假如您必要新用户注册完将来,增加给用户发送邮件通知的成效,你不可能不要再上边四个控制器中都加上发送邮件的代码。不过如若要保险代码的洗练优雅,大家得以把那个业务逻辑写到其余地方。

下面那两段代码可能看起来没有啥样难题的,然则,随着工作逻辑的增多,就会突显代码很冗余。举个例子,若是您必要新用户注册完事后,伸张给用户发送邮件通告的机能,你不可以不要再上边七个控制器中都丰盛发送邮件的代码。可是只要要维持代码的简练优雅,大家得以把这几个工作逻辑写到其余地点。

上边那两段代码可能看起来没有什么问题的,不过,随着业务逻辑的加码,就会来得代码很冗余。举个例子,倘诺您需求新用户注册完之后,扩充给用户发送邮件布告的意义,你无法不要再上边七个控制器中都增加发送邮件的代码。然而一旦要保证代码的精简优雅,我们得以把那个事情逻辑写到其余地点。

开创表单请求#

在更复杂的求证情境中,你恐怕会想要创造一个「表单请求( form request
)」。表单请求是一个自定义的呼吁类,里面富含着表达逻辑。要创设一个表单请求类,可使用
Artisan 命令行命令 make:request:

php artisan make:request StoreBlogPost

新生成的类保存在 app/Http/Requests
目录下。假设那个目录不设有,那么将会在你运行 make:request
命令时创设出来。让大家添加一些验证规则到 rules 方法中:

/**
 * 获取适用于请求的验证规则。
 *
 * @return array
 */
public function rules(){
  return [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ];
}

如何才能较好的运作验证规则吧?你所急需做的就是在控制器方法中选择项目提醒传入请求。传入的伸手会在控制器方法被调用前进行表达,意思就是说您不会因为证实逻辑而把控制器弄得一团糟:

/**
 * 保存传入的博客文章。
 *
 * @param StoreBlogPost $request
 * @return Response
 */
public function store(StoreBlogPost $request){
  // 传入的请求是有效的...
}

万一证实战败,就会转移一个重定向响应把用户再次回到到从前的地方。那几个不当会被闪存到
session,所以这几个错误都可以被展现。若是进入的是 AJAX
请求的话,则会传播一个 HTTP 响应,其中包括了 422 状态码和验证错误的 JSON
数据。

对此“把业务逻辑代码写到哪个地方”的那几个题材,你去其余论坛都可以博得一个普遍的答案,那就是
“使用一个 service 层,然后在 controller
层调用那个服务类”。是的,没错,难点是大家应当怎么统筹 service
类?是创造一个 UserService
类来完结所有跟用户用户有关的工作逻辑,然后把那个类注入到要求使用的
Controller 层?或者是还有其余方案?

对于“把业务逻辑代码写到哪个地方”的那些标题,你去其余论坛都足以赢得一个广泛的答案,那就是
“使用一个 service 层,然后在 controller
层调用那个服务类”。是的,没错,难题是大家相应怎么设计 service
类?是创办一个 UserService类来促成所有跟用户用户有关的政工逻辑,然后把那几个类注入到须要采取的
Controller 层?或者是还有其它方案?

对于“把工作逻辑代码写到哪儿”的那一个题材,你去其余论坛都得以得到一个普遍的答案,那就是
“使用一个 service 层,然后在 controller
层调用那些服务类”。是的,没错,难点是大家理应怎么统筹 service
类?是创办一个 UserService类来落到实处所有跟用户用户有关的工作逻辑,然后把那一个类注入到须要动用的
Controller 层?或者是还有别的方案?

授权表单请求#

表单的请求类内含有了 authorize
方法。在那个法子中,你可以肯定用户是还是不是真的通过了授权,以便更新指定数量。比方说,有一个用户想计较去立异一篇文章的评头品足,你能确保他实在是那篇评论的拥有者吗?具体代码如下:

/**
 * 判断用户是否有权限做出此请求。
 * * @return bool
 */
public function authorize(){
 $comment = Comment::find($this->route('comment'));
 return $comment && $this->user()->can('update', $comment);
}

鉴于负有的表单请求都是扩展于基础的 Laravel 请求类,所以大家可以利用
user
方法去得到当前证实登录的用户。同时请留心上述例子中对 route
艺术的调用。这一个法子授权你取得调用的路由规则中的 URI
参数,譬如下边例子中的 {comment}
参数:

Route::post(‘comment/{comment}’);

即使 authorize 方法再次回到 false,则会自动重回一个 HTTP 响应,其中包蕴 403
状态码,而你的控制器方法也将不会被运行。

如若你打算在应用程序的别样一些处理授权逻辑,只需从 authorize 方法再次来到true:

/**
 * 判断用户是否有权限做出此请求。 
 *
 * @return bool
 */
public function authorize(){
 return true;
}

避免神类的坑

先是,可以品尝为一个特定的模型创设一个单一类,其中带有所有的代码。例如:

澳门葡京备用网址 5

看起来很周全:我们可以此外控制器中表达或者使用 create/delete
方法,并且取得我们想要的结果。然则,那种达成有啥样难题呢?
这就是大家在缓解难点的经过一般很少使用单一的模子 

例如,当大家给一个用户创设了账号的时候,也要同时给用户单独成立一个
blog 。如果按照如今的格局去完成那一个流程,我们就必须成立一个
BlogService 类,然后将其借助注入到 UserService 类。

澳门葡京备用网址 6

明明,随着应用程序的事情的增长,将会有几十到不少个 service
类,其中的局地 service 类需求依靠 5 到 6 个其余 service
类,最后的结果就是,出现代码的冗余跟混乱的规模,而这么些范围是大家想不惜一切代价去防止的。

防止神类的坑

幸免神类的坑

介绍单动作类

那就是说,如若不是用一个十足的服务类加上多少个点子,大家决定把它分成多少个类?上边是自家近年每一个体系都利用的方法,结果很科学,推荐给大家。

第一,让大家抛开过于笼统和模糊的服务术语,来打听一下我们的新动作类,并定义它们是何等以及它们得以做什么。

  • 一个动作类,应该有一个可以注解其功效的名字,比如:CreateOrder,
    ConfirmCheckout, DeleteProduct, AddProductToCart
    等。
  • 它应该有且唯有一个集体措施,作为 API
    。理想的情况下,应该是一致的主意名,像 handle() 或者 execute()
    。如果须要对大家的动作类落成某种适配器方式,那是分外便宜的。
  • 它必须对请求和响应不可见。它不处理请求,也不发送响应。这样的天职应该由控制器来承担。
  • 它可以依靠别的的动作类。
  • 即使有其余事情阻止它执行和/或重回期望的值,那么它必须通过抛出一个
    Exception 来强制执行相关的事务逻辑,并且让调用者(或者 Laravel 的
    ExceptionHandler )来担负什么样显示/响应格外的义务。

先是,可以尝尝为一个一定的模型创设一个单纯类,其中带有所有的代码。例如:

先是,可以品尝为一个特定的模型创造一个单纯类,其中蕴藏所有的代码。例如:

创造大家的 CreateUser 动作类

现行,让我们看看前面的例证,并用一个单动作类来重构它,大家将命名为
CreateUser 。

澳门葡京备用网址 7

您恐怕想精通当邮箱地址已经被占据时,该方法为啥会抛出了万分。
那难道说不是呼吁验证来确保的吧?当然可以。但是,在动作类内部来实施工作逻辑不是更可以吗?这样使得逻辑变得容易通晓和调节。

让大家看看使用大家动作类之后的控制器代码,如下:

澳门葡京备用网址 8

现行,无论大家做什么样修改,用户注册进度都会由 API 和 Web
版本处理,优雅整洁。

看起来很周密:大家得以其余控制器中表达或者采纳 create/delete
方法,并且得到大家想要的结果。可是,那种完结有如何难题啊?
那就是大家在化解难点的进度一般很少使用单一的模子 。

看起来很完美:我们可以别的控制器中注明或者采取 create/delete
方法,并且取得我们想要的结果。可是,那种完成有如何难点吧?
那就是大家在缓解难点的经过一般很少使用单一的模型 。

动作类的嵌套

万一,我们需求一个动作类将 1000
个用户导入大家的行使中。大家可以写一个动作类,并且三番一次应用上文的
CreateUser 类:

澳门葡京备用网址 9

不行清爽,不是啊?大家得以因此将其放置在 Collection::map()
方法中来重用 CreateUser
代码,然后回来所有新建用户的汇集。当邮件被占据的时候,大家得以经过再次来到Null Object 或者在 Log 文件中记录一下,你应当已经想到了。

诸如,当大家给一个用户创造了账号的时候,也要同时给用户单独制造一个
blog 。若是根据近来的办法去已毕这几个流程,大家就必须制造一个 Blog瑟维斯类,然后将其借助注入到 UserService 类。

例如,当我们给一个用户成立了账号的时候,也要同时给用户单独创设一个
blog 。倘诺依照方今的方法去落成这些流程,大家就亟须创立一个 Blog瑟维斯类,然后将其借助注入到 UserService 类。

动作类的装点

现行,假使大家想在日记中记录每一个新注册的用户。大家得以将代码写在动作类内部,也可以运用装饰者格局。

澳门葡京备用网址 10

下一场,我们可以使用 Laravel 的 IoC 容器将 LogCreateUser 类绑定到
CreateUser 类,所有每当大家要求一个接班人的实例时,前者都会注入进来:

澳门葡京备用网址 11

AppServiceProvider.php

那使得应用部署或环境变量来决定日志记录作用的激活或停用更为有利于:

澳门葡京备用网址 12

AppServiceProvider.php

澳门葡京备用网址 13

澳门葡京备用网址 14

总结

选取这一个主意就好像会须求过多的类。当然,用户注册仅仅是一个不难易行的事例,目的在于有限支撑代码的简单清晰。一旦项目标复杂度开头狠抓,动作类的着实的市值就一发明朗,因为你清晰的敞亮代码所在及其界定。

明确,随着应用程序的业务的升高,将会有几十到很三个 service
类,其中的部分 service 类必要借助 5 到 6 个其他 service
类,最终的结果就是,出现代码的冗余跟混乱的范畴,而以此局面是我们想不惜一切代价去幸免的。

旗帜显著,随着应用程序的事体的滋长,将会有几十到无数个 service
类,其中的局部 service 类必要依靠 5 到 6 个其他 service
类,最终的结果就是,出现代码的冗余跟混乱的范围,而这一个层面是我们想不惜一切代价去幸免的。

应用单动作类的益处:

  • 小巧而单一的逻辑域可以防止代码重复并加强代码的可重用性,保持安静。
  • 不难针对各类现象举办单独测试。
  • 负有意义的命名在大型项目中更便于阅读。
  • 简单装饰。
  • 全部项目的一致性:防止代码分布在 Controllers、Models 等。

本来,这些办法是依据自身过去几年利用 Laravel
的片段经历和自我在一部分门类中的实践。那对本人的确很有用,现在自己甚至在部分中小型项目中动用。

要是您有分化的办法,我越发期望读一读。

越来越多现代化 PHP 知识,请前往 Laravel / PHP
知识社区

介绍单动作类

介绍单动作类

那么,倘使不是用一个纯粹的服务类加上多少个方法,大家决定把它分成多少个类?下边是本人近年每一个档次都接纳的主意,结果很正确,推荐给大家。

那么,若是否用一个单纯的服务类加上多少个格局,大家决定把它分成多少个类?上边是本人近年每一个档次都应用的法子,结果很正确,推荐给我们。

先是,让大家抛开过于笼统和模糊的服务术语,来打探一下大家的新动作类,并定义它们是怎样以及它们得以做什么样。

第一,让大家抛开过于笼统和模糊的服务术语,来打听一下大家的新动作类,并定义它们是怎么着以及它们得以做哪些。

  • 一个动作类,应该有一个可见表明其效用的名字,比如:CreateOrder,
    ConfirmCheckout, DeleteProduct, AddProductToCart等。
  • 它应有有且唯有一个国有措施,作为 API
    。理想的情状下,应该是千篇一律的章程名,像 handle() 或者 execute()
    。借使急需对我们的动作类落成某种适配器格局,那是更加便宜的。
  • 它必须对请求和响应不可见。它不处理请求,也不发送响应。那样的职分应该由控制器来负责。
  • 它可以依靠其余的动作类。
  • 一旦有其余工作阻止它执行和/或回到期望的值,那么它必须经过抛出一个
    Exception 来强制执行相关的事情逻辑,并且让调用者(或者 Laravel 的
    ExceptionHandler )来负担怎么着表现/响应卓殊的任务。
  • 一个动作类,应该有一个可见表达其效能的名字,比如:CreateOrder,
    ConfirmCheckout, DeleteProduct, AddProductToCart等。
  • 它应当有且唯有一个国有措施,作为 API
    。理想的景况下,应该是一样的办法名,像 handle() 或者 execute()
    。固然急需对我们的动作类完毕某种适配器方式,那是尤其有利于的。
  • 它必须对请求和响应不可见。它不处理请求,也不发送响应。那样的职分应该由控制器来负责。
  • 它可以凭借其余的动作类。
  • 假若有任何业务阻止它实施和/或再次回到期望的值,那么它必须通过抛出一个
    Exception 来强制执行相关的作业逻辑,并且让调用者(或者 Laravel 的
    ExceptionHandler )来顶住什么样显示/响应卓殊的权利。

创建大家的 CreateUser 动作类

创制我们的 CreateUser 动作类

如今,让我们看看前边的例证,并用一个单动作类来重构它,我们将命名为
CreateUser 。

现在,让大家看看前边的例子,并用一个单动作类来重构它,大家将命名为
CreateUser 。

澳门葡京备用网址 15

澳门葡京备用网址 16

您恐怕想驾驭当邮箱地址已经被占据时,该方法为啥会抛出了至极。
这难道说不是请求验证来确保的吧?当然可以。可是,在动作类内部来施行工作逻辑不是更可以吗?那样使得逻辑变得不难通晓和调节。

你可能想驾驭当邮箱地址已经被占用时,该格局为何会抛出了充裕。
那难道说不是请求验证来确保的吧?当然可以。不过,在动作类内部来举办工作逻辑不是更好啊?那样使得逻辑变得简单领悟和调节。

让我们看看使用大家动作类之后的控制器代码,如下:

让我们看看使用大家动作类之后的控制器代码,如下:

澳门葡京备用网址 17

澳门葡京备用网址 18

今昔,无论大家做什么样修改,用户注册进度都会由 API 和 Web
版本处理,优雅整洁。

近来,无论我们做怎么着修改,用户注册进度都会由 API 和 Web
版本处理,优雅整洁。

动作类的嵌套

动作类的嵌套

假定,我们需求一个动作类将 1000
个用户导入大家的应用中。我们得以写一个动作类,并且三番四次利用上文的
CreateUser 类:

一旦,我们须要一个动作类将 1000
个用户导入大家的采用中。大家得以写一个动作类,并且一连应用上文的
CreateUser 类:

澳门葡京备用网址 19

澳门葡京备用网址 20

相当整洁,不是吧?大家可以透过将其内置在 Collection::map() 方法中来重用
CreateUser
代码,然后重临所有新建用户的集合。当邮件被占据的时候,我们得以经过返回Null Object 或者在 Log 文件中记录一下,你应该早就想到了。

很是干净,不是吗?大家得以经过将其置于在 Collection::map() 方法中来重用
CreateUser
代码,然后回到所有新建用户的集合。当邮件被占用的时候,我们可以通过再次来到Null Object 或者在 Log 文件中著录一下,你应该已经想到了。

动作类的点缀

动作类的装潢

近期,如果大家想在日记中记录每一个新登记的用户。我们可以将代码写在动作类内部,也可以选用装饰者方式。

方今,倘若我们想在日记中著录每一个新登记的用户。大家可以将代码写在动作类内部,也能够行使装饰者方式。

澳门葡京备用网址 21

澳门葡京备用网址 22

下一场,大家得以应用 Laravel 的 IoC 容器将 LogCreateUser 类绑定到
CreateUser 类,所有每当我们需求一个继承人的实例时,前者都会注入进来:

下一场,大家得以接纳 Laravel 的 IoC 容器将 LogCreateUser 类绑定到
CreateUser 类,所有每当大家须求一个后人的实例时,前者都会注入进来:

澳门葡京备用网址 23

澳门葡京备用网址 24

AppServiceProvider.php

AppServiceProvider.php

这使得应用布置或环境变量来支配日志记录作用的激活或停用更为便利:

那使得应用安插或环境变量来决定日志记录作用的激活或停用更为便利:

澳门葡京备用网址 25

澳门葡京备用网址 26

AppServiceProvider.php

AppServiceProvider.php

总结

总结

行使那几个措施似乎会须求广大的类。当然,用户注册仅仅是一个简单的例证,目的在于有限支撑代码的简约清晰。一旦项目标复杂度伊始增强,动作类的实在的市值就越来越显然,因为您清晰的通晓代码所在及其界定。

选择那些格局就如会必要多多的类。当然,用户注册仅仅是一个简约的事例,意在有限辅助代码的简约清晰。一旦项目标复杂度开首抓好,动作类的真的的市值就进一步举世瞩目,因为你清晰的了然代码所在及其界定。

拔取单动作类的裨益:

应用单动作类的便宜:

  • 精致而纯粹的逻辑域可以预防代码重复并进步代码的可重用性,保持安静。
  • 不难针对种种场地进行独立测试。
  • 享有意义的命名在大型项目中更易于阅读。
  • 不难装饰。
  • 全副项目的一致性:防止代码分布在 Controllers、Models 等。
  • 精美而纯净的逻辑域可以预防代码重复并增强代码的可重用性,保持安澜。
  • 不难针对各样现象举办单独测试。
  • 享有意义的命名在大型项目中更便于阅读。
  • 不难装饰。
  • 全体项目标一致性:幸免代码分布在 Controllers、Models 等。

本来,那个艺术是按照自身过去几年利用 Laravel
的一些经历和自家在部分体系中的实践。那对自身确实很有用,现在本身甚至在有的中小型项目中利用。

本来,这些艺术是根据自身过去几年利用 Laravel
的部分经历和自身在有的种类中的实践。那对本身真的很有用,现在本人甚至在一部分中小型项目中采取。

如果你有例外的艺术,我那一个愿意读一读。

若是您有例外的方法,我极度期待读一读。

总结

以上就是这篇文章的全体内容了,希望本文的情节对我们的上学或者办事有着一定的参考学习价值,要是有疑点大家可以留言交流,谢谢大家对台本之家的支撑。

你或许感兴趣的篇章:

  • 对于Laravel
    5.5主题架构的长远精晓
  • Laravel中使用自己编辑类库的3种办法
  • Laravel框架中扩大函数、扩充自定义类的艺术
  • Laravel 5.5
    的自定义验证目标/类示例代码详解
  • Laravel
    加载第三方类库的法子

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website