前言
开头先骗赞,因为太长了,我觉得你不一会翻到结尾。所以开头就先骗赞再说。
给个赞吧!
!
这周学习了Java与数据库的相关知识,因此本周作业是一款涉及数据库的简易ATM机系统。很是尴尬,上周作业没有完成,导致上一篇博客无限期延后,是我的锅!还是要好好学习!
这个系统有两种版本,一个是基于office家的Access,另一个是基于开源的MySQL。因为书本上是MySQL的配套教程、但我们老师也说了Access。所以我优先做MySQL版本的,有时间再改成access版本。(其实大同小异)
也是源码放到了文章里,导致本文太长,不想太麻烦的同学可以在这里下载
当然是免费的,请随意下载,能再给一些建议最好不过了。
哈!csdn居然改我的积分,我明明设置成的0积分,给我改成了4积分,佩服佩服!
这样的话,我放到我的蓝奏云,小文件亲测好用,大家随意下载,给予点建议最好了
转载请标明作者&出处
https://pan.lanzou.com/b01bg0hsj
密码:hhhh
正文
基于MySQL
1.需求分析:
2.设计思路:
这个系统我将会分成5个部分,分别对应5个类(5个界面)。
HomeFrame——主界面
SigninFrame——注册界面
RegisterFrame——登陆后的用户界面
ManagerFrame——管理员界面
UserFrame—— 用户界面
1> HomeFramel类(主类、主界面)
public static void main(String[] args) 主方法
public void set() 设置显示在主界面的交互信息
public HomeFrame() 构造函数进行初始化
public void init() 初始化方法具体实现
public void actionPerformed(ActionEvent e)
为 注册 & 登录 两个按钮做事件响应。
void register() void signin()
事件相应的具体方法,分别调用 注册 & 用户 界面
(以上是含有的方法)
第一部分源码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class HomeFrame extends JFrame implements ActionListener {
private JFrame frame;
private JButton JB_register,JB_signin; //注册、登录按钮
private JTextArea JT_txt;
private String txt;
private Font font;
private ActionListener listener1,listener2;
void set(){
txt="***********************************"+"\n\n"+" 欢迎使用建设银行自动取款机\n"+
" 请您先进行登录或注册"+"\n\n"+"***********************************";
font=new Font("楷体",Font.PLAIN,20);
}
//构造函数
public HomeFrame(){
set();
init();//初始化
}
//初始化方法
void init(){
frame=new JFrame("ATM机系统");
frame.setBounds(700,300,500,500);
frame.setLayout(null);
JB_signin=new JButton("注册");
frame.add(JB_signin);
JB_signin.setBounds(120,300,80,30);
JB_signin.addActionListener(this);//注册
JB_register=new JButton("登录");
frame.add(JB_register);
JB_register.setBounds(300,300,80,30);
JB_register.addActionListener(this);//登录
JT_txt=new JTextArea(txt);
frame.add(JT_txt);
JT_txt.setBounds(75,50,350,140);
JT_txt.setFont(font);
JT_txt.setBackground(Color.orange);
JT_txt.isDisplayable();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args){
HomeFrame frame=new HomeFrame();
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==JB_register){
register();
}else if(e.getSource()==JB_signin){
signin();
}
}
//登录
void register(){
RegisterFrame f1=new RegisterFrame();
}
void signin(){
SigninFrame f2=new SigninFrame();
}
}
2> SigninFrame类(注册界面)
public void set() 设置显示在主界面的交互信息
public SigninFrame() 构造函数进行初始化
public void init() 初始化方法具体实现
public void actionPerformed(ActionEvent e)
对 确认按钮 进行事件响应,规范了注册信息
实现了
1.有未填的空项目,不予注册
2.账户重复的,不予注册
3.账户格式不规范的,不予注册
4.密码与确认密码不符的,不予注册
5.注册成功进行提示
public void signin(SigninFrame x)
实现注册的数据库操作
public boolean myequals(SigninFrame x)
判断账户是否重复
(以上是含有的方法)
第二部分源码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
public class SigninFrame extends JFrame implements ActionListener {
private JFrame frame1;
private JLabel info,JL_1,JL_2,JL_3,JL_4;
private JTextField JT_1,JT_2,JT_3,JT_4;
private JButton JB_ok;
ActionListener listener;
public void set(){
info=new JLabel();
info.setText(" 注意!!账号开头不可为1,且项目不可为空");
}
public SigninFrame(){
set();
init();
}
public void init(){
frame1=new JFrame("账户注册");
frame1.setBounds(700,300,500,500);
frame1.setLayout(new GridLayout(10,1));
info.setFont(new Font("楷体",Font.BOLD,20));
frame1.add(info);
frame1.add(JL_1=new JLabel("账号"));
JL_1.setFont(new Font("宋体",Font.PLAIN,15));
frame1.add(JT_1=new JTextField());
frame1.add(JL_2=new JLabel("姓名"));
JL_2.setFont(new Font("宋体",Font.PLAIN,15));
frame1.add(JT_2=new JTextField());
frame1.add(JL_3=new JLabel("密码"));
JL_3.setFont(new Font("宋体",Font.PLAIN,15));
frame1.add(JT_3=new JTextField());
frame1.add(JL_4=new JLabel("再次确认密码"));
JL_4.setFont(new Font("宋体",Font.PLAIN,15));
frame1.add(JT_4=new JTextField());
frame1.add(JB_ok=new JButton("OK"));
JB_ok.addActionListener(this);
frame1.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
frame1.setVisible(true);
}
//事件响应,规范输入的信息
public void actionPerformed(ActionEvent e){
if(JT_1.getText().equals("")&&JT_2.getText().equals("")&&JT_3.getText().equals("")&&JT_4.getText().equals("")) {
JOptionPane.showMessageDialog(this,
"您有未输入的项目,请将信息填完整。", "警告!!", JOptionPane.WARNING_MESSAGE);
}
else if(myequals(this)){
JOptionPane.showMessageDialog(this,
"您输入的账号已被人占用,请更换","警告!!",JOptionPane.WARNING_MESSAGE);
}
else if((JT_1.getText().charAt(0)=='1')){
JOptionPane.showMessageDialog(this,
"您输入的账号与格式不匹配,请阅读提示重新输入。","警告!!",JOptionPane.WARNING_MESSAGE);
}
else if(!(JT_3.getText().equals(JT_4.getText()))) {
JOptionPane.showMessageDialog(this,
"您两次输入的密码不匹配,请重新输入。","警告!!",JOptionPane.WARNING_MESSAGE);
}
else{
signin(this);
qing();
JOptionPane.showMessageDialog(this,
"您的账号注册成功","提示",JOptionPane.INFORMATION_MESSAGE);
}
}
//注册操作(单独分离出一个函数来写入数据库)高内聚,低耦合。
public void signin(SigninFrame x){
Connection conn;
String s="('"+x.JT_1.getText()+"','"+JT_2.getText()+"','"+JT_3.getText()+"','0')";
try{
Class.forName("com.mysql.jdbc.Driver"); //1.加载MySql驱动
String uri="jdbc:mysql://localhost:3306/bank?useSSL=false&serverTimezone=UTC"; //连接到数据库,包括主机名,数据库名
String user="root"; //用户名
String password="145467";//密码
conn = DriverManager.getConnection(uri,user,password); //2.连接数据库
Statement stat=conn.createStatement();
int i=stat.executeUpdate("insert into 用户 values"+s);
}catch(Exception e){
System.out.println("##异常1");
}
}
//判断账号是否重复
public boolean myequals(SigninFrame x){
Connection conn;
try{
Class.forName("com.mysql.jdbc.Driver"); //1.加载MySql驱动
String uri="jdbc:mysql://localhost:3306/bank?useSSL=false&serverTimezone=UTC"; //连接到数据库,包括主机名,数据库名
String user="root"; //用户名
String password="145467";//密码
conn = DriverManager.getConnection(uri,user,password); //2.连接数据库
Statement stat=conn.createStatement();
ResultSet re=stat.executeQuery("SELECT 账号 FROM 用户");
while(re.next()){
if(x.JT_1.getText().equals(re.getString(1))){
return true;
}
}
}catch(Exception e){
System.out.println("##异常2");
return true;
}
return false;
}
public void qing(){
JT_1.setText("");
JT_2.setText("");
JT_3.setText("");
JT_4.setText("");
}
}
3> RegisterFrame(登陆界面)
public void init() 初始化方法具体实现
public void actionPerformed(ActionEvent e)
事件响应
public boolean bi(RegisterFrame x)
登陆账号判定
第三部分源码
import com.sun.crypto.provider.PBEWithMD5AndDESCipher;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class RegisterFrame extends JFrame implements ActionListener{
JFrame frame2;
JButton JB_ok;
JLabel JL_1,JL_2;
JTextField JT_1,JT_2;
JTextArea JT_3;
ActionListener listener;
void set(){
String x=" 注意!\n 账号是1开头的为管理\n员账户,其余为普通用户账户\n 仅有一个管理员账户:\n 账户:101 密码:13";
JT_3.setFont(new Font("楷体",Font.PLAIN,15));
JT_3.setText(x);
}
//初始化
void init(){
frame2=new JFrame("登录");
frame2.setBounds(700,300,350, 350);
frame2.setLayout(null);
JT_1=new JTextField();
JT_2=new JTextField();
JT_3=new JTextArea();
JL_1=new JLabel("账号");
JL_2=new JLabel("密码");
JB_ok=new JButton("OK");
frame2.add(JL_1);
JL_1.setBounds(50,20,30,30);
frame2.add(JT_1);
JT_1.setBounds(100,20,150,25);
frame2.add(JL_2);
JL_2.setBounds(50,60,30,30);
frame2.add(JT_2);
JT_2.setBounds(100,60,150,25);
frame2.add(JB_ok);
JB_ok.setBounds(90,110,100,30);
frame2.add(JT_3);
JT_3.setBackground(Color.orange);
JT_3.setBounds(50,150,200,100);
JB_ok.addActionListener(this);
frame2.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
frame2.setVisible(true);
}
public RegisterFrame(){
init();
set();
}
public void actionPerformed(ActionEvent e){
if(bi(this)){
if(JT_1.getText().charAt(0)=='1'){
frame2.dispose();
JOptionPane.showMessageDialog(this,
"您的账号登录成功,已经进入管理员界面","提示",JOptionPane.INFORMATION_MESSAGE);
ManagerFrame a=new ManagerFrame();
}else{
frame2.dispose();
JOptionPane.showMessageDialog(this,
"您的账号登录成功,已经进入用户界面","提示",JOptionPane.INFORMATION_MESSAGE);
UserFrame b=new UserFrame(JT_1.getText());
}
}else{
JOptionPane.showMessageDialog(this,
"您输入的账户不存在或密码出错。", "警告!!", JOptionPane.WARNING_MESSAGE);
}
}
//账号登陆判定
public boolean bi(RegisterFrame x){
int ee=0;
Connection conn;
try{
Class.forName("com.mysql.jdbc.Driver"); //1.加载MySql驱动
String uri="jdbc:mysql://localhost:3306/bank?useSSL=false&serverTimezone=UTC"; //连接到数据库,包括主机名,数据库名
String user="root"; //用户名
String password="145467";//密码
conn = DriverManager.getConnection(uri,user,password); //2.连接数据库
Statement stat=conn.createStatement();
ResultSet re=stat.executeQuery("SELECT 账号,密码 FROM 用户");
while(re.next()){
if(x.JT_1.getText().equals(re.getString(1))&&x.JT_2.getText().equals(re.getString(2))){
return true;
}
}
}catch(Exception e){
System.out.println("##异常3");
}
return false;
}
}
4>ManagerFrame(登陆界面)
public ManagerFrame() 构造方法
public void init(d) 初始化方法具体实现
public void actionPerformed(ActionEvent e)
事件响应
public String cha(ManagerFrame x)
查询功能
第四部分源码
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class ManagerFrame extends JFrame implements ActionListener {
JFrame frame4;
JButton JB_cha;
JTextArea JT;
ActionListener listener;
public ManagerFrame(){
init();
}
void init(){
frame4=new JFrame("管理员:101");
frame4.setBounds(700,300,500,500);
frame4.setLayout(null);
JB_cha=new JButton("查询");
frame4.add(JB_cha);
JB_cha.setBounds(10,10,70,30);
JB_cha.addActionListener(this);
JT=new JTextArea();
frame4.add(JT);
JT.setBounds(10,50,400,350);
frame4.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
frame4.setVisible(true);
}
public void actionPerformed(ActionEvent e){
JT.setText(cha(this));
}
public String cha(ManagerFrame x) {
String s = "账号\t姓名\t密码\t余额\n";
Connection conn;
try {
Class.forName("com.mysql.jdbc.Driver"); //1.加载MySql驱动
String uri = "jdbc:mysql://localhost:3306/bank?useSSL=false&serverTimezone=UTC"; //连接到数据库,包括主机名,数据库名
String user = "root"; //用户名
String password = "145467";//密码
conn = DriverManager.getConnection(uri, user, password); //2.连接数据库
Statement stat = conn.createStatement();
ResultSet re = stat.executeQuery("SELECT 账号,姓名,密码,余额 FROM 用户");
while (re.next()) {
if(re.getString(2).equals("管理员")){
}else{
s += re.getString(1) + "\t";
s += re.getString(2) + "\t";
s += re.getString(3) + "\t";
s += re.getString(4) + "\t";
s += "\n";
}
}
return s;
} catch (Exception e) {
return "查询异常";
}
}
}
5>UserFrame(登陆界面)
public void init() 初始化方法具体实现
public void actionPerformed(ActionEvent e)
事件响应
public void cun(UserFrame x)
public void qu(UserFrame x)
public void cha(UserFrame x)
存、取、查
第五部分源码
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class UserFrame extends JFrame implements ActionListener{
String zhanghu;
JFrame frame3;
JButton JB_1,JB_2,JB_3,JB_4;
JTextField JT_1,JT_2,JT_41,JT_42,JT_3;
JLabel JL_1,JL_2;
ActionListener listener1,listener2,listener,listener4;
public UserFrame(String name){
zhanghu=name;
init(name);
}
public void init(String name){
frame3=new JFrame("用户:"+name);
frame3.setBounds(700,300,350, 350);
frame3.setLayout(null);
JB_1=new JButton("存钱");
frame3.add(JB_1);
JB_1.setBounds(20,20,80,20);
JB_1.addActionListener(this);
JT_1=new JTextField();
frame3.add(JT_1);
JT_1.setBounds(120,20,160,20);
JB_2=new JButton("取钱");
frame3.add(JB_2);
JB_2.setBounds(20,60,80,20);
JB_2.addActionListener(this);
JT_2=new JTextField();
frame3.add(JT_2);
JT_2.setBounds(120,60,160,20);
JB_3=new JButton("查询");
frame3.add(JB_3);
JB_3.setBounds(20,100,80,20);
JB_3.addActionListener(this);
JT_3=new JTextField();
frame3.add(JT_3);
JT_3.setBounds(120,100,160,20);
JB_4=new JButton("转账");
frame3.add(JB_4);
JB_4.setBounds(20,140,80,20);
JB_4.addActionListener(this);
JL_1=new JLabel("输入转给的账户:");
frame3.add(JL_1);
JL_1.setBounds(20,180,110,20);
JT_41=new JTextField();
frame3.add(JT_41);
JT_41.setBounds(120,180,120,20);
JL_1=new JLabel("输入转账金额:");
frame3.add(JL_1);
JL_1.setBounds(20,220,110,20);
JT_42=new JTextField();
frame3.add(JT_42);
JT_42.setBounds(120,220,120,20);
frame3.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
frame3.setVisible(true);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==JB_1){
if(JT_1.getText()==""){
JOptionPane.showMessageDialog(this,
"未输入存钱数目!","警告!!",JOptionPane.INFORMATION_MESSAGE);
}else if(JT_1.getText().equals("")){
JOptionPane.showMessageDialog(this,
"存储金额未填","警告!!",JOptionPane.INFORMATION_MESSAGE);
}
else if(JT_1.getText().charAt(0)=='-'){
JOptionPane.showMessageDialog(this,
"存储金额须为正整数","警告!!",JOptionPane.INFORMATION_MESSAGE);
}
else{
cun(this);//1代表存钱
JT_1.setText("");
}
}
else if(e.getSource()==JB_2){
if(JT_1.getText()==""){
JOptionPane.showMessageDialog(this,
"未输入取钱数目!","警告!!",JOptionPane.INFORMATION_MESSAGE);
}
else if(JT_1.getText().equals("")){
JOptionPane.showMessageDialog(this,
"取款金额未填","警告!!",JOptionPane.INFORMATION_MESSAGE);
}
else if(JT_1.getText().charAt(0)=='-'){
System.out.println("2");
JOptionPane.showMessageDialog(this,
"取款金额须为正整数","警告!!",JOptionPane.INFORMATION_MESSAGE);
}
else{
qu(this);//0代表取钱
JT_2.setText("");
}
}
else if(e.getSource()==JB_3){
cha(this);
}
else if(e.getSource()==JB_4){
if(JT_41.getText().equals("")||JT_42.getText().equals("")){
JOptionPane.showMessageDialog(this,
"请输入转给的账号和金额", "提示", JOptionPane.WARNING_MESSAGE);
}
else if(JT_41.getText().equals(zhanghu)){
JOptionPane.showMessageDialog(this,
"不可以给自己转账,我怀疑你想空手套白狼", "警告!", JOptionPane.WARNING_MESSAGE);
}/*else if(JT_42.getText().equals("^[0-9]+$")){
JOptionPane.showMessageDialog(this,
"转账金额请输入正整数", "警告!", JOptionPane.WARNING_MESSAGE);*/
else{
zhuan(this);
}
}
}
// 存 钱
public void cun(UserFrame x){
String xin,jiu="";
Connection conn;
try{
Class.forName("com.mysql.jdbc.Driver"); //1.加载MySql驱动
String uri="jdbc:mysql://localhost:3306/bank?useSSL=false&serverTimezone=UTC"; //连接到数据库,包括主机名,数据库名
String user="root"; //用户名
String password="145467";//密码
conn = DriverManager.getConnection(uri,user,password); //2.连接数据库
Statement stat=conn.createStatement();
Statement sta=conn.createStatement();
ResultSet re=stat.executeQuery("SELECT 账号,余额 FROM 用户");
while(re.next()){
if(re.getString(1).equals(x.zhanghu)){
jiu=re.getString(2);
}
}
xin=Integer.toString((Integer.parseInt(x.JT_1.getText())+Integer.parseInt(jiu)));
sta.executeUpdate("update 用户 set 余额=" + xin + " where 账号=" + "'" + x.zhanghu + "'");
JOptionPane.showMessageDialog(this,
"存款成功,余额为:"+xin+"元", "提示", JOptionPane.WARNING_MESSAGE);
}catch(Exception e){
JOptionPane.showMessageDialog(this,
"存储金额要为正整数","警告!!" , JOptionPane.WARNING_MESSAGE);
}
}
public void qu(UserFrame x){
String xin="",jiu="";
Connection conn;
try{
Class.forName("com.mysql.jdbc.Driver"); //1.加载MySql驱动
String uri="jdbc:mysql://localhost:3306/bank?useSSL=false&serverTimezone=UTC"; //连接到数据库,包括主机名,数据库名
String user="root"; //用户名
String password="145467";//密码
conn = DriverManager.getConnection(uri,user,password); //2.连接数据库
Statement stat=conn.createStatement();
ResultSet re=stat.executeQuery("SELECT 账号,余额 FROM 用户");
while(re.next()){
if(re.getString(1).equals(x.zhanghu)){
jiu=re.getString(2);
}
}
int i=Integer.parseInt(jiu)-Integer.parseInt(x.JT_2.getText());
if(i<0){
JOptionPane.showMessageDialog(this,
"余额不足!", "警告!!", JOptionPane.WARNING_MESSAGE);
}else if(i>=0){
xin = Integer.toString(i);
stat.execute("update 用户 set 余额=" + xin + " where 账号=" + "'" + x.zhanghu + "'");
JOptionPane.showMessageDialog(this,
"取款成功,余额为"+xin+"元", "提示", JOptionPane.WARNING_MESSAGE);
}
}catch(Exception e){
JOptionPane.showMessageDialog(this,
"取款金额要为正整数","警告!!" , JOptionPane.WARNING_MESSAGE);
}
}
public void cha(UserFrame x){
String jiu="";
Connection conn;
try{
Class.forName("com.mysql.jdbc.Driver"); //1.加载MySql驱动
String uri="jdbc:mysql://localhost:3306/bank?useSSL=false&serverTimezone=UTC"; //连接到数据库,包括主机名,数据库名
String user="root"; //用户名
String password="145467";//密码
conn = DriverManager.getConnection(uri,user,password); //2.连接数据库
Statement stat=conn.createStatement();
Statement sta=conn.createStatement();
ResultSet re=stat.executeQuery("SELECT 账号,余额 FROM 用户");
while(re.next()){
if(re.getString(1).equals(x.zhanghu)){
jiu=re.getString(2);
}
}
x.JT_3.setText(jiu+"元");
}catch (Exception e){
System.out.println("异常");
}
}
public void zhuan(UserFrame x){
String jiu="",xin="",xin1="",jiu1="";
Connection conn;
try{
Class.forName("com.mysql.jdbc.Driver"); //1.加载MySql驱动
String uri="jdbc:mysql://localhost:3306/bank?useSSL=false&serverTimezone=UTC"; //连接到数据库,包括主机名,数据库名
String user="root"; //用户名
String password="145467";//密码
conn = DriverManager.getConnection(uri,user,password); //2.连接数据库
Statement stat=conn.createStatement();
ResultSet re=stat.executeQuery("SELECT 账号,余额 FROM 用户");
while(re.next()){
if(re.getString(1).equals(x.zhanghu)){
jiu=re.getString(2);
}
if(re.getString(1).equals(x.JT_41.getText())){
jiu1=re.getString(2);
}
}
if(jiu1.equals("")){
JOptionPane.showMessageDialog(this,
"请输入正确的账号", "警告!!", JOptionPane.WARNING_MESSAGE);
}else{
int yu=Integer.parseInt(jiu)-Integer.parseInt(x.JT_42.getText());
int yu1=Integer.parseInt(jiu1)+Integer.parseInt(x.JT_42.getText());
if(yu<0){
JOptionPane.showMessageDialog(this,
"余额不足!","警告!!" , JOptionPane.WARNING_MESSAGE);
}else{
xin = Integer.toString(yu);
xin1= Integer.toString(yu1);
stat.execute("update 用户 set 余额=" + xin + " where 账号=" + "'" + x.zhanghu + "'");
stat.execute("update 用户 set 余额=" + xin1 + " where 账号=" + "'" + x.JT_41.getText()+ "'");
JOptionPane.showMessageDialog(this,
"转账成功,余额为:"+xin+"元","提示" , JOptionPane.WARNING_MESSAGE);
}
}
}catch (Exception e){
JOptionPane.showMessageDialog(this,
"转账金额要为正整数","警告!!" , JOptionPane.WARNING_MESSAGE);
}
}
}
这样一个ATM机系统就可。
后记
写完了之后,才觉得代码部分有很多可以优化的,很多能复用的代码,写了很多遍。但是我当时是完全想不到的,还是宏观意识不够,逻辑不是特别清楚,继续加油吧!
这个系统的配套源码和数据库表or文件,后续我会上传在CSDN上。有兴趣的同学可以看看,也希望大佬指正不足。
点个赞再走呗。