忘记刚刚改了嘛了,通过测试呢,找到两个bug: 通知貌似有时候会重复;聊天界面没有小红点

This commit is contained in:
my-style
2020-04-08 00:45:19 +08:00
parent 8d38b86f40
commit 3bb083ed13
8 changed files with 169 additions and 74 deletions
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -1,5 +1,5 @@
#\u4FEE\u6539\u914D\u7F6E\u6587\u4EF6
#Tue Apr 07 23:50:28 CST 2020
#Wed Apr 08 00:41:05 CST 2020
KeyName=/testKey_v3
loginUserName=466D1203678EFB16BE85C8A02E1486B6
ndnBlockChainIPAddress=116.77.74.139
@@ -7,6 +7,6 @@ ServerIPAddress=116.77.74.139
ThreadNumberForFileTransfer=5
ndnBlockChainPortAddress=9001
DataPackagePrefix=/ndn/edu/pkusz/OA
LoginStatus=false
LoginStatus=true
loginPassWord=A1B9652D9ED940B8FC63453C50CB3337
ServerPortAddress=6363
@@ -0,0 +1,25 @@
MIIEpAIBAAKCAQEA0vBF+wW8jIH+LMy+PYXQ24NBoEf5YIM1oX1YZwQ8S8PI8b/P
e98fmRNdLBFLXbiRQLealwgwxyvv2KRceQM5bKIS6UkPfcJwRIn+E3UBgB+7HBn9
bpQr0ZtkHnHtt2baxVHyI2sQgrGg26u2McdzagmzvcWlF82iT2MpUTpXU1f+fpZj
pKwcwAuuF77CM4k3YN63G7b9m8Kuo5/AsTSAUBZ9RfzHV9f/nWv/lh8SQ915EAPO
15F3kArz55T/zX8Fi+cqzbDcRCqauVEETVQuz9FYzTb92bqWG67Uz5199adrJvXL
VDXn9SzNAEUYgztwYSbtGYcZxQMyN508N4/kmwIDAQABAoIBAQC8ZtyqWzJP8R87
lldojefA2Fg6N27WM/sn1NOrl03fgewteFtyURRg3bm/TWcaO2qI+jR6J1eh3W1o
+0yYzTdx/sSTVq0ebxdlMDcd28jOTgkKDXCdXnxQx9DBnJJs19IYoZt65PqnMM3y
xkiB55n/INFIc4qEWydYbsINieVLStKfVc7KGM2Jtk237Em4DOd012bZnvfSqRhb
2vKotNqOHOvQDuC5JVgGIGXDMQQrLp2gSDZeBLaArQA3bddmbRd6vACDH8Y3EAL2
HyxOMaS384NolPl0S91J9Q/Qu6OeGpn/82t6412KQr/7P+FP/fX1KvqzBG8OEdpA
ysv0ZXHxAoGBAOt6kgCYvUMfuT6JrSpgjIflfy3/gRML1rFoV34k+lg8+njNutfe
XJT0XXqkROR8HAnYqNo9LomaA5wblxs7+IVtRf59oy2ENkNTPTpTZhNbhEQDQ9Zy
XHQ18z1Afekt+3BgJh24PI/+uxukvQWtm4yhUsHwxmQvOzw+76VuE1tJAoGBAOVS
OKho9CgdRbCMPrYObaQJp8KXItHgLM7bD4Q78QSmW2tyd+05+rJLo1A5fYjQFWaz
mfTi5vzt/y/bSjOas/92Uu01Jq4GSG8ca0YMrMkm7wht199Gj6DqlNcBcYMK2Nis
pJ6g/JUcCpnJ/PBBD8RjAcVqTA9veXS5bdM/ynzDAoGBANqn8yD4s2277HBkuVZL
VtLtyN22jm1YJeCQigXJYmlDHjXEm0XN5dwu2QqDtLERiZufApO8EhWV3No9SF/y
nP+Qi1kX4sjmJtj3VzhsrrE03qmk+n4LrUv/uMDcvM4kc4FS1rHsHNh86dNuclLu
dSzttAIAiMgIj5GOw0qy3uh5AoGANDTrwStjql4/p1nGTRwrydSI5LwTqUQn70/f
0HL1A+H7nhKJSvCQKlcd7v2nnqYAuUjaG+4sOBjWp8Z8thLaN6ZwaqBXFfdINkN6
CJCKJaE/eePH6YTe3fuJtwkVFog5pdpn/9UWq7uejjR16RxmwobnuFHizwDJ3dD5
N8amCpECgYASKJLCApJPcRmjhFTmVn36qQEZuZBbHSIrwt7s0HC8HUR77PmN0xk9
AxeJCqoVyM8jdUN8AjBWmlzo+PAGW6Dt86BZnEaYdtCQ6Zc/svPmmxqN5jJVyIft
w7J3Vt4w0i280wWIhj8gSTD2+5K6eYsEf2lbrf7xhQkZ/yG4bDb+Dg==
@@ -1,25 +0,0 @@
MIIEowIBAAKCAQEAii65kmHV3SpcX7rdwXziznKJBZb8ns8+RkDh9YOV47PPtFbr
Yi2W9nWRj/S1XGnPopNXJ3cxyVQvoKchenkjDLRBdJkVn8Emowf/xVh4q4roP08c
aZzfd5KV88Sd2+zRkiiwN+teNdYaY+qdpekOAICkbUkNhuzk/mfa++hZRXpfQR44
TrFiXea+Y6JRLWTwCm55SMKsLYekoIkH0CcVBcsTwcD7fb1ceklUzAGnVNesnd4d
8t7FkoWjYOjRDD+3IJs4JGz3ga1Vp6K5d2u/WdtANY2iUjTMY/S/hGLsiut7rswr
8HpuUY9Z8nWLdKt1vFxpXDoTUx0NCaVazMn4XwIDAQABAoIBAFtoh1efIpM4R30I
J1OsYnjA6YVqGNiRLZfZqd/4WLoVI4wfh3wdvmRw54a8ERD96d2Y7CluPt/4sbzr
ckkLQzVPNJGGBvj0E7P7QaXxXXnU3MesdJYksOrvbASihu6J3SR7h/6l0193r2Nz
OzAaWCna72pfzfP4V483cnP7grpjOXXfme7GxltI6I0sw16qCkg5COM2WfNYu0Gz
Z21ss0i3Tx5Kauzrht/GsvxoUz8G+Ufo0vCK9Qb/Cd+2+CzoBUpkB5JLClGq5G7Y
S/JFsTzlBMLmD0Deg72pOuURDQ7m7YAzv+F604mmWMj61mzM0AogZ2DiEDxxsazJ
8RSPs7ECgYEA36TAGc4/QGl4OoiJpt3Kzw5lixElX5qrZ0Yz5SEZMhyXX2gZ+zRM
HBJlp/vH5Sbs2qe7xvmr/B+W+pMqlLVAd7sJxGF7H9t83R1+XkN1a3vfW8h5V6c9
EC9cTfDB/JGecmkBSHRRNgvp0eGzUOQTF9COpPhxLL4k/HFvQWOxPicCgYEAniyx
Eut2zwG6bMpWCGkjie7IPAy8m0WEsbz0RNbjggBXGB4k9axv75yVEaWQ45Z84n2D
B4BpdsXtRD4m34gPhs8+DM5C0G9aqV0it0VEGvyQgvzrpwjSxyuGitMjK/UMpUU9
7HWSn8o+jSpb8ha+bPYnE9WJTA/9EM9p5JTRjwkCgYAJBciKQfvjSV4EXoXPKZuJ
BvepyKNNXBwWKorlb5RopSamPrjtnYqEh2l6gXnrEMr1d1boDCKYJV4d9dn97eIP
8ofOWHBzNJOxCAOVIfuWvoSgW1Ip6yFXidGbg18QJX/S9dGLbsXn/EsOoKBvXwQ2
Lb/TgAJw36r2VE08whzgeQKBgHOZpBx4vE8UK0SBKBljhda0DeFdSaaNSyp/N2Ls
Tj/fscdtmIN4cCKFpKjOATNj84ewRUgBQJLOmtZqOgzaKsbSxb2kLU6aY38uE0Yw
OFMkzRT+ddeQ6kMn+1+Qab8hjAlprpUXZH6l18th7uriVm/aArtLL9nIQaK8g97M
KM/JAoGBAKdQPJSEPTz6p1HIkLwbI6i5ZcrxnS/fPTlwZEi2I8Ka7pnelOfED5qd
nvlLBKqIYWQLqCWwqA3I6pgM4ES1X10fsVhoA2jHlRj1/DOyy6gWwLAPacZ5cCBa
RBn9bPLKA/86mO9GiT4UaTeTH1mi+JbS5RwAl556n0cV0o3aKYkX
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

@@ -244,6 +244,28 @@ public class LoginOverviewController {
return (long)-1;
}
public void delTempChild(File file){
if (file.isDirectory()) {
String[] children = file.list();//获取文件夹下所有子文件夹
// 递归删除目录中的子目录下
for (int i = 0; i < children.length; i++) {
delTempChild(new File(file, children[i]));
}
}
// 目录空了,进行文件删除
file.delete();
}
// 删除本地的ndn/pid和ndn/tpm两个文件夹
private void moveNdnKeyFile(){
String dirpath1="./ndn/pid";
String dirpath2="./ndn/tpm";
File f1 = new File(dirpath1);
File f2 = new File(dirpath2);
delTempChild(f1);
delTempChild(f2);
}
// 导入密钥
@FXML
private void importSafeBag(){
@@ -279,6 +301,9 @@ public class LoginOverviewController {
}else{
return ;
}
// 做一个清空本地密钥的动作
// moveNdnKeyFile();
// System.out.println("本地密钥文件已清空");
// 将所选文件导入密钥
String res= SecretKeyManageUtil.importSafeBag(file.getAbsolutePath());
if(res.equals("success")){
@@ -1,8 +1,12 @@
package cn.minoa.view.login;
import cn.minoa.MainApp;
import cn.minoa.dataRequestInterface.KeyManager;
import cn.minoa.dataRequestInterface.MinoaDataAPI;
import cn.minoa.dataRequestInterface.OrderInfo;
import cn.minoa.dataRequestInterface.ResponseData;
import cn.minoa.util.EncryptionUtil;
import cn.minoa.util.KeyStorageUtil;
import cn.minoa.util.StringByteLengthUtil;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
@@ -11,6 +15,13 @@ import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import net.named_data.jndn.security.KeyChain;
import net.named_data.jndn.security.pib.Pib;
import net.named_data.jndn.security.pib.PibImpl;
import net.named_data.jndn.security.tpm.Tpm;
import net.named_data.jndn.security.tpm.TpmBackEnd;
import net.named_data.jndn.security.v2.CertificateV2;
import net.named_data.jndn.util.Common;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -52,13 +63,56 @@ public class RegisterOverviewController {
@FXML
private void handleRegister() {
if (isRightContent()) {
// 先拿到用户名,并修改keyChainNameString
String username=nickname.getText().trim();
String keyChainNameString="/"+username;
// 请求数据
OrderInfo orderInfo = new OrderInfo();
ResponseData responseData = new ResponseData();
Long seqLong = mainApp.getNewDataReqId();
orderInfo.setSeq(seqLong);
orderInfo.setJsonString(getRegisterJson());
// 生成本地pid.db文件,获取公钥
String publicKey="";
try {
CertificateV2 certificateV2= KeyManager.INSTANCE.initKeyChain(keyChainNameString).getCertification(keyChainNameString);
publicKey = Common.base64Encode(certificateV2.wireEncode().getImmutableArray(), false);
System.out.println("本地密钥keyName"+keyChainNameString);
System.out.println("publicKey: "+publicKey);
} catch (Pib.Error | PibImpl.Error | Tpm.Error | TpmBackEnd.Error | CertificateV2.Error | KeyChain.Error error) {
error.printStackTrace();
// 弹窗报错
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("注册失败");
alert.setHeaderText("注册账号失败");
alert.setContentText("本地密钥生成失败:\n"+error.getMessage());
alert.showAndWait();
return ;
}
// 首先向区块链发送注册信息
String pubkey=publicKey;
// String pubkey = "Bv0CIgcvCAVsbGFhYQgDS0VZCAhyVwiW+kaX7QgMY2VydC1yZXF1ZXN0CAn9AAABcSP8KDIUCRgBAhkEAiVRABX9AU8wggFLMIIBAwYHKoZIzj0CATCB9wIBATAsBgcqhkjOPQEBAiEA/////wAAAAEAAAAAAAAAAAAAAAD///////////////8wWwQg/////wAAAAEAAAAAAAAAAAAAAAD///////////////wEIFrGNdiqOpPns+u9VXaYhrxlHQawzFOw9jvOPD4n0mBLAxUAxJ02CIbnBJNqZnjhE50mt4GffpAEQQRrF9Hy4SxCR/i85uVjpEDydwN9gS3rM6D0oTlF2JjClk/jQuL+Gn+bjufrSnwPnhYrzjNXazFezsu2QGg3v1H1AiEA/////wAAAAD//////////7zm+q2nF56E87nKwvxjJVECAQEDQgAEgCbgPaAk0RRziBAW/beuF5fBQdJdbZhtKrT+FRdXq6sqPxvhM3VQF+WrBehiA5TsKpLzwzNoE8kKt8gyevM4dxZHGwEDHBgHFggFbGxhYWEIA0tFWQgIclcIlvpGl+39AP0m/QD+DzIwMjAwMzI5VDAxNTEwMf0A/w8yMDIwMDQwOFQwMTUxMDAXSDBGAiEApxH8lJntSBM/NwV+laSdifH674+76xZnxVF4vKGaXXkCIQCj3OyzagvjqYrJmZ9f00PWVISXRyrIrKmwFbwzsk/hQw==";
String phonenumber=phoneNumber.getText().trim();
NDNBlockChainConnectClient ndnBlockChainConnectClient=new NDNBlockChainConnectClient();
String resString=ndnBlockChainConnectClient.registeNewUser(username,
phonenumber,pubkey);
if(resString.equals("true")){
System.out.println("用户【"+username+"】在区块链后台被成功注册");
}else{
System.out.println("区块链后台注册用户【"+username+"】失败: "+resString);
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("区块链注册失败");
alert.setHeaderText("区块链注册失败");
alert.setContentText("失败原因:\n"+resString);
alert.showAndWait();
return ;
}
// 获取注册时JSON
String registerJson=getRegisterJson(publicKey);
orderInfo.setJsonString(registerJson);
System.out.println("getRegisterJson: " + orderInfo.getJsonString());
// 向系统后台发送注册信息
mainApp.minoaDataAPI.executeOrder("/register", orderInfo);
responseData = mainApp.minoaDataAPI.dataCacheQueue.getResponseDataBySeq(seqLong);
JSONObject jsonObject = responseData.praseRequestData();
@@ -74,6 +128,9 @@ public class RegisterOverviewController {
if (codeInteger == 200) {
// 注册之后,使用getNews消耗掉新通知
makeNoticesBeRead();
// 将此时的keyChainName持久化到本地
MinoaDataAPI.keyChainNameString=keyChainNameString;
KeyStorageUtil.setKeyName(keyChainNameString);
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("注册成功");
@@ -86,7 +143,8 @@ public class RegisterOverviewController {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("注册失败");
alert.setHeaderText("注册失败");
alert.setContentText("请确保你输入的手机号在系统白名单中,且登录名/账户/昵称并没有被注册。");
alert.setContentText("请确保你输入的手机号在系统白名单中,且登录名/账户/昵称并没有被注册\n " +
"您可以将用户名适当复杂化,以保证其在系统中的唯一性。");
alert.showAndWait();
}
}
@@ -237,12 +295,14 @@ public class RegisterOverviewController {
}
// 获取注册请求字符串
private String getRegisterJson() {
private String getRegisterJson(String mPubKey) {
JSONObject jsonObject = new JSONObject();
String mPubKey = "Bv0CsQcuCAR3Z2gwCANLRVkICH9+4yjVUHZaCAxjZXJ0LXJlcXVlc3QICf0AAAFv\nEUSBehQJGAECGQQANu6AFf0BJjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBANbFutCAZqFjHEa16tYvy4lBgi9/zixKWQzE9I72vaG2Imym+6KR30qkAQOK\nh0uE5RD2YsGhRK99rde+JOqIfk2/sunhp4nctOS5f4DeuOty58ekrO+Co9ZFmNBI\nmyk5i/hakjBEd/vdD7b1VadDRep5mWs3rgCinZOUfVaZ4oKqSws7ZWMvOSlRMOOi\nVzj53P4poY109S6aWmi3xKw/D76vfJapjdOB9Dg7S3rz0Rve1F/ajHCXWLt4XU3k\nUCiBn3Qmt6UD/MyDBaaUCfOvHTN6yVPtN6aOtYJVBAWt/P1ahLYhWkSm6KvrwMt0\nRzy2lw/lPriT99REItc/0wK6XwkCAwEAARZGGwEBHBcHFQgEd2doMAgDS0VZCAh/\nfuMo1VB2Wv0A/Sb9AP4PMjAxOTEyMTdUMDAzMTQw/QD/DzIwMTkxMjI3VDAwMzEz\nORf9AQCM+8WROXfi8WD9DydfLuSUxV0v3KW/Gn422/puDrkwwi1R2ogsAUc2O8pp\npuMLjWrQOTgE6ZTg80uWoDSUjjk44aMjkL2SAfp62vHRbGFx7+dckHAtF+DS6NH7\nX2vojFHOg6fksOE1M7XqLHmEEctZrFVSnQO7nB3DfRg+BqzZC/iy+8YAvTIvqA1c\nNsKYkmNITB80aM1v2H7fKnV4ZJpZnW71G5vbaPUseeklalQ2vEuBgWdd/1PL/0Ml\nI52npzqoeKAEpLp+vBwGN5ryGtWKB12nNimpMfevQAn/9BVIg59lZ7DIlE0sWmgW\nnwDxIXKebdViOejHlKwNAykxRRWw";
// String mPubKey = "Bv0CsQcuCAR3Z2gwCANLRVkICH9+4yjVUHZaCAxjZXJ0LXJlcXVlc3QICf0AAAFv\nEUSBehQJGAECGQQANu6AFf0BJjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBANbFutCAZqFjHEa16tYvy4lBgi9/zixKWQzE9I72vaG2Imym+6KR30qkAQOK\nh0uE5RD2YsGhRK99rde+JOqIfk2/sunhp4nctOS5f4DeuOty58ekrO+Co9ZFmNBI\nmyk5i/hakjBEd/vdD7b1VadDRep5mWs3rgCinZOUfVaZ4oKqSws7ZWMvOSlRMOOi\nVzj53P4poY109S6aWmi3xKw/D76vfJapjdOB9Dg7S3rz0Rve1F/ajHCXWLt4XU3k\nUCiBn3Qmt6UD/MyDBaaUCfOvHTN6yVPtN6aOtYJVBAWt/P1ahLYhWkSm6KvrwMt0\nRzy2lw/lPriT99REItc/0wK6XwkCAwEAARZGGwEBHBcHFQgEd2doMAgDS0VZCAh/\nfuMo1VB2Wv0A/Sb9AP4PMjAxOTEyMTdUMDAzMTQw/QD/DzIwMTkxMjI3VDAwMzEz\nORf9AQCM+8WROXfi8WD9DydfLuSUxV0v3KW/Gn422/puDrkwwi1R2ogsAUc2O8pp\npuMLjWrQOTgE6ZTg80uWoDSUjjk44aMjkL2SAfp62vHRbGFx7+dckHAtF+DS6NH7\nX2vojFHOg6fksOE1M7XqLHmEEctZrFVSnQO7nB3DfRg+BqzZC/iy+8YAvTIvqA1c\nNsKYkmNITB80aM1v2H7fKnV4ZJpZnW71G5vbaPUseeklalQ2vEuBgWdd/1PL/0Ml\nI52npzqoeKAEpLp+vBwGN5ryGtWKB12nNimpMfevQAn/9BVIg59lZ7DIlE0sWmgW\nnwDxIXKebdViOejHlKwNAykxRRWw";
String commandString = "/register";
String userNameString = nickname.getText().trim();
String passWordString = passwordField1.getText().trim();
// 对密码进行加密
passWordString= EncryptionUtil.getMD5String(passWordString);
String phoneString = phoneNumber.getText().trim();
Integer levelInteger = 0;
try {
@@ -261,12 +321,22 @@ public class RegisterOverviewController {
// 验证输入内容格式
private boolean isRightContent() {
//验证昵称是否为空
if (nickname.getText().trim().equals("")) {
if (nickname.getText().trim().equals("")||nickname.getText().trim().contains("@")) {
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("账号错误");
alert.setHeaderText("你的账号错误");
alert.setContentText("请确保你输入的账号(昵称)不为空");
alert.setContentText("请确保你输入的账号(昵称)不为空,且昵称中不包含\"@\"字符");
alert.showAndWait();
return false;
}
//验证昵称是否为"default"
if (nickname.getText().trim().equals("default")) {
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("账号错误");
alert.setHeaderText("你的账号错误");
alert.setContentText("default为系统保留账号(昵称),请更换一个昵称。");
alert.showAndWait();
return false;
}
@@ -8,45 +8,45 @@
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="325.0" prefWidth="425.0" stylesheets="@Register.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cn.minoa.view.login.RegisterOverviewController">
<children>
<Button mnemonicParsing="false" opacity="0.0" text="避免聚焦" />
<AnchorPane fx:id="upSplite" opacity="0.45" prefHeight="80.0" prefWidth="200.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<ImageView fx:id="miniLogo" fitHeight="35.0" fitWidth="35.0" layoutX="-50.0" layoutY="-47.0" pickOnBounds="true" preserveRatio="true" AnchorPane.leftAnchor="2.0" AnchorPane.topAnchor="2.0" />
<Label layoutX="37.0" layoutY="12.0" prefHeight="35.0" text="minoa" AnchorPane.leftAnchor="40.0" AnchorPane.topAnchor="2.0">
<font>
<Font name="Arial Black" size="12.0" />
</font></Label>
</children>
</AnchorPane>
<GridPane layoutX="152.0" layoutY="110.0" AnchorPane.bottomAnchor="80.0" AnchorPane.leftAnchor="100.0" AnchorPane.rightAnchor="100.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="108.0" minWidth="10.0" prefWidth="57.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="172.0" minWidth="10.0" prefWidth="168.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<TextField fx:id="nickname" GridPane.columnIndex="1" />
<PasswordField fx:id="passwordField1" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<Label text="账号" />
<Label text="密码" GridPane.rowIndex="1" />
<Label text="确认密码" GridPane.rowIndex="2" />
<Label text="手机号" GridPane.rowIndex="3" />
<Label text="验证码" GridPane.rowIndex="4" />
<PasswordField fx:id="passwordField2" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<TextField fx:id="phoneNumber" GridPane.columnIndex="1" GridPane.rowIndex="3" />
<TextField fx:id="verifyCode" prefHeight="23.0" prefWidth="134.0" GridPane.columnIndex="1" GridPane.rowIndex="4" />
</children>
</GridPane>
<Button layoutX="112.0" layoutY="263.0" mnemonicParsing="false" onAction="#handleRegister" prefHeight="35.0" prefWidth="225.0" text="注册" AnchorPane.bottomAnchor="27.0" AnchorPane.leftAnchor="100.0" AnchorPane.rightAnchor="100.0" />
<Text layoutX="332.0" layoutY="207.0" strokeType="OUTSIDE" strokeWidth="0.0" text="发送" AnchorPane.bottomAnchor="115.0" AnchorPane.rightAnchor="70.0" />
<Button fx:id="sendVerificationCodeButton" mnemonicParsing="false" opacity="0.3" AnchorPane.bottomAnchor="111.0" AnchorPane.rightAnchor="65.0" />
</children>
<children>
<Button mnemonicParsing="false" opacity="0.0" text="避免聚焦" />
<AnchorPane fx:id="upSplite" opacity="0.45" prefHeight="80.0" prefWidth="200.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<ImageView fx:id="miniLogo" fitHeight="35.0" fitWidth="35.0" layoutX="-50.0" layoutY="-47.0" pickOnBounds="true" preserveRatio="true" AnchorPane.leftAnchor="2.0" AnchorPane.topAnchor="2.0" />
<Label layoutX="37.0" layoutY="12.0" prefHeight="35.0" text="文件管理系统" AnchorPane.leftAnchor="40.0" AnchorPane.topAnchor="2.0">
<font>
<Font name="Arial Black" size="12.0" />
</font></Label>
</children>
</AnchorPane>
<GridPane layoutX="152.0" layoutY="110.0" AnchorPane.bottomAnchor="60.0" AnchorPane.leftAnchor="100.0" AnchorPane.rightAnchor="100.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="108.0" minWidth="10.0" prefWidth="57.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="172.0" minWidth="10.0" prefWidth="168.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<TextField fx:id="nickname" GridPane.columnIndex="1" />
<PasswordField fx:id="passwordField1" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<Label text="账号" />
<Label text="密码" GridPane.rowIndex="1" />
<Label text="确认密码" GridPane.rowIndex="2" />
<Label text="手机号" GridPane.rowIndex="3" />
<Label opacity="0.0" text="验证码" GridPane.rowIndex="4" />
<PasswordField fx:id="passwordField2" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<TextField fx:id="phoneNumber" GridPane.columnIndex="1" GridPane.rowIndex="3" />
<TextField fx:id="verifyCode" opacity="0.0" prefHeight="23.0" prefWidth="134.0" GridPane.columnIndex="1" GridPane.rowIndex="4" />
</children>
</GridPane>
<Button layoutX="112.0" layoutY="263.0" mnemonicParsing="false" onAction="#handleRegister" prefHeight="35.0" prefWidth="225.0" text="注册" AnchorPane.bottomAnchor="27.0" AnchorPane.leftAnchor="100.0" AnchorPane.rightAnchor="100.0" />
<Text layoutX="332.0" layoutY="207.0" opacity="0.0" strokeType="OUTSIDE" strokeWidth="0.0" text="发送" AnchorPane.bottomAnchor="115.0" AnchorPane.rightAnchor="70.0" />
<Button fx:id="sendVerificationCodeButton" mnemonicParsing="false" opacity="0.0" AnchorPane.bottomAnchor="111.0" AnchorPane.rightAnchor="65.0" />
</children>
</AnchorPane>