M@w`$ogR3VC%bz8lY|YpAYlcc4LZQ(1RUqN1HcVhC)*q$D?7yn3E*-U0E_Dv>;M
z8X`B`?`ehWc&=TjsHj_YHACj=-Ar6Iwsk@eEc|@TeL8s--sK#Ux
z^h#4Lx!nV>)JzYuv^#!BXI|dl4VO^=(#QIMc$v0!q+UmFZk%5N*|odCF7$MF?OQwk
zQ?k$FgU68yNzRaWBqC8-+d=%?xsms8-OGx-3`{mUTXa=yw|c@qGfH@)
zFt&oVBG5Ti%Dn)m5g$L>-mP_T39g~oZHJvNZe|Tpd)X(3GHZz5sk)G1ogXPQcM~td
cnO4~vb=;|cnBf0+ga7}Y{~v9EqkHuK1*m1)aR2}S
literal 0
HcmV?d00001
--
Gitee
From 6b9ea7c5ab5e1e7349829f125a2136d485473641 Mon Sep 17 00:00:00 2001
From: 50582 <505822174@qq.com>
Date: Wed, 4 Dec 2019 18:52:47 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E2=91=A0=E9=87=8D=E6=96=B0=E6=8E=92?=
=?UTF-8?q?=E7=89=88=E4=BA=86=E5=AF=86=E7=A0=81=E9=94=99=E8=AF=AF=E9=A1=B5?=
=?UTF-8?q?=E9=9D=A2=20=E2=91=A1=E6=B3=A8=E5=86=8C=E8=B4=A6=E6=88=B7?=
=?UTF-8?q?=E4=BB=A5=E5=8F=8A=E5=AF=86=E7=A0=81=E9=A1=B5=E9=9D=A2=E5=86=99?=
=?UTF-8?q?=E5=AE=8C=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=BB=A5=E4=B8=8B?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=20=20=20=201=EF=BC=9A=E6=A3=80?=
=?UTF-8?q?=E6=9F=A5=E6=98=AF=E5=90=A6=E6=9C=89=E5=B7=B2=E5=AD=98=E5=9C=A8?=
=?UTF-8?q?=E7=9A=84=E8=B4=A6=E6=88=B7=20=20=20=202=EF=BC=9A=E6=A3=80?=
=?UTF-8?q?=E6=9F=A5=E6=98=AF=E5=90=A6=E6=9C=89=E5=B7=B2=E5=AD=98=E5=9C=A8?=
=?UTF-8?q?=E7=9A=84=E9=82=AE=E7=AE=B1=20=20=20=203=EF=BC=9A=E7=82=B9?=
=?UTF-8?q?=E5=87=BB=E8=B6=85=E8=BF=9E=E6=8E=A5=EF=BC=8C=E5=8F=AF=E8=BF=94?=
=?UTF-8?q?=E5=9B=9E=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2=E3=80=81=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA=E9=9A=90=E7=A7=81=E6=9D=A1=E4=BE=8B=E7=BD=91=E9=A1=B5?=
=?UTF-8?q?=E3=80=81=E6=98=BE=E7=A4=BA=E6=9C=8D=E5=8A=A1=E6=9D=A1=E6=AC=BE?=
=?UTF-8?q?=E7=BD=91=E9=A1=B5=20=E2=91=A2=E6=96=B0=E5=A2=9E=E2=80=9C?=
=?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=88=90=E5=8A=9F=E2=80=9D=E9=A1=B5=E9=9D=A2?=
=?UTF-8?q?=EF=BC=8C=E6=8F=90=E9=86=92=E7=94=A8=E6=88=B7=E6=B3=A8=E5=86=8C?=
=?UTF-8?q?=E8=B4=A6=E5=8F=B7=E6=88=90=E5=8A=9F=EF=BC=8C=E5=B9=B6=E6=8F=90?=
=?UTF-8?q?=E4=BE=9B=E6=8C=89=E9=92=AE=E8=BF=94=E5=9B=9E=E7=99=BB=E5=BD=95?=
=?UTF-8?q?=E9=A1=B5=E9=9D=A2=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/fxml/CreateAccount.fxml | 84 ++++--
src/fxml/CreateSuccessfully.fxml | 52 ++++
src/fxml/WrongPassword.fxml | 81 +++---
src/imgzip/CreateAccount.java | 38 ++-
src/imgzip/CreateAccountController.java | 281 ++++++++++++++++++-
src/imgzip/CreateSuccessfullyController.java | 39 +++
src/imgzip/DataBaseController.java | 22 ++
src/imgzip/Login.java | 64 ++++-
src/imgzip/LoginController.java | 14 +-
src/imgzip/WrongPassword.java | 2 +-
src/imgzip/WrongPasswordController.java | 5 +-
src/res/icon/sad face.jpg | Bin 13580 -> 14688 bytes
src/txtFile/RememberAccount&Password.txt | 2 +-
13 files changed, 603 insertions(+), 81 deletions(-)
create mode 100644 src/fxml/CreateSuccessfully.fxml
create mode 100644 src/imgzip/CreateSuccessfullyController.java
diff --git a/src/fxml/CreateAccount.fxml b/src/fxml/CreateAccount.fxml
index e611333..d700dd5 100644
--- a/src/fxml/CreateAccount.fxml
+++ b/src/fxml/CreateAccount.fxml
@@ -1,6 +1,7 @@
+
@@ -9,7 +10,7 @@
-
+
@@ -36,61 +37,96 @@
-
+
-
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
+
+
+
-
+
+
+
+
+
+
-
+
-
+
+
+
+
-
+
-
-
+
-
+
@@ -100,7 +136,7 @@
-
+
diff --git a/src/fxml/CreateSuccessfully.fxml b/src/fxml/CreateSuccessfully.fxml
new file mode 100644
index 0000000..ee7696f
--- /dev/null
+++ b/src/fxml/CreateSuccessfully.fxml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/fxml/WrongPassword.fxml b/src/fxml/WrongPassword.fxml
index 25349ac..52e84ab 100644
--- a/src/fxml/WrongPassword.fxml
+++ b/src/fxml/WrongPassword.fxml
@@ -9,9 +9,9 @@
-
+
-
+
@@ -28,47 +28,37 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
@@ -76,6 +66,9 @@
+
+
+
@@ -84,14 +77,14 @@
-
+
-
+
-
+
diff --git a/src/imgzip/CreateAccount.java b/src/imgzip/CreateAccount.java
index cbb8493..fc8a0df 100644
--- a/src/imgzip/CreateAccount.java
+++ b/src/imgzip/CreateAccount.java
@@ -3,16 +3,29 @@ package imgzip;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
+import javafx.scene.control.Button;
import javafx.stage.Stage;
+
+import javafx.scene.control.Label;
+
/**
@Author: 肖尧
- @Date: 2019.11.24
+ @Date: 2019.12.4
*/
public class CreateAccount {
public CreateAccount(){
try {
-
Parent root = FXMLLoader.load(getClass().getResource("/fxml/CreateAccount.fxml"));
+
+ Label already = (Label)root.lookup("#Al");
+ already.setVisible(false);
+
+ Label already2 = (Label)root.lookup("#Al2");
+ already2.setVisible(false);
+
+ Button createAccount = (Button)root.lookup("#createAccount");
+ createAccount.setDisable(true);
+
Stage primaryStage = new Stage();
primaryStage.setTitle("Create an Account");
primaryStage.setScene(new Scene(root, 600.0000999999975, 633));
@@ -25,3 +38,24 @@ public class CreateAccount {
}
}
+class CreateSuccessfully{
+
+ public CreateSuccessfully(){
+
+ try {
+ Parent root = FXMLLoader.load(getClass().getResource("/fxml/CreateSuccessfully.fxml"));
+
+ Stage primaryStage = new Stage();
+ primaryStage.setTitle("Create an Account Successfully!");
+ primaryStage.setScene(new Scene(root, 638, 406));
+ primaryStage.show();
+
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+
+
+ }
+
+}
+
diff --git a/src/imgzip/CreateAccountController.java b/src/imgzip/CreateAccountController.java
index ad6eae4..6a2c88b 100644
--- a/src/imgzip/CreateAccountController.java
+++ b/src/imgzip/CreateAccountController.java
@@ -1,7 +1,286 @@
package imgzip;
+import javafx.application.Platform;
+import javafx.fxml.FXML;
+import javafx.scene.control.*;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.control.TextField;
+import javafx.scene.control.Alert;
+import javafx.scene.web.WebEngine;
+import javafx.scene.web.WebView;
+import javafx.stage.Stage;
+
+import java.awt.*;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
/**
@Author: 肖尧
- @Date: 2019.11.24
+ @Date: 2019.12.4
*/
public class CreateAccountController {
+
+ @FXML
+ private TextField userName;
+
+ @FXML
+ private TextField passWord;
+
+ @FXML
+ private TextField email;
+
+ @FXML
+ private TextField telephone;
+
+ @FXML
+ private CheckBox agree;
+
+ @FXML
+ private Button createAccount;
+
+ @FXML
+ private Hyperlink privacy;
+
+ @FXML
+ private Label already;
+
+ @FXML
+ private Label already2;
+
+ @FXML
+ private Hyperlink signIn;
+
+
+ /**
+ * SignIn点击后,返回登录页面并关闭注册页面
+ */
+ public void backToLogin() {
+ Stage stage = (Stage) signIn.getScene().getWindow();
+ new Loginbeginner();
+ stage.close();
+
+ }
+
+ /**
+ * 检查账号是否存在,如果存在则无法点击注册按钮,且会提醒用户。
+ */
+ boolean judgeAccountExists = false;
+ public void checkAccountExistence() {
+ DataBaseController createAccountInstruction = new DataBaseController();
+ ResultSet rs = null;
+ ResultSet rs2 = null;
+
+ try {
+ /**
+ 第一步,检查数据库中是否有该账号存在
+ */
+ String currentInstruction = "SELECT pwd FROM login WHERE userName=" + "'" + userName.getText().trim() + "'";
+ rs = createAccountInstruction.queryExcecute(currentInstruction);
+
+ /**
+ * 第二步:
+ * ①如果账号为空,则无法点击注册按钮。
+ * ②如果账号存在,无法点击。
+ * ③如果账号不存在,邮箱存在,无法点击。
+ * ④如果账号邮箱都不存在,但是未同意服务条款,无法点击。
+ * ⑤如果账号邮箱都不存在,且同意了服务条款,才可被点击。
+ */
+
+ if("".equals(userName.getText())){
+ createAccount.setDisable(true);
+
+ }else {
+ if (rs.next()) {
+ judgeAccountExists = true;
+ already.setVisible(true);
+
+ if(!createAccount.isDisable()){
+ createAccount.setDisable(true);
+
+ }
+ }else{
+ judgeAccountExists = false;
+ already.setVisible(false);
+
+ if(!judgeEmialexist && agree.isSelected()){
+ createAccount.setDisable(false);
+
+ }
+
+ }
+
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ createAccountInstruction.close();
+ }
+
+ }
+
+ /**
+ * 检查邮箱是否存在,如果存在则无法点击注册按钮,且会提醒用户。
+ */
+
+ boolean judgeEmialexist = false;
+ public void checkEmailExistence() {
+
+ DataBaseController createAccountInstruction = new DataBaseController();
+ ResultSet rs = null;
+ ResultSet rs2 = null;
+
+ try {
+ String currentInstruction2 = "SELECT pwd FROM login WHERE email=" + "'" + email.getText().trim() + "'";
+ rs2 = createAccountInstruction.queryExcecute(currentInstruction2);
+
+ /**
+ * 第二步:
+ * ①如果账号为空,则无法点击注册按钮。
+ * ②如果账号存在,无法点击。
+ * ③如果账号不存在,邮箱存在,无法点击。
+ * ④如果账号邮箱都不存在,但是未同意服务条款,无法点击。
+ * ⑤如果账号邮箱都不存在,且同意了服务条款,才可被点击。
+ */
+
+ if ("".equals(email.getText())){
+ createAccount.setDisable(true);
+
+ }else {
+ if (rs2.next()) {
+ judgeEmialexist = true;
+ already2.setVisible(true);
+
+ if(!createAccount.isDisable()){
+ createAccount.setDisable(true);
+
+ }
+ }else{
+ judgeEmialexist = false;
+ already2.setVisible(false);
+
+ if(!judgeAccountExists && agree.isSelected()){
+ createAccount.setDisable(false);
+
+ }
+
+ }
+
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+
+ } finally {
+ createAccountInstruction.close();
+
+ }
+
+ }
+
+ /**
+ * CreateAccount点击后,将账号插入数据库中
+ */
+ public void createAccount() {
+ DataBaseController createAccountInstruction = new DataBaseController();
+ ResultSet rs = null;
+
+ try {
+ /**
+ 向数据库中插入数据
+ */
+ String currentInstruction = "INSERT INTO login (userName,pwd,email,tel) values(" + "'"+userName.getText().trim()+ "'" + "," + "'"+ passWord.getText().trim()+ "'" + "," + "'"+ email.getText().trim() + "'"+ "," + "'"+telephone.getText().trim()+ "'"+")" ;
+ createAccountInstruction.queryUpdate(currentInstruction);
+
+ /**
+ 检查数据库中是否成功插入数据
+ */
+ String currentInstruction2 = "SELECT pwd FROM login WHERE userName=" + "'" + userName.getText().trim() + "'";
+ rs = createAccountInstruction.queryExcecute(currentInstruction2);
+
+ if(rs.next()){
+ Stage stage = (Stage) signIn.getScene().getWindow();
+ new CreateSuccessfully();
+ stage.close();
+
+ }else{
+ Alert alert = new Alert(Alert.AlertType.ERROR);
+ alert.setTitle("SORRY!");
+ alert.setHeaderText("Something's wrong!");
+ alert.setContentText("The Account is not created");
+ alert.showAndWait();
+
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("456");
+
+ } finally {
+ createAccountInstruction.close();
+
+ }
+
+ }
+
+ /**
+ * 检查是否点击了同意privacy协议,如果不同意,则无法点击 createaccount 按钮。
+ */
+ public void checkIfSelectedPrivacy(){
+ if(!judgeAccountExists && !judgeEmialexist && createAccount.isDisable()){
+ createAccount.setDisable(false);
+
+ }
+
+ boolean userNmae = "".equals(userName.getText());
+ boolean emial = "".equals(email.getText());
+
+ if(!agree.isSelected() || userNmae || emial ){
+ createAccount.setDisable(true);
+
+ }
+ }
+
+ /**
+ * 点击Privacy 的 hyperlink后,跳出网页进入隐私条例说明。
+ */
+ public void openPrivacy(){
+
+ try{
+ try {
+ Desktop.getDesktop().browse(new URI("https://www.epicgames.com/site/en-US/privacypolicy?lang=en-US&sessionInvalidated=true"));
+
+ }catch (IOException e){
+ System.out.println("123");
+
+ }
+ }catch (URISyntaxException e){
+ System.out.println("456");
+
+ }
+ }
+
+
+ /**
+ * 点击Service 的 hyperlink后,跳出网页进入服务说明。
+ */
+ public void openService(){
+
+ try{
+ try {
+ Desktop.getDesktop().browse(new URI("https://www.epicgames.com/site/en-US/tos?lang=en-US"));
+
+ }catch (IOException e){
+ System.out.println("123");
+
+ }
+ }catch (URISyntaxException e){
+ System.out.println("456");
+
+ }
+ }
+
}
+
+
diff --git a/src/imgzip/CreateSuccessfullyController.java b/src/imgzip/CreateSuccessfullyController.java
new file mode 100644
index 0000000..2e59f53
--- /dev/null
+++ b/src/imgzip/CreateSuccessfullyController.java
@@ -0,0 +1,39 @@
+package imgzip;
+
+import javafx.fxml.FXML;
+import javafx.scene.control.Button;
+import javafx.stage.Stage;
+/**
+ @Author: 肖尧
+ @Date: 2019.11.24
+ */
+
+public class CreateSuccessfullyController{
+ @FXML
+ private Button signUp;
+
+ @FXML
+ private Button signIn;
+
+
+ /**
+ * 点击后sign up 后回到登录页面。
+ */
+ public void backToLogin() {
+ Stage stage = (Stage) signUp.getScene().getWindow();
+ new Loginbeginner();
+ stage.close();
+
+ }
+
+
+ /**
+ * 点击后sign in again 后继续注册。
+ */
+ public void backToSignIn() {
+ Stage stage = (Stage) signIn.getScene().getWindow();
+ new CreateAccount();
+ stage.close();
+
+ }
+}
diff --git a/src/imgzip/DataBaseController.java b/src/imgzip/DataBaseController.java
index 7e68673..2779ab3 100644
--- a/src/imgzip/DataBaseController.java
+++ b/src/imgzip/DataBaseController.java
@@ -48,6 +48,7 @@ public class DataBaseController {
ex.printStackTrace();
}
+
}
@@ -68,7 +69,28 @@ public class DataBaseController {
ex.printStackTrace();
}
+
return rs;
}
+
+ public void queryUpdate(String sql){
+ try {
+
+ Class.forName(driver);
+
+ ct = DriverManager.getConnection(url,user,password);
+
+ ps = ct.prepareStatement(sql);
+
+ ps.executeUpdate();
+
+ }catch (Exception ex){
+ ex.printStackTrace();
+
+ }
+
+ }
+
+
}
diff --git a/src/imgzip/Login.java b/src/imgzip/Login.java
index 1610704..9f92445 100644
--- a/src/imgzip/Login.java
+++ b/src/imgzip/Login.java
@@ -23,7 +23,7 @@ import java.io.FileWriter;
/**
@Author: 肖尧
- @Date: 2019.11.24
+ @Date: 2019.12.4
*/
public class Login extends Application {
@@ -92,3 +92,65 @@ public class Login extends Application {
}
}
+
+
+class Loginbeginner{
+ public Loginbeginner(){
+ try {
+ Stage primaryStage = new Stage();
+ Parent root = FXMLLoader.load(getClass().getResource("/fxml/Login.fxml"));
+
+ TextField account = (TextField)root.lookup("#Account");
+ PasswordField password = (PasswordField)root.lookup("#password");
+ CheckBox remember = (CheckBox)root.lookup("#remember");
+ Button logIn = (Button)root.lookup("#Login");
+
+
+ /**
+ 在页面开启之前检查上一次登录时是否记住了密码,
+ 如果上一次登录点击了记住密码,则在本次打开时会将账号和密码写入
+ */
+ try {
+
+ FileReader fr = new FileReader("src/txtFile/RememberAccount&Password.txt");
+ BufferedReader br = new BufferedReader(fr);
+
+ String line = "";
+ line = br.readLine();
+
+
+ String[] judge = line.split("\\|");
+ String truejudge = "true";
+ int accountIndex = 0;
+ int passwordIndex = 1;
+ int judgeIndex = 2;
+
+ if(judge[judgeIndex].equals(truejudge) ){
+ account.setText(judge[accountIndex]);
+ password.appendText(judge[passwordIndex]);
+
+ remember.setSelected(true);
+ logIn.setDisable(false);
+
+ }
+
+ br.close();
+ fr.close();
+
+ }catch (Exception e){
+ e.printStackTrace();
+
+ }
+
+ primaryStage.setTitle("XXX login");
+ primaryStage.setScene(new Scene(root, 638, 400));
+ primaryStage.show();
+
+ }catch (Exception e){
+ e.printStackTrace();
+
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/imgzip/LoginController.java b/src/imgzip/LoginController.java
index e6d8d30..6c47f3d 100644
--- a/src/imgzip/LoginController.java
+++ b/src/imgzip/LoginController.java
@@ -97,7 +97,6 @@ public class LoginController {
DataBaseController loginInstruction = new DataBaseController();
ResultSet rs = null;
-
try{
String currentInstruction = "SELECT pwd FROM login WHERE userName=" + "'" + account.getText().trim()+ "'";
@@ -114,10 +113,14 @@ public class LoginController {
}else{
new WrongPassword();
+ Stage stage = (Stage)createAccount.getScene().getWindow();
+ stage.close();
}
}else {
new WrongPassword();
+ Stage stage = (Stage)createAccount.getScene().getWindow();
+ stage.close();
}
@@ -127,10 +130,6 @@ public class LoginController {
}finally {
loginInstruction.close();
}
-
-
-
-
}
@@ -143,6 +142,8 @@ public class LoginController {
stage.close();
}
+
+
/**
设置记住账号密码按钮的方法。
*/
@@ -157,7 +158,6 @@ public class LoginController {
judgeIfclick = "false";
}
-
try {
FileWriter fw = new FileWriter("src/txtFile/RememberAccount&Password.txt");
BufferedWriter fis = new BufferedWriter(fw);
@@ -179,6 +179,8 @@ public class LoginController {
*/
public void createAccount(){
new CreateAccount();
+ Stage stage = (Stage)createAccount.getScene().getWindow();
+ stage.close();
}
diff --git a/src/imgzip/WrongPassword.java b/src/imgzip/WrongPassword.java
index 52b15e8..39416f3 100644
--- a/src/imgzip/WrongPassword.java
+++ b/src/imgzip/WrongPassword.java
@@ -19,7 +19,7 @@ public class WrongPassword {
Parent root = FXMLLoader.load(getClass().getResource("/fxml/WrongPassword.fxml"));
Stage primaryStage = new Stage();
primaryStage.setTitle("Password is wrong!");
- primaryStage.setScene(new Scene(root, 638.0, 385));
+ primaryStage.setScene(new Scene(root, 638.0, 400));
primaryStage.show();
}catch (Exception e){
diff --git a/src/imgzip/WrongPasswordController.java b/src/imgzip/WrongPasswordController.java
index a72c3e2..b1793a3 100644
--- a/src/imgzip/WrongPasswordController.java
+++ b/src/imgzip/WrongPasswordController.java
@@ -3,6 +3,7 @@ import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.stage.Stage;
+import sun.rmi.runtime.Log;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -31,7 +32,8 @@ public class WrongPasswordController {
public void createAccount(){
new CreateAccount();
- back();
+ Stage stage = (Stage)back.getScene().getWindow();
+ stage.close();
}
@@ -52,6 +54,7 @@ public class WrongPasswordController {
Stage stage = (Stage)back.getScene().getWindow();
stage.close();
+ new Loginbeginner();
}
diff --git a/src/res/icon/sad face.jpg b/src/res/icon/sad face.jpg
index b9d85dbf6b73b912c30baf7da2c8b00dba7adfc8..41a788914fa33a772477f82cd6b29a5cbc1d2850 100644
GIT binary patch
literal 14688
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