一、前言
很多的应用程序都有登录功能模块,这里的登录注册功能只是简单地模拟了登录注册的过程,并没有真正的发送短信、接收短信的功能。如果想要实现这样的功能,就需要借助第三方平台,比如Bomb。
二、界面截图
- 登录界面
在该界面只要输入了用户名和密码,再点击登录就能进入到主界面。用户名和密码是可以随便输入的,因为只是一个模拟过程,如果需要真的登录,就需要另外添加登录的逻辑了。
- 注册界面
该界面同样也是一个模拟过程,如果童鞋们需要实现真的注册,建议可以简单的使用SQLite数据库,也就是将用户数据保存在安卓中的SQLite数据库当中。我觉得这样是足以应付课程的作业的,因为大学里的安卓开发课程,要求也没那么高,登录注册功能也就是用来凑界面的,当时我们的作业是要求至少8个界面的。
- 主界面
主界面其实什么都没有,就只有Hello World!因为分享这个模块出来就是给大家去改造的,在这里你可以另外编写代码,实现自己想要的功能。
三、代码
1、java代码
- 登录LoginActivity.java
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
/**
* 登录界面
*/
public class LoginActivity extends AppCompatActivity implements View.OnClickListener
{
private EditText editPerson, editCode;
private TextView textViewR;
private Button btn;
private boolean autoLogin = false;
public static String currentUsername;
private String currentPassword;
private boolean progressShow;
private ImageView qq, weixin, weibo;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
init();
}
private void init()
{
btn =findViewById(R.id.bn_common_login);
btn.setOnClickListener(this);
editCode =findViewById(R.id.et_password);
editPerson =findViewById(R.id.et_username);
textViewR = findViewById(R.id.tv_register);
qq = findViewById(R.id.iv_qq_login);
weixin = findViewById(R.id.iv_weixin_login);
weibo = findViewById(R.id.iv_sina_login);
qq.setOnClickListener(this);
weixin.setOnClickListener(this);
weibo.setOnClickListener(this);
textViewR.setOnClickListener(this);
}
/**
* 点击事件
* */
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.bn_common_login: //登录按钮
login(v);
break;
case R.id.tv_register: //注册按钮
Intent intent = new Intent(this, RegisterActivity.class);
startActivity(intent);
finish();
break;
case R.id.iv_qq_login: //QQ登录
Toast.makeText(this, "QQ登录", Toast.LENGTH_SHORT).show();
break;
case R.id.iv_weixin_login: //微信登录
Toast.makeText(this, "微信登录", Toast.LENGTH_SHORT).show();
break;
case R.id.iv_sina_login: //微博登录
Toast.makeText(this, "微博登录", Toast.LENGTH_SHORT).show();
break;
default:
}
}
@Override
protected void onResume()
{
super.onResume();
if (autoLogin)
{
return;
}
}
/**
* 登录
*
* @param view
*/
public void login(View view)
{
currentUsername = editPerson.getText().toString().trim(); //去除空格,获取手机号
currentPassword = editCode.getText().toString().trim(); //去除空格,获取密码
if (TextUtils.isEmpty(currentUsername))
{ //判断手机号是不是为空
Toast.makeText(this, "手机号不能为空!", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(currentPassword))
{ //判断密码是不是空
Toast.makeText(this, "密码不能为空!", Toast.LENGTH_SHORT).show();
return;
}
progressShow = true;
final ProgressDialog pd = new ProgressDialog(LoginActivity.this); //初始化等待动画
/**
* 设置监听
* */
pd.setCanceledOnTouchOutside(false);
pd.setOnCancelListener(new DialogInterface.OnCancelListener()
{
@Override
public void onCancel(DialogInterface dialog)
{
progressShow = false; //设置Boolean值为false
}
});
pd.setMessage("正在登录...."); //等待动画的标题
pd.show(); //显示等待动画
new Thread(new Runnable()
{
public void run()
{
//在此处睡眠两秒
try
{
Thread.sleep(2000); //在此处睡眠两秒
} catch (InterruptedException e)
{
}
/**
* 两秒之后
* */
pd.dismiss(); //等待条消失
Intent intent = new Intent(LoginActivity.this, MainActivity.class); //进入主界面
startActivity(intent); //开始跳转
finish(); //finish掉此界面
}
}).start(); //开始线程
}
}
- 注册RegisterActivity.java
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
/**
* 注册界面
*/
public class RegisterActivity extends AppCompatActivity implements View.OnClickListener
{
private EditText editTextP, editSMS, editTextCT;
private Button button,SMSBtn;
private TextView enterText;
private ImageView returnImage;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
init();
}
private void init()
{
editTextP = findViewById(R.id.et_phone_num);
editSMS = findViewById(R.id.et_sms_code);
editTextCT = findViewById(R.id.et_password);
button = findViewById(R.id.bn_immediateRegistration);
button.setOnClickListener(this);
enterText = findViewById(R.id.tv_enter);
enterText.setOnClickListener(this);
returnImage = findViewById(R.id.iv_return);
returnImage.setOnClickListener(this);
SMSBtn = findViewById(R.id.bn_sms_code);
SMSBtn.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.bn_immediateRegistration:
register();
break;
case R.id.tv_enter:
returnEnter();
break;
case R.id.iv_return:
returnEnter();
break;
case R.id.bn_sms_code:
final String username = editTextP.getText().toString().trim();
if (TextUtils.isEmpty(username))
{
Toast.makeText(this, "用户名不能为空!", Toast.LENGTH_SHORT).show();
editTextP.requestFocus();
}else
{
Toast.makeText(this, "验证码获取成功", Toast.LENGTH_SHORT).show();
}
break;
}
}
private void returnEnter()
{
Intent intent = new Intent(this,LoginActivity.class);
startActivity(intent);
finish();
}
public void register()
{
final String username = editTextP.getText().toString().trim();
final String password = editSMS.getText().toString().trim();
String confirm_password = editTextCT.getText().toString().trim();
if (TextUtils.isEmpty(username))
{ //当手机号没有输入时
Toast.makeText(this, "手机号不能为空!", Toast.LENGTH_SHORT).show();
editTextP.requestFocus();//使输入框失去焦点
return;
} else if (TextUtils.isEmpty(password))
{//当验证码没有输入时
Toast.makeText(this, "验证码不能为空!", Toast.LENGTH_SHORT).show();
editSMS.requestFocus();//使输入框失去焦点
return;
} else if (TextUtils.isEmpty(confirm_password))
{//当注册密码没有输入时
Toast.makeText(this, "密码不能为空!", Toast.LENGTH_SHORT).show();
editTextCT.requestFocus();//使输入框失去焦点
return;
}
if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password))
{
final ProgressDialog pd = new ProgressDialog(this);
pd.setMessage("正在注册……");
pd.show();
new Thread(new Runnable()
{
public void run()
{
//注册的操作放在此处
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
}
pd.dismiss();
Looper.prepare();
Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
Looper.loop();// 进入loop中的循环,查看消息队列
}
}).start();
}
}
}
- 主界面MainActivity.java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
2、界面代码
- 登录的界面activity_login.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f2f2f2"
android:orientation="vertical" >
<LinearLayout style="@style/top_nav" >
<ImageView
android:id="@+id/iv_return"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:src="@drawable/ico_commen_back" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="登录"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="注册"
android:textColor="#404040"
android:textSize="14sp" />
</LinearLayout>
<View style="@style/common_line_gray_90"/>
<LinearLayout
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dp"
android:layout_marginTop="30dp"
android:background="@drawable/bg_radius_sign" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ico_sign_logo" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:background="#ffffff"
android:orientation="vertical" >
<View
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="#07a6e6" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="8dp"
android:src="@drawable/ico_sign_01" />
<EditText
android:id="@+id/et_username"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@null"
android:gravity="center_vertical"
android:hint="用户名/手机号"
android:textColor="@android:color/darker_gray"
android:textColorHint="@android:color/darker_gray"
android:textSize="14sp" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1px"
android:layout_marginLeft="28dp"
android:layout_marginRight="28dp"
android:background="#d9d9d9" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="8dp"
android:src="@drawable/ico_sign_02" />
<EditText
android:id="@+id/et_password"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@null"
android:gravity="center_vertical"
android:hint="密码"
android:inputType="textPassword"
android:textColor="@android:color/darker_gray"
android:textColorHint="@android:color/darker_gray"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录或注册则表示您同意"
android:textColor="@android:color/darker_gray"
android:textSize="13sp" />
<TextView
android:id="@+id/tv_termOfService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="14dp"
android:paddingTop="18dp"
android:text="《使用条款》"
android:textColor="#63d065"
android:textSize="13sp" />
</LinearLayout>
<Button
android:id="@+id/bn_common_login"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:background="@drawable/bg_radius_sign_btn"
android:text="登 录"
android:textColor="#ffffff"
android:textSize="15sp" />
<Button
android:id="@+id/bn_forget_password"
android:layout_width="wrap_content"
android:layout_height="44dp"
android:paddingLeft="12dp"
android:layout_gravity="right"
android:layout_marginRight="42dp"
android:background="@null"
android:text="忘记密码?"
android:textColor="#4ebeea"
android:textSize="13sp" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingLeft="54dp"
android:paddingRight="54dp" >
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_weight="1"
android:background="#bfbfbf" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="28dp"
android:layout_marginRight="28dp"
android:text="更多登录"
android:textColor="#999999"
android:textSize="12sp" />
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_weight="1"
android:background="#bfbfbf" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:layout_marginTop="12dp"
android:gravity="center"
android:orientation="horizontal"
android:paddingLeft="18dp"
android:paddingRight="18dp" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_qq_login"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginBottom="3dp"
android:src="@drawable/ico_sign_04" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QQ登录"
android:textColor="#999999"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_weixin_login"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginBottom="3dp"
android:src="@drawable/ico_sign_05" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="微信登录"
android:textColor="#999999"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_sina_login"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginBottom="3dp"
android:src="@drawable/ico_sign_06" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="微博登录"
android:textColor="#999999"
android:textSize="13sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
- 注册的界面activity_register.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f2f2f2"
android:orientation="vertical" >
<LinearLayout style="@style/top_nav">
<ImageView
android:id="@+id/iv_return"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:src="@drawable/ico_commen_back" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="注册"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_enter"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center"
android:padding="8dp"
android:text="登录"
android:textColor="#404040"
android:textSize="14sp" />
</LinearLayout>
<View style="@style/common_line_gray_90"/>
<!-- 注册 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginTop="24dp"
android:background="#ffffff"
android:orientation="vertical" >
<View
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="#07a6e6" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="8dp"
android:src="@drawable/ico_sign_01" />
<EditText
android:id="@+id/et_phone_num"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@null"
android:gravity="center_vertical"
android:hint="请填写手机号"
android:inputType="number"
android:textColor="@android:color/darker_gray"
android:textColorHint="@android:color/darker_gray"
android:textSize="14sp" />
<Button
android:id="@+id/bn_sms_code"
android:layout_width="88dp"
android:layout_height="28dp"
android:layout_marginRight="6dp"
android:background="@drawable/bg_radius_register_btn"
android:text="获取验证码"
android:textColor="#9507a6e6"
android:textSize="12sp" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1px"
android:layout_marginLeft="28dp"
android:layout_marginRight="28dp"
android:background="#d9d9d9" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="8dp"
android:src="@drawable/ico_sign_03" />
<EditText
android:id="@+id/et_sms_code"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@null"
android:gravity="center_vertical"
android:hint="短信验证码"
android:inputType="number"
android:textColor="@android:color/darker_gray"
android:textColorHint="@android:color/darker_gray"
android:textSize="14sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="6dp"
android:background="@null"
android:text="收不到?"
android:visibility="gone"
android:textColor="#4c4c4c"
android:textSize="12sp" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1px"
android:layout_marginLeft="28dp"
android:layout_marginRight="28dp"
android:background="#d9d9d9" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="8dp"
android:src="@drawable/ico_sign_02" />
<EditText
android:id="@+id/et_password"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@null"
android:gravity="center_vertical"
android:hint="设置登录密码"
android:inputType="textPassword"
android:textColor="@android:color/darker_gray"
android:textColorHint="@android:color/darker_gray"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录或注册则表示您同意"
android:textColor="@android:color/darker_gray"
android:textSize="13sp"
android:id="@+id/textView" />
<TextView
android:id="@+id/tv_termOfService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="14dp"
android:paddingTop="18dp"
android:text="《使用条款》"
android:textColor="#63d065"
android:textSize="13sp" />
</LinearLayout>
<Button
android:id="@+id/bn_immediateRegistration"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:background="@drawable/bg_radius_sign_btn"
android:text="立即注册"
android:textColor="#ffffff"
android:textSize="15sp" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/view" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingLeft="54dp"
android:paddingRight="54dp"
android:visibility="gone" >
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_weight="1"
android:background="#bfbfbf" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="28dp"
android:layout_marginRight="28dp"
android:text="更多登录"
android:textColor="#999999"
android:textSize="12sp" />
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_weight="1"
android:background="#bfbfbf" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:layout_marginTop="12dp"
android:gravity="center"
android:orientation="horizontal"
android:paddingLeft="18dp"
android:paddingRight="18dp"
android:visibility="gone" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:src="@drawable/ico_sign_04" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QQ登录"
android:textColor="#999999"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:src="@drawable/ico_sign_05" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="微信登录"
android:textColor="#999999"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:src="@drawable/ico_sign_06" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="微博登录"
android:textColor="#999999"
android:textSize="13sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
- 主界面activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
四、项目地址
因为项目还需要用到一些图片资源,上面给出的只是活动的java代码和对应的布局代码,如果需要用到图片资源的话,可以去github把项目克隆或者是下载下来。
项目的github地址