├── FaceReco.iml ├── README.md ├── pom.xml └── src ├── META-INF └── MANIFEST.MF └── main └── java └── cn └── cyan ├── facedao ├── FacebaiduDeal.java ├── FacebaiduMain.java ├── FacebaiduRegister.java └── FacebaiduTest.java ├── util ├── BaiduApiUtil │ └── DeleteUserGroup.java ├── Base64Util.java ├── DB.java ├── FileUtil.java ├── GsonUtils.java ├── HttpUtil.java └── OpertareDBSets │ ├── OperateDB.java │ ├── OperateDB2.java │ ├── OperateDB3.java │ ├── OperateDB4.java │ ├── OperateDB5.java │ └── OperateDB6.java └── view ├── AdminBasicInfoPage.java ├── AdminDataManipulationPage.java ├── AdminPage.java ├── AttendanceCheckingDataPage.java ├── AttendanceCheckingPage.java ├── BasicInfoPage.java ├── FaceUploadingPage.java ├── InitializingPage.java ├── LoginPage.java ├── PasswordChangingPage.java ├── StudentPage.java ├── StudentRegister.java ├── TeacherBasicInfoPage.java └── TeacherPage.java /FaceReco.iml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FaceRecognition_JavaSwing 2 | 大二下Java期末大作业 Java Swing写的人脸识别考勤系统windows桌面程序,用的百度V3人脸识别API 3 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | FaceRecoGroup 8 | FaceReco 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 1.8 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | org.apache.maven.plugins 21 | maven-compiler-plugin 22 | 23 | 7 24 | 7 25 | 26 | 27 | 28 | 29 | 30 | maven-clean-plugin 31 | 3.1.0 32 | 33 | 34 | 35 | maven-resources-plugin 36 | 3.0.2 37 | 38 | 39 | maven-compiler-plugin 40 | 3.8.0 41 | 42 | 43 | maven-surefire-plugin 44 | 2.22.1 45 | 46 | 47 | maven-jar-plugin 48 | 3.0.2 49 | 50 | 51 | maven-install-plugin 52 | 2.5.2 53 | 54 | 55 | maven-deploy-plugin 56 | 2.8.2 57 | 58 | 59 | 60 | maven-site-plugin 61 | 3.7.1 62 | 63 | 64 | maven-project-info-reports-plugin 65 | 3.0.0 66 | 67 | 68 | 69 | 70 | 71 | 72 | org.apache.maven.plugins 73 | maven-compiler-plugin 74 | 75 | 7 76 | 7 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | com.baidu.aip 87 | java-sdk 88 | 4.11.0 89 | 90 | 91 | com.nativelibs4java 92 | bridj 93 | 0.7.0 94 | 95 | 96 | com.github.sarxos 97 | webcam-capture 98 | 0.3.12 99 | 100 | 101 | net.sf.json-lib 102 | json-lib 103 | 2.4 104 | jdk15 105 | 106 | 107 | org.apache.httpcomponents 108 | httpclient 109 | 4.5.8 110 | 111 | 112 | org.apache.httpcomponents 113 | httpcore 114 | 4.4.11 115 | 116 | 117 | com.google.code.gson 118 | gson 119 | 2.8.5 120 | 121 | 122 | commons-net 123 | commons-net 124 | 3.6 125 | 126 | 127 | org.eclipse.swt 128 | org.eclipse.swt.win32.win32.x86_64 129 | 4.6.1 130 | 131 | 132 | SwingSets3 133 | SwingSets3 134 | 1.0 135 | 136 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /src/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: cn.cyan.view.InitializingPage 3 | 4 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/facedao/FacebaiduDeal.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.facedao; 2 | 3 | import cn.cyan.util.HttpUtil; 4 | import net.sf.json.JSONArray; 5 | import net.sf.json.JSONObject; 6 | 7 | import java.io.BufferedReader; 8 | import java.io.IOException; 9 | import java.io.InputStreamReader; 10 | import java.net.HttpURLConnection; 11 | import java.net.URL; 12 | 13 | /** 14 | * 更改人脸库 组 需要修改 15 | * 添加人脸库时 修改add()方法(以及detect()方法)中参数 (应该是管理员界面会调用此接口) 16 | * 搜索人脸时 修改search()方法中参数 (考勤会调用此接口) 17 | * 修改与删除人脸 (也是管理员才会调用的接口) 18 | */ 19 | 20 | public class FacebaiduDeal { 21 | 22 | /** 23 | * 百度云AK 24 | */ 25 | private static final String API_KEY = "mBBpwKa7HOwGTwzlXim5dcUn"; 26 | /** 27 | * 百度云SK 28 | */ 29 | private static final String SECRET_KEY = "4ETRBMSq37nVLhbyyIFDAg2Sskhn96hF"; 30 | /** 31 | * 获取access_token的接口地址 32 | */ 33 | private static final String AUTH_HOST = "https://aip.baidubce.com/oauth/2.0/token?"; 34 | /** 35 | * 进行人脸检测的接口地址 36 | */ 37 | private static final String DETECT_HOST = "https://aip.baidubce.com/rest/2.0/face/v3/detect"; 38 | /** 39 | * 进行人脸入人脸库的接口地址 40 | */ 41 | private static final String FACEADD_HOST = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add"; 42 | /** 43 | * 进行人脸搜索的接口地址 44 | */ 45 | private static final String FACRENZ_HOST = "https://aip.baidubce.com/rest/2.0/face/v3/search"; 46 | /** 47 | * 进行人脸更新的接口地址 48 | */ 49 | private static final String FACERGX_HOST = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/update"; 50 | /** 51 | * 进行人脸删除的接口地址 52 | */ 53 | private static final String FACEDELE_HOST = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/face/delete"; 54 | /** 55 | * 进行人脸信息查询的接口地址 56 | */ 57 | private static final String FACESELECT_HOST = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/get"; 58 | 59 | /** 60 | * Gruop_id 61 | */ 62 | private static final String groupid = "student_face_database"; 63 | 64 | /** 65 | * 人脸探测 json解析搞定 66 | * @return 返回人脸数 67 | * @throws Exception 68 | */ 69 | public String detect(String imgParam) throws Exception { 70 | JSONObject jsonObject = null; 71 | 72 | String param = "max_face_num=" + 1 73 | + "&face_field=" 74 | + "age,beauty,gender,glasses,race,quality" 75 | + "&image=" + imgParam 76 | + "&image_type=BASE64"; 77 | 78 | String accessToken = getAuth(); 79 | String result = HttpUtil.post(DETECT_HOST, accessToken,"application/json", param); 80 | System.out.println(result); 81 | 82 | 83 | jsonObject = JSONObject.fromObject(result); 84 | String error_code = jsonObject.optString("error_code"); 85 | 86 | /** 87 | * 划重点!!!!!!!!! 88 | * 写上博客 89 | * 去表头 也就是只取result对象 前面的都不要 90 | * V3返回JSON result是对象 不是数组Array 91 | * 所以V2文档得解析出错 92 | */ 93 | if (error_code.equals("0")) { 94 | JSONObject jsonObjectResult = JSONObject.fromObject(jsonObject.optJSONObject("result")); 95 | 96 | //取result对象中的face_num对象 97 | int face_num; 98 | face_num = jsonObjectResult.optInt("face_num"); 99 | System.out.println("face_num: " + face_num); 100 | 101 | //取result对象中的 face_list对象数组 102 | JSONArray jsonArrayFaceList = JSONArray.fromObject(jsonObjectResult.optJSONArray("face_list")); 103 | 104 | //取对象数组的face_token对象 105 | String face_token = jsonArrayFaceList.optJSONObject(0).optString("face_token"); 106 | System.out.println("face_token: " + face_token); 107 | 108 | //取对象数组的 location 对象 109 | JSONObject jsonObjectLocation = jsonArrayFaceList.optJSONObject(0).optJSONObject("location"); 110 | //然后解析location中的各个键值对 111 | double left = jsonObjectLocation.optDouble("left"); 112 | double top = jsonObjectLocation.optDouble("top"); 113 | double width = jsonObjectLocation.optDouble("width"); 114 | double height = jsonObjectLocation.optDouble("height"); 115 | int rotation = jsonObjectLocation.optInt("rotation"); 116 | System.out.println("left: " + left); 117 | System.out.println("top: " + top); 118 | System.out.println("width: " + width); 119 | System.out.println("height: " + height); 120 | System.out.println("rotation: " + rotation); 121 | 122 | //取face_probability 123 | Double face_probability = jsonArrayFaceList.optJSONObject(0).optDouble("face_probability"); 124 | 125 | //取angle 126 | JSONObject jsonObjectAngle = jsonArrayFaceList.optJSONObject(0).optJSONObject("angle"); 127 | double yaw = jsonObjectAngle.optDouble("yaw"); 128 | double pitch = jsonObjectAngle.optDouble("pitch"); 129 | double roll = jsonObjectAngle.optDouble("roll"); 130 | System.out.println("yaw: " + yaw); 131 | System.out.println("pitch: " + pitch); 132 | System.out.println("roll: " + roll); 133 | 134 | //取age 135 | double age = jsonArrayFaceList.optJSONObject(0).optDouble("age"); 136 | System.out.println("age: " + age); 137 | //取beauty 138 | double beauty = jsonArrayFaceList.optJSONObject(0).optDouble("beauty"); 139 | System.out.println("beauty: " + beauty); 140 | 141 | //取gender 142 | JSONObject jsonObjectGender = jsonArrayFaceList.optJSONObject(0).optJSONObject("gender"); 143 | String type = jsonObjectGender.optString("type"); 144 | double probability = jsonObjectGender.optDouble("probability"); 145 | System.out.println("gender type: " + type); 146 | System.out.println("gender probability: " + probability); 147 | 148 | //取glasses 149 | JSONObject jsonObjectGlasses = jsonArrayFaceList.optJSONObject(0).optJSONObject("glasses"); 150 | String glasses_type = jsonObjectGender.optString("type"); 151 | double glasses_probability = jsonObjectGender.optDouble("probability"); 152 | System.out.println("glasses type: " + glasses_type); 153 | System.out.println("glasses probability: " + glasses_probability); 154 | 155 | //取race 156 | JSONObject jsonObjectRace = jsonArrayFaceList.optJSONObject(0).optJSONObject("race"); 157 | String race_type = jsonObjectGender.optString("type"); 158 | double race_probability = jsonObjectGender.optDouble("probability"); 159 | System.out.println("race type: " + race_type); 160 | System.out.println("race probability: " + race_probability); 161 | 162 | //取quality 163 | JSONObject jsonObjectQuality = jsonArrayFaceList.optJSONObject(0).optJSONObject("quality"); 164 | JSONObject jsonObjectOcclusion = jsonObjectQuality.optJSONObject("occlusion"); 165 | double left_eye = jsonObjectOcclusion.optDouble("left_eye"); 166 | double right_eye = jsonObjectOcclusion.optDouble("right_eye"); 167 | double nose = jsonObjectOcclusion.optDouble("nose"); 168 | double mouth = jsonObjectOcclusion.optDouble("mouth"); 169 | double left_cheek = jsonObjectOcclusion.optDouble("left_cheek"); 170 | double right_cheek = jsonObjectOcclusion.optDouble("right_cheek"); 171 | double chin_contour = jsonObjectOcclusion.optDouble("chin_contour"); 172 | System.out.println("left_eye: " + left_eye); 173 | System.out.println("right_eye:" + right_eye); 174 | 175 | //取blur 176 | double blur = jsonArrayFaceList.optJSONObject(0).optDouble("blur"); 177 | System.out.println("blur: " + blur); 178 | //取illumination 179 | double illumination = jsonArrayFaceList.optJSONObject(0).optDouble("illumination"); 180 | //取completeness 181 | int completeness = jsonArrayFaceList.optJSONObject(0).optInt("competeness"); 182 | 183 | 184 | 185 | /** 186 | * 测试成功的 Bean方法 以后有机会学 187 | */ 188 | // try { 189 | //// FJFaceListUtil fjFaceListUtil = JSON.parseObject(result, FJFaceListUtil.class); 190 | //// System.out.println(JSON.toJSONString(fjFaceListUtil)); 191 | // 192 | // } catch (Exception e) { 193 | // System.out.println("解析异常"); 194 | // e.printStackTrace(); 195 | // } 196 | } 197 | 198 | return error_code; 199 | 200 | } 201 | 202 | /** 203 | * 人脸信息入人脸库 204 | * @return 205 | * imgParam:人脸base64串 206 | * uid:人脸id(例如身份证等) 207 | * @throws Exception 208 | */ 209 | public JSONObject faceadd(String imgParam, String uid, String userinfo) throws Exception { 210 | JSONObject jsonObject = null; 211 | 212 | if(userinfo==null){ 213 | userinfo = uid; 214 | } 215 | /** 216 | * 参数修改处 217 | */ 218 | String param = "user_id=" + uid 219 | + "&group_id=" + groupid 220 | + "&image=" + imgParam 221 | + "&image_type=BASE64" 222 | + "&user_info=" + userinfo 223 | + "&action_type=REPLACE" 224 | + "&liveness_control=LOW"; 225 | 226 | String accessToken = getAuth(); 227 | String result = HttpUtil.post(FACEADD_HOST, accessToken, "application/json", param); 228 | 229 | jsonObject = JSONObject.fromObject(result); 230 | 231 | return jsonObject; 232 | } 233 | 234 | 235 | /** 236 | * 人脸信息识别,判断指定人脸是否存在库中 237 | * @param imgParam:人脸信息,base64转码后的串 238 | * @return 239 | */ 240 | public JSONObject facesearch(String imgParam) { 241 | JSONObject jsonObject = null; 242 | 243 | try { 244 | 245 | /** 246 | * 参数修改处 247 | */ 248 | String param = "&group_id_list=" + groupid//暂时 下一周改接口 方便后期查询 249 | + "&image=" + imgParam 250 | + "&image_type=BASE64" 251 | + "&quality_control=LOW" 252 | + "&liveness_control=LOW" 253 | + "&max_user_num=1"; 254 | 255 | String accessToken = getAuth(); 256 | String result = HttpUtil.post(FACRENZ_HOST, accessToken, "application/json",param); 257 | jsonObject = JSONObject.fromObject(result); 258 | return jsonObject; 259 | 260 | } catch (Exception e) { 261 | 262 | e.printStackTrace(); 263 | } 264 | return null; 265 | } 266 | 267 | 268 | /** 269 | * 人脸信息库存更新 270 | * @param imgParam 271 | * @param userinfo 272 | * @return 273 | */ 274 | public JSONObject faceupdate(String imgParam, String userinfo, String uid) { 275 | JSONObject jsonObject = null; 276 | 277 | try { 278 | 279 | String param = "&user_id="+uid 280 | + "&image=" + imgParam 281 | + "&image_type=BASE64" 282 | + "&user_info=" + userinfo 283 | + "&group_id=" + groupid 284 | + "&action_type=REPLACE" 285 | + "&quality_control=LOW" 286 | + "&liveness_control=LOW"; 287 | 288 | String accessToken = getAuth(); 289 | String result = HttpUtil.post(FACERGX_HOST, accessToken, "application/json", param); 290 | jsonObject = JSONObject.fromObject(result); 291 | return jsonObject; 292 | 293 | } catch (Exception e) { 294 | 295 | e.printStackTrace(); 296 | } 297 | return null; 298 | } 299 | 300 | /** 301 | * 指定人脸信息删除 302 | * @param uid 303 | * @return 304 | */ 305 | public JSONObject facedelete(String uid, String face_token) { 306 | 307 | JSONObject jsonObject = null; 308 | 309 | try { 310 | String param = "&user_id=" + uid 311 | + "&group_id=" + groupid 312 | + "&face_token=" + face_token; 313 | 314 | System.out.println(param); 315 | 316 | String accessToken = getAuth(); 317 | String result = HttpUtil.post(FACEDELE_HOST, accessToken, "application/json",param); 318 | jsonObject = JSONObject.fromObject(result); 319 | return jsonObject; 320 | 321 | } catch (Exception e) { 322 | 323 | e.printStackTrace(); 324 | } 325 | return null; 326 | } 327 | 328 | 329 | /** 330 | * 根据人脸查询用户信息 331 | * @param uid 332 | * @return 333 | */ 334 | public JSONObject faceselect(String uid) { 335 | 336 | JSONObject jsonObject = null; 337 | 338 | try { 339 | String param = "&user_id="+uid 340 | +"&group_id=" + groupid; 341 | 342 | String accessToken = getAuth(); 343 | String result = HttpUtil.post(FACESELECT_HOST, accessToken, "application/json", param); 344 | jsonObject = JSONObject.fromObject(result); 345 | 346 | return jsonObject; 347 | 348 | } catch (Exception e) { 349 | 350 | e.printStackTrace(); 351 | } 352 | return null; 353 | } 354 | 355 | /** 356 | * 获取权限token 357 | * @return 358 | */ 359 | public String getAuth(){ 360 | // 获取access_token地址 361 | String getAccessTokenUrl = AUTH_HOST 362 | // 1. grant_type为固定参数 363 | + "grant_type=client_credentials" 364 | // 2. 官网获取的 API Key 365 | + "&client_id=" + API_KEY 366 | // 3. 官网获取的 Secret Key 367 | + "&client_secret=" + SECRET_KEY; 368 | JSONObject jsonObject = null; 369 | BufferedReader in = null; 370 | try { 371 | URL realUrl = new URL(getAccessTokenUrl); 372 | HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); 373 | connection.setRequestMethod("GET"); 374 | connection.connect(); 375 | // 获取所有响应头字段 376 | // Map> map = connection.getHeaderFields(); 377 | // 遍历所有的响应头字段 378 | /*for (String key : map.keySet()) { 379 | System.err.println(key + "--->" + map.get(key)); 380 | }*/ 381 | // 定义 BufferedReader输入流来读取URL的响应 382 | in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 383 | String result = ""; 384 | String line; 385 | while ((line = in.readLine()) != null) { 386 | result += line; 387 | } 388 | /** 389 | * 返回结果示例 390 | */ 391 | jsonObject = JSONObject.fromObject(result); 392 | String access_token = jsonObject.getString("access_token"); 393 | return access_token; 394 | } catch (Exception e) { 395 | e.printStackTrace(); 396 | } finally { 397 | if(in!=null){ 398 | try { 399 | in.close(); 400 | } catch (IOException e) { 401 | e.printStackTrace(); 402 | } 403 | } 404 | } 405 | return null; 406 | } 407 | } 408 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/facedao/FacebaiduMain.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.facedao; 2 | 3 | import net.sf.json.JSONArray; 4 | import net.sf.json.JSONObject; 5 | import org.apache.commons.lang.exception.ExceptionUtils; 6 | 7 | import javax.swing.*; 8 | import java.io.UnsupportedEncodingException; 9 | import java.net.URLEncoder; 10 | 11 | /** 12 | * 13 | * @author chenxianj 14 | * 20180107 15 | *调用百度提供的人脸识别接口进行人脸信息的 16 | *入库、检测、识别、库中人脸修改、库中人脸 17 | *删除以及相关查询 18 | */ 19 | public class FacebaiduMain { 20 | 21 | 22 | /** 23 | * chenxianj 20170117 24 | *人脸信息处理的主方法:向外部提供该方法, 25 | *通过传过来的标志进行相关方法的调用 26 | *imgStr:人脸信息,经base64转码后的 27 | *faceflag:人脸信息处理标志,如下 28 | *detect:人脸信息检测 29 | *add:向人脸库中增加人脸信息 30 | *recognition:人脸识别,判断指定人脸是否在人脸库中 31 | *update:修改库中已存在的人脸信息 32 | *delete:删除库中指定人脸信息 33 | *select:查询库中指定人脸信息 34 | * @throws Exception 35 | * @throws UnsupportedEncodingException 36 | */ 37 | public void Faceinfomain(String faceflag,String imgStr,String uid,String userinfo) throws Exception{ 38 | /** 39 | * face flag 选择人脸处理方法detect(被包含)、add、recognition、update、delete、select(被包含) 40 | * imgStr是base64编码 41 | * uid 是user_id 42 | * userinfo 即用户信息 默认未user_id 43 | */ 44 | try { 45 | //人脸处理类 46 | FacebaiduDeal facedeal = new FacebaiduDeal(); 47 | 48 | /** 49 | * imgStr为请求参数 50 | * 人脸检测的请求参数有 51 | * 必选 image (string)即图片base64编码 52 | * 必选 image_type即图片类型BASE64、URL、FACE_TOKEN 53 | * 非必选 face_field (string) 包括age、beauty expression face_shape gender glasses landmark 54 | *landmark150 race quality eye_status emotion face_type 55 | * 非必选max_face_num int32 最多处理人脸数目 默认值为1 仅检测图片中面积最大的人脸 最大值10 检测图片中面积最大的10张人脸 56 | * 非必选 face_type string 人脸的类型 LIVE IDCARD WATERMARK CERT 默认live生活照 57 | * 非必选 liveness string 活体控制 检测中不符合要求的人脸会被过滤 NONE 不进行控制 LOW较低的活体要求 MORMAL HIGH 默认NONE 58 | */ 59 | String imgParam = null; 60 | 61 | if(faceflag.equals("detect")||faceflag.equals("add")||faceflag.equals("search")||faceflag.equals("update")){ 62 | 63 | if(imgStr==null){ 64 | 65 | throw new Exception("人脸信息不能为空!"); 66 | } 67 | } 68 | imgParam = URLEncoder.encode(imgStr, "UTF-8"); 69 | 70 | //人脸检测,imgParam 71 | if(faceflag.equals("detect")){ 72 | 73 | facedeal.detect(imgParam); 74 | 75 | } 76 | 77 | 78 | //人脸信息入人脸库 79 | if(faceflag.equals("add")){ 80 | 81 | //入库之前先检测下人脸信息是否合规 82 | facedeal.detect(imgParam); 83 | 84 | JSONObject jsonObject = facedeal.faceadd(imgParam, uid, userinfo); 85 | 86 | if(jsonObject==null){ 87 | 88 | throw new Exception("脸部信息入库失败!"); 89 | } 90 | 91 | String errorcode = jsonObject.optString("error_code"); 92 | 93 | if(errorcode.equals("0")){ 94 | JOptionPane.showMessageDialog(null, "人脸注册成功" ); 95 | 96 | } else { 97 | String errormsg = jsonObject.optString("error_msg"); 98 | 99 | System.out.println("errormsg: "+errormsg); 100 | 101 | throw new Exception("脸部信息入库失败!报错信息为:"+errormsg); 102 | } 103 | } 104 | 105 | 106 | //人脸信息搜索,判断指定人脸是否在人脸库中 107 | if(faceflag.equals("search")){ 108 | 109 | JSONObject jsonjt = facedeal.facesearch(imgParam); 110 | String error_msg = jsonjt.optString("error_msg"); 111 | String error_code = jsonjt.optString("error_code"); 112 | 113 | System.out.println("errormsg:"+error_msg); 114 | 115 | 116 | if(error_code.equals("0")){ 117 | 118 | JSONObject jsonObjectResult = JSONObject.fromObject(jsonjt.optJSONObject("result")); 119 | 120 | String face_token = jsonObjectResult.optString("face_token"); 121 | 122 | JSONArray jsonArrayUserList = jsonObjectResult.optJSONArray("user_list"); 123 | String group_id = jsonArrayUserList.optJSONObject(0).optString("group_id"); 124 | String user_id = jsonArrayUserList.optJSONObject(0).optString("user_id"); 125 | String user_info = jsonArrayUserList.optJSONObject(0).optString("user_info"); 126 | double score = jsonArrayUserList.optJSONObject(0).optDouble("score"); 127 | 128 | 129 | if(score<80){ 130 | 131 | throw new Exception("该人脸信息在人脸库中不存在!"); 132 | } 133 | System.out.println("face_token: " + face_token); 134 | System.out.println("group_id: "+group_id); 135 | System.out.println("user_info: "+user_info); 136 | System.out.println("scores: "+score); 137 | 138 | try { 139 | UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 140 | } catch (ClassNotFoundException | InstantiationException | IllegalAccessException 141 | | UnsupportedLookAndFeelException e) { 142 | e.printStackTrace(); 143 | } 144 | JOptionPane.showMessageDialog(null,"以下是人脸识别返回结果信息:\n" 145 | + "group_id: "+group_id + "\n" +"user_info: "+user_info + "\n" + "匹配得分: "+score ); 146 | }else { 147 | System.out.println("因为某些原因查找失败"); 148 | JOptionPane.showMessageDialog(null, "因为某些原因查找失败"); 149 | 150 | } 151 | } 152 | 153 | 154 | //人脸信息更新 155 | if(faceflag.equals("update")){ 156 | 157 | //入库之前先检测下人脸信息是否合规 158 | facedeal.detect(imgParam); 159 | 160 | JSONObject jsonObject = facedeal.faceupdate(imgParam, userinfo,uid); 161 | 162 | String errorcode = jsonObject.optString("error_code"); 163 | 164 | if(errorcode == "0"){ 165 | 166 | String errormsg = jsonObject.optString("error_msg"); 167 | 168 | System.out.println("errormsg:"+errormsg); 169 | } 170 | 171 | jsonObject.optInt("log_id"); 172 | 173 | } 174 | 175 | 176 | //人脸信息删除 177 | if(faceflag.equals("delete")){ 178 | 179 | //删除之前想看是否存在这个人的信息需要获取face_token信息来删除 180 | JSONObject jsonObjectTest = facedeal.facesearch(imgParam); 181 | JSONObject jsonObjectResult = JSONObject.fromObject(jsonObjectTest.optJSONObject("result")); 182 | 183 | String error_code = jsonObjectTest.optString("error_code"); 184 | 185 | if (error_code.equals("0")) { 186 | String face_token = jsonObjectResult.optString("face_token"); 187 | 188 | System.out.println(face_token); 189 | 190 | 191 | JSONObject jsonObject = facedeal.facedelete(uid, face_token); 192 | 193 | String errorcode = jsonObject.optString("error_code"); 194 | 195 | if(!errorcode.equals("0")){ 196 | 197 | String errormsg = jsonObject.optString("error_msg"); 198 | 199 | System.out.println("errormsg:"+errormsg); 200 | } 201 | 202 | jsonObject.optDouble("log_id"); 203 | } else { 204 | System.out.println("删除失败 不存在这样的人脸"); 205 | } 206 | 207 | 208 | 209 | } 210 | //人脸信息查询 211 | if(faceflag.equals("select")){ 212 | JSONObject sjson = facedeal.faceselect(uid); 213 | 214 | if(sjson.optJSONObject("result")!=null){ 215 | 216 | JSONObject jsonObjectd = JSONObject.fromObject(sjson.optJSONObject("result")); 217 | 218 | String group_id = jsonObjectd.optJSONArray("user_list").optJSONObject(0).optString("gruop_id"); 219 | String user_info = jsonObjectd.optJSONArray("user_list").optJSONObject(0).optString("user_info"); 220 | 221 | System.out.println("group_id: "+group_id); 222 | System.out.println("user_info: "+user_info); 223 | 224 | 225 | try { 226 | UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 227 | } catch (ClassNotFoundException | InstantiationException | IllegalAccessException 228 | | UnsupportedLookAndFeelException event) { 229 | event.printStackTrace(); 230 | } 231 | 232 | JOptionPane.showMessageDialog(null,"以下是人脸信息查询返回结果信息:\n" + "group_id: "+group_id + "\n" +"user_info: "+user_info ); 233 | 234 | }else{ 235 | 236 | String errorcode = sjson.optString("error_msg"); 237 | 238 | System.out.println("errorcode:"+errorcode); 239 | } 240 | 241 | 242 | } 243 | 244 | } catch (Exception e) { 245 | // TODO Auto-generated catch block 246 | throw new Exception(ExceptionUtils.getStackTrace(e)); 247 | } 248 | } 249 | } 250 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/facedao/FacebaiduRegister.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.facedao; 2 | 3 | import cn.cyan.util.FileUtil; 4 | import com.baidu.aip.util.Base64Util; 5 | 6 | /** 7 | * @Author: Cyan 8 | * @Date: 2019/5/30 22:45 9 | * 用来注册上传人脸到百度平台人脸数据库 10 | */ 11 | public class FacebaiduRegister { 12 | 13 | public void uploadingFace(String filepath, String face_student_id, String face_student_name) { 14 | try { 15 | System.out.println("filename is " + filepath); 16 | System.out.println(face_student_id); 17 | System.out.println(face_student_name); 18 | 19 | byte[] imgData; 20 | imgData = FileUtil.readFileByBytes(filepath); 21 | String imgStr = Base64Util.encode(imgData); 22 | FacebaiduMain facedeal = new FacebaiduMain(); 23 | 24 | facedeal.Faceinfomain("add", imgStr, face_student_id, face_student_name); 25 | } catch (Exception e) { 26 | // TODO Auto-generated catch block 27 | e.printStackTrace(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/facedao/FacebaiduTest.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.facedao; 2 | 3 | import cn.cyan.util.FileUtil; 4 | import com.baidu.aip.util.Base64Util; 5 | 6 | public class FacebaiduTest { 7 | 8 | public static void main(String[] args) { 9 | 10 | 11 | try { 12 | byte[] imgData; 13 | imgData = FileUtil.readFileByBytes("D:\\Java大作业\\FaceRecoDemo\\src\\main\\java\\cn\\cyan\\facedao\\images\\lisa01.jpg"); 14 | String imgStr = Base64Util.encode(imgData); 15 | FacebaiduMain facedeal = new FacebaiduMain(); 16 | /** 17 | * 如果要往人脸库中加入人脸 18 | * faceflag为add 19 | * uid 自己设置 最好按序增加 20 | * userinfo 必须填写为学生姓名 21 | */ 22 | facedeal.Faceinfomain("add", imgStr, "001", "辛璐玥"); 23 | } catch (Exception e) { 24 | // TODO Auto-generated catch block 25 | e.printStackTrace(); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/BaiduApiUtil/DeleteUserGroup.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util.BaiduApiUtil; 2 | 3 | import cn.cyan.facedao.FacebaiduDeal; 4 | import cn.cyan.util.GsonUtils; 5 | import cn.cyan.util.HttpUtil; 6 | 7 | import java.util.HashMap; 8 | import java.util.Map; 9 | 10 | /** 11 | * @Author: Cyan 12 | * @Date: 2019/5/19 15:50 13 | */ 14 | public class DeleteUserGroup { 15 | 16 | /** 17 | * 重要提示代码中所需工具类 18 | * FileUtil,Base64Util,HttpUtil,GsonUtils请从 19 | * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 20 | * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 21 | * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 22 | * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3 23 | * 下载 24 | */ 25 | public static String groupDelete() { 26 | // 请求url 27 | String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/delete"; 28 | try { 29 | Map map = new HashMap<>(); 30 | map.put("group_id", "group_repeat"); 31 | 32 | String param = GsonUtils.toJson(map); 33 | 34 | FacebaiduDeal facebaiduDeal = new FacebaiduDeal(); 35 | String accessToken = facebaiduDeal.getAuth(); 36 | 37 | String result = HttpUtil.post(url, accessToken, "application/json", param); 38 | System.out.println(result); 39 | return result; 40 | } catch (Exception e) { 41 | e.printStackTrace(); 42 | } 43 | return null; 44 | } 45 | 46 | public static void main(String[] args) { 47 | DeleteUserGroup.groupDelete(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/Base64Util.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util; 2 | 3 | /** 4 | * Base64 工具类 5 | */ 6 | public class Base64Util { 7 | private static final char last2byte = (char) Integer.parseInt("00000011", 2); 8 | private static final char last4byte = (char) Integer.parseInt("00001111", 2); 9 | private static final char last6byte = (char) Integer.parseInt("00111111", 2); 10 | private static final char lead6byte = (char) Integer.parseInt("11111100", 2); 11 | private static final char lead4byte = (char) Integer.parseInt("11110000", 2); 12 | private static final char lead2byte = (char) Integer.parseInt("11000000", 2); 13 | private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; 14 | 15 | public Base64Util() { 16 | } 17 | 18 | public static String encode(byte[] from) { 19 | StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3); 20 | int num = 0; 21 | char currentByte = 0; 22 | 23 | int i; 24 | for (i = 0; i < from.length; ++i) { 25 | for (num %= 8; num < 8; num += 6) { 26 | switch (num) { 27 | case 0: 28 | currentByte = (char) (from[i] & lead6byte); 29 | currentByte = (char) (currentByte >>> 2); 30 | case 1: 31 | case 3: 32 | case 5: 33 | default: 34 | break; 35 | case 2: 36 | currentByte = (char) (from[i] & last6byte); 37 | break; 38 | case 4: 39 | currentByte = (char) (from[i] & last4byte); 40 | currentByte = (char) (currentByte << 2); 41 | if (i + 1 < from.length) { 42 | currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6); 43 | } 44 | break; 45 | case 6: 46 | currentByte = (char) (from[i] & last2byte); 47 | currentByte = (char) (currentByte << 4); 48 | if (i + 1 < from.length) { 49 | currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4); 50 | } 51 | } 52 | 53 | to.append(encodeTable[currentByte]); 54 | } 55 | } 56 | 57 | if (to.length() % 4 != 0) { 58 | for (i = 4 - to.length() % 4; i > 0; --i) { 59 | to.append("="); 60 | } 61 | } 62 | 63 | return to.toString(); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/DB.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util; 2 | 3 | import javax.swing.*; 4 | import java.sql.*; 5 | 6 | public class DB { 7 | /* 8 | * jdbc驱动要能够正确的编码和解码(java语言内存使用unicode编码)        插入数据时(编码),查询数据时(解码)       9 | *  jdbc 10 | * :mysql://localhost:3306/jsd1406db?useUnicode=true&characterEncoding=utf8 11 | *        通知数据库如何编码 12 | */ 13 | private final String url = "jdbc:mysql://localhost:3306/acs?useUnicode=true&characterEncoding=utf8"; 14 | private final String userName = "root"; 15 | private final String password = "xly520lisa"; 16 | private Connection con = null; 17 | private Statement stm = null; 18 | 19 | /* 通过构造方法加载数据库驱动 */ 20 | public DB() { 21 | try { 22 | Class.forName("com.mysql.jdbc.Driver").newInstance(); // 加载com.mysql.jdbc.Driver(初始化类)这个类然后创建实例化Object对象 23 | } catch (Exception e) { 24 | e.printStackTrace(); 25 | System.out.println("加载数据库驱动失败!"); 26 | } 27 | } 28 | 29 | /* 创建数据库连接 */ 30 | public void createCon() { 31 | try { 32 | con = DriverManager.getConnection(url, userName, password); 33 | } catch (Exception e) { 34 | e.printStackTrace(); 35 | System.out.println("获取数据库连接失败!"); 36 | } 37 | } 38 | 39 | /* 获取Statement对象 */ 40 | public void getStm() { 41 | createCon(); 42 | try { 43 | stm = con.createStatement(); 44 | } catch (SQLException e) { 45 | e.printStackTrace(); 46 | System.out.println("创建Statement对象失败!"); 47 | } 48 | } 49 | 50 | /** 51 | * @功能 对数据库的增加、修改和删除的操作 52 | * @参数 sql为要执行的SQL语句 53 | * @返回值 boolean型值 54 | */ 55 | public boolean executeUpdate(String sql) { 56 | System.out.println(sql); 57 | boolean mark = false; 58 | Savepoint sp = null; //事务回滚 59 | 60 | try { 61 | getStm(); 62 | sp = con.setSavepoint(); 63 | int iCount = stm.executeUpdate(sql); 64 | if (iCount > 0) 65 | mark = true; 66 | else if (iCount <= 0) { 67 | mark = false; 68 | con.rollback(sp); 69 | con.commit(); 70 | JOptionPane.showMessageDialog(null,"数据库数据操作出错,执行事务回滚,请检查,数据输入不得为空!"); 71 | } 72 | 73 | } catch (Exception e) { 74 | e.printStackTrace(); 75 | mark = false; 76 | JOptionPane.showMessageDialog(null,"数据库操作异常,请检查,数据输入不得为空"); 77 | } 78 | return mark; 79 | } 80 | 81 | /* 查询数据库 */ 82 | public ResultSet executeQuery(String sql) { 83 | ResultSet rs = null; 84 | try { 85 | getStm(); 86 | try { 87 | rs = stm.executeQuery(sql); 88 | } catch (Exception e) { 89 | e.printStackTrace(); 90 | System.out.println("查询数据库失败!"); 91 | } 92 | } catch (Exception e) { 93 | e.printStackTrace(); 94 | } 95 | 96 | return rs; 97 | } 98 | 99 | /* 关闭数据库的操作 */ 100 | public void closed() { 101 | if (stm != null) 102 | try { 103 | stm.close(); 104 | } catch (SQLException e) { 105 | e.printStackTrace(); 106 | System.out.println("关闭stm对象失败!"); 107 | } 108 | if (con != null) 109 | try { 110 | con.close(); 111 | } catch (SQLException e) { 112 | e.printStackTrace(); 113 | System.out.println("关闭con对象失败!"); 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/FileUtil.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util; 2 | 3 | import java.io.*; 4 | 5 | /** 6 | * 文件读取工具类 7 | */ 8 | public class FileUtil { 9 | 10 | /** 11 | * 读取文件内容,作为字符串返回 12 | */ 13 | public static String readFileAsString(String filePath) throws IOException { 14 | File file = new File(filePath); 15 | if (!file.exists()) { 16 | throw new FileNotFoundException(filePath); 17 | } 18 | 19 | if (file.length() > 1024 * 1024 * 1024) { 20 | throw new IOException("File is too large"); 21 | } 22 | 23 | StringBuilder sb = new StringBuilder((int) (file.length())); 24 | // 创建字节输入流 25 | FileInputStream fis = new FileInputStream(filePath); 26 | // 创建一个长度为10240的Buffer 27 | byte[] bbuf = new byte[10240]; 28 | // 用于保存实际读取的字节数 29 | int hasRead = 0; 30 | while ( (hasRead = fis.read(bbuf)) > 0 ) { 31 | sb.append(new String(bbuf, 0, hasRead)); 32 | } 33 | fis.close(); 34 | return sb.toString(); 35 | } 36 | 37 | /** 38 | * 根据文件路径读取byte[] 数组 39 | */ 40 | public static byte[] readFileByBytes(String filePath) throws IOException { 41 | File file = new File(filePath); 42 | if (!file.exists()) { 43 | throw new FileNotFoundException(filePath); 44 | } else { 45 | ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length()); 46 | BufferedInputStream in = null; 47 | 48 | try { 49 | in = new BufferedInputStream(new FileInputStream(file)); 50 | short bufSize = 1024; 51 | byte[] buffer = new byte[bufSize]; 52 | int len1; 53 | while (-1 != (len1 = in.read(buffer, 0, bufSize))) { 54 | bos.write(buffer, 0, len1); 55 | } 56 | 57 | byte[] var7 = bos.toByteArray(); 58 | return var7; 59 | } finally { 60 | try { 61 | if (in != null) { 62 | in.close(); 63 | } 64 | } catch (IOException var14) { 65 | var14.printStackTrace(); 66 | } 67 | 68 | bos.close(); 69 | } 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/GsonUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2017 Baidu, Inc. All Rights Reserved. 3 | */ 4 | package cn.cyan.util; 5 | 6 | import com.google.gson.Gson; 7 | import com.google.gson.GsonBuilder; 8 | import com.google.gson.JsonParseException; 9 | 10 | import java.lang.reflect.Type; 11 | 12 | /** 13 | * Json工具类. 14 | */ 15 | public class GsonUtils { 16 | private static Gson gson = new GsonBuilder().create(); 17 | 18 | public static String toJson(Object value) { 19 | return gson.toJson(value); 20 | } 21 | 22 | public static T fromJson(String json, Class classOfT) throws JsonParseException { 23 | return gson.fromJson(json, classOfT); 24 | } 25 | 26 | public static T fromJson(String json, Type typeOfT) throws JsonParseException { 27 | return (T) gson.fromJson(json, typeOfT); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/HttpUtil.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.DataOutputStream; 5 | import java.io.InputStreamReader; 6 | import java.net.HttpURLConnection; 7 | import java.net.URL; 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | /** 12 | * http 工具类 13 | */ 14 | public class HttpUtil { 15 | 16 | public static String post(String requestUrl, String accessToken, String params) 17 | throws Exception { 18 | String contentType = "application/x-www-form-urlencoded"; 19 | return HttpUtil.post(requestUrl, accessToken, contentType, params); 20 | } 21 | 22 | public static String post(String requestUrl, String accessToken, String contentType, String params) 23 | throws Exception { 24 | String encoding = "UTF-8"; 25 | if (requestUrl.contains("nlp")) { 26 | encoding = "GBK"; 27 | } 28 | return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding); 29 | } 30 | 31 | public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding) 32 | throws Exception { 33 | String url = requestUrl + "?access_token=" + accessToken; 34 | return HttpUtil.postGeneralUrl(url, contentType, params, encoding); 35 | } 36 | 37 | public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding) 38 | throws Exception { 39 | URL url = new URL(generalUrl); 40 | // 打开和URL之间的连接 41 | HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 42 | connection.setRequestMethod("POST"); 43 | // 设置通用的请求属性 44 | connection.setRequestProperty("Content-Type", contentType); 45 | connection.setRequestProperty("Connection", "Keep-Alive"); 46 | connection.setUseCaches(false); 47 | connection.setDoOutput(true); 48 | connection.setDoInput(true); 49 | 50 | // 得到请求的输出流对象 51 | DataOutputStream out = new DataOutputStream(connection.getOutputStream()); 52 | out.write(params.getBytes(encoding)); 53 | out.flush(); 54 | out.close(); 55 | 56 | // 建立实际的连接 57 | connection.connect(); 58 | // 获取所有响应头字段 59 | Map> headers = connection.getHeaderFields(); 60 | // 遍历所有的响应头字段 61 | for (String key : headers.keySet()) { 62 | System.err.println(key + "--->" + headers.get(key)); 63 | } 64 | // 定义 BufferedReader输入流来读取URL的响应 65 | BufferedReader in = null; 66 | in = new BufferedReader( 67 | new InputStreamReader(connection.getInputStream(), encoding)); 68 | String result = ""; 69 | String getLine; 70 | while ((getLine = in.readLine()) != null) { 71 | result += getLine; 72 | } 73 | in.close(); 74 | System.err.println("result:" + result); 75 | return result; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/OpertareDBSets/OperateDB.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util.OpertareDBSets; 2 | 3 | import cn.cyan.util.DB; 4 | 5 | import java.sql.ResultSet; 6 | import java.sql.ResultSetMetaData; 7 | import java.sql.SQLException; 8 | import java.util.Vector; 9 | 10 | /** 11 | * @Author: Cyan 12 | * @Date: 2019/5/27 21:22 13 | * 操作学生表 14 | */ 15 | public class OperateDB { 16 | 17 | public static Vector getRows() { 18 | Vector rows = null; 19 | Vector columnHeads = null; 20 | 21 | try { 22 | //通过构造方法加载数据库驱动 23 | DB db = new DB(); 24 | //执行SQL语句 25 | ResultSet rs = null; 26 | rs = db.executeQuery("select * from student"); 27 | 28 | 29 | if (rs.wasNull()) { 30 | System.out.println("记录为空"); 31 | } 32 | 33 | rows = new Vector(); 34 | 35 | ResultSetMetaData rsmd = rs.getMetaData(); 36 | 37 | while (rs.next()) { 38 | rows.addElement(getNextRow(rs, rsmd)); 39 | } 40 | 41 | 42 | } catch (SQLException e) { 43 | System.out.println("未成功读取数据"); 44 | e.printStackTrace(); 45 | } 46 | 47 | return rows; 48 | } 49 | 50 | //得到数据库表头 51 | public static Vector getHead() { 52 | Vector columnHeads = null; 53 | 54 | try { 55 | DB db = new DB(); 56 | ResultSet rs = db.executeQuery("select * from student"); 57 | 58 | boolean moreRecords = rs.next(); 59 | if (!moreRecords) { 60 | System.out.println("记录为空"); 61 | } 62 | 63 | columnHeads = new Vector(); 64 | ResultSetMetaData rsmd = rs.getMetaData(); 65 | 66 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 67 | columnHeads.addElement(rsmd.getColumnName(i)); 68 | } 69 | 70 | } catch (SQLException e) { 71 | System.out.println("未成功打开数据库"); 72 | e.printStackTrace(); 73 | } 74 | 75 | return columnHeads; 76 | } 77 | 78 | 79 | //得到数据库中下一行数据 80 | private static Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd) throws SQLException { 81 | Vector currentRow = new Vector(); 82 | 83 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 84 | currentRow.addElement(rs.getString(i)); 85 | } 86 | 87 | return currentRow; 88 | } 89 | 90 | 91 | //测试 92 | public static void main(String[] args) { 93 | getRows(); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/OpertareDBSets/OperateDB2.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util.OpertareDBSets; 2 | 3 | import cn.cyan.util.DB; 4 | 5 | import java.sql.ResultSet; 6 | import java.sql.ResultSetMetaData; 7 | import java.sql.SQLException; 8 | import java.util.Vector; 9 | 10 | /** 11 | * @Author: Cyan 12 | * @Date: 2019/5/29 19:19 13 | * 操作选课表 14 | */ 15 | public class OperateDB2 { 16 | 17 | public static Vector getRows() { 18 | Vector rows = null; 19 | Vector columnHeads = null; 20 | 21 | try { 22 | //通过构造方法加载数据库驱动 23 | DB db = new DB(); 24 | //执行SQL语句 25 | ResultSet rs = null; 26 | rs = db.executeQuery("select * from classselecting"); 27 | 28 | 29 | if (rs.wasNull()) { 30 | System.out.println("记录为空"); 31 | } 32 | 33 | rows = new Vector(); 34 | 35 | ResultSetMetaData rsmd = rs.getMetaData(); 36 | 37 | while (rs.next()) { 38 | rows.addElement(getNextRow(rs, rsmd)); 39 | } 40 | 41 | 42 | } catch (SQLException e) { 43 | System.out.println("未成功读取数据"); 44 | e.printStackTrace(); 45 | } 46 | 47 | return rows; 48 | } 49 | 50 | //得到数据库表头 51 | public static Vector getHead() { 52 | Vector columnHeads = null; 53 | 54 | try { 55 | DB db = new DB(); 56 | ResultSet rs = db.executeQuery("select * from classselecting"); 57 | 58 | boolean moreRecords = rs.next(); 59 | if (!moreRecords) { 60 | System.out.println("记录为空"); 61 | } 62 | 63 | columnHeads = new Vector(); 64 | ResultSetMetaData rsmd = rs.getMetaData(); 65 | 66 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 67 | columnHeads.addElement(rsmd.getColumnName(i)); 68 | } 69 | 70 | } catch (SQLException e) { 71 | System.out.println("未成功打开数据库"); 72 | e.printStackTrace(); 73 | } 74 | 75 | return columnHeads; 76 | } 77 | 78 | 79 | //得到数据库中下一行数据 80 | private static Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd) throws SQLException { 81 | Vector currentRow = new Vector(); 82 | 83 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 84 | currentRow.addElement(rs.getString(i)); 85 | } 86 | 87 | return currentRow; 88 | } 89 | 90 | 91 | //测试 92 | public static void main(String[] args) { 93 | getRows(); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/OpertareDBSets/OperateDB3.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util.OpertareDBSets; 2 | 3 | import cn.cyan.util.DB; 4 | 5 | import java.sql.ResultSet; 6 | import java.sql.ResultSetMetaData; 7 | import java.sql.SQLException; 8 | import java.util.Vector; 9 | 10 | /** 11 | * @Author: Cyan 12 | * @Date: 2019/5/29 19:32 13 | * 操作课程表 14 | */ 15 | 16 | 17 | public class OperateDB3 { 18 | 19 | public static Vector getRows() { 20 | Vector rows = null; 21 | Vector columnHeads = null; 22 | 23 | try { 24 | //通过构造方法加载数据库驱动 25 | DB db = new DB(); 26 | //执行SQL语句 27 | ResultSet rs = null; 28 | rs = db.executeQuery("select * from classes"); 29 | 30 | 31 | if (rs.wasNull()) { 32 | System.out.println("记录为空"); 33 | } 34 | 35 | rows = new Vector(); 36 | 37 | ResultSetMetaData rsmd = rs.getMetaData(); 38 | 39 | while (rs.next()) { 40 | rows.addElement(getNextRow(rs, rsmd)); 41 | } 42 | 43 | 44 | } catch (SQLException e) { 45 | System.out.println("未成功读取数据"); 46 | e.printStackTrace(); 47 | } 48 | 49 | return rows; 50 | } 51 | 52 | //得到数据库表头 53 | public static Vector getHead() { 54 | Vector columnHeads = null; 55 | 56 | try { 57 | DB db = new DB(); 58 | ResultSet rs = db.executeQuery("select * from classes"); 59 | 60 | boolean moreRecords = rs.next(); 61 | if (!moreRecords) { 62 | System.out.println("记录为空"); 63 | } 64 | 65 | columnHeads = new Vector(); 66 | ResultSetMetaData rsmd = rs.getMetaData(); 67 | 68 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 69 | columnHeads.addElement(rsmd.getColumnName(i)); 70 | } 71 | 72 | } catch (SQLException e) { 73 | System.out.println("未成功打开数据库"); 74 | e.printStackTrace(); 75 | } 76 | 77 | return columnHeads; 78 | } 79 | 80 | 81 | //得到数据库中下一行数据 82 | private static Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd) throws SQLException { 83 | Vector currentRow = new Vector(); 84 | 85 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 86 | currentRow.addElement(rs.getString(i)); 87 | } 88 | 89 | return currentRow; 90 | } 91 | 92 | 93 | //测试 94 | public static void main(String[] args) { 95 | getRows(); 96 | } 97 | } 98 | 99 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/OpertareDBSets/OperateDB4.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util.OpertareDBSets; 2 | 3 | import cn.cyan.util.DB; 4 | 5 | import java.sql.ResultSet; 6 | import java.sql.ResultSetMetaData; 7 | import java.sql.SQLException; 8 | import java.util.Vector; 9 | 10 | /** 11 | * @Author: Cyan 12 | * @Date: 2019/5/29 22:48 13 | * 操作考勤表 14 | */ 15 | public class OperateDB4 { 16 | public static Vector getRows() { 17 | Vector rows = null; 18 | Vector columnHeads = null; 19 | 20 | try { 21 | //通过构造方法加载数据库驱动 22 | DB db = new DB(); 23 | //执行SQL语句 24 | ResultSet rs = null; 25 | rs = db.executeQuery("select * from view_attendancechecking"); 26 | 27 | 28 | if (rs.wasNull()) { 29 | System.out.println("记录为空"); 30 | } 31 | 32 | rows = new Vector(); 33 | 34 | ResultSetMetaData rsmd = rs.getMetaData(); 35 | 36 | while (rs.next()) { 37 | rows.addElement(getNextRow(rs, rsmd)); 38 | } 39 | 40 | 41 | } catch (SQLException e) { 42 | System.out.println("未成功读取数据"); 43 | e.printStackTrace(); 44 | } 45 | 46 | return rows; 47 | } 48 | 49 | //得到数据库表头 50 | public static Vector getHead() { 51 | Vector columnHeads = null; 52 | 53 | try { 54 | DB db = new DB(); 55 | ResultSet rs = db.executeQuery("select * from view_attendancechecking"); 56 | 57 | boolean moreRecords = rs.next(); 58 | if (!moreRecords) { 59 | System.out.println("记录为空"); 60 | } 61 | 62 | columnHeads = new Vector(); 63 | ResultSetMetaData rsmd = rs.getMetaData(); 64 | 65 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 66 | columnHeads.addElement(rsmd.getColumnName(i)); 67 | } 68 | 69 | } catch (SQLException e) { 70 | System.out.println("未成功打开数据库"); 71 | e.printStackTrace(); 72 | } 73 | 74 | return columnHeads; 75 | } 76 | 77 | 78 | //得到数据库中下一行数据 79 | private static Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd) throws SQLException { 80 | Vector currentRow = new Vector(); 81 | 82 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 83 | currentRow.addElement(rs.getString(i)); 84 | } 85 | 86 | return currentRow; 87 | } 88 | 89 | 90 | //测试 91 | public static void main(String[] args) { 92 | getRows(); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/OpertareDBSets/OperateDB5.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util.OpertareDBSets; 2 | 3 | import cn.cyan.util.DB; 4 | 5 | import java.sql.ResultSet; 6 | import java.sql.ResultSetMetaData; 7 | import java.sql.SQLException; 8 | import java.util.Vector; 9 | 10 | /** 11 | * @Author: Cyan 12 | * @Date: 2019/5/31 11:01 13 | * 教师表 14 | */ 15 | public class OperateDB5 { 16 | 17 | public static Vector getRows() { 18 | Vector rows = null; 19 | Vector columnHeads = null; 20 | 21 | try { 22 | //通过构造方法加载数据库驱动 23 | DB db = new DB(); 24 | //执行SQL语句 25 | ResultSet rs = null; 26 | rs = db.executeQuery("select * from teacher"); 27 | 28 | 29 | if (rs.wasNull()) { 30 | System.out.println("记录为空"); 31 | } 32 | 33 | rows = new Vector(); 34 | 35 | ResultSetMetaData rsmd = rs.getMetaData(); 36 | 37 | while (rs.next()) { 38 | rows.addElement(getNextRow(rs, rsmd)); 39 | } 40 | 41 | 42 | } catch (SQLException e) { 43 | System.out.println("未成功读取数据"); 44 | e.printStackTrace(); 45 | } 46 | 47 | return rows; 48 | } 49 | 50 | //得到数据库表头 51 | public static Vector getHead() { 52 | Vector columnHeads = null; 53 | 54 | try { 55 | DB db = new DB(); 56 | ResultSet rs = db.executeQuery("select * from teacher"); 57 | 58 | boolean moreRecords = rs.next(); 59 | if (!moreRecords) { 60 | System.out.println("记录为空"); 61 | } 62 | 63 | columnHeads = new Vector(); 64 | ResultSetMetaData rsmd = rs.getMetaData(); 65 | 66 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 67 | columnHeads.addElement(rsmd.getColumnName(i)); 68 | } 69 | 70 | } catch (SQLException e) { 71 | System.out.println("未成功打开数据库"); 72 | e.printStackTrace(); 73 | } 74 | 75 | return columnHeads; 76 | } 77 | 78 | 79 | //得到数据库中下一行数据 80 | private static Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd) throws SQLException { 81 | Vector currentRow = new Vector(); 82 | 83 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 84 | currentRow.addElement(rs.getString(i)); 85 | } 86 | 87 | return currentRow; 88 | } 89 | 90 | 91 | //测试 92 | public static void main(String[] args) { 93 | getRows(); 94 | } 95 | } 96 | 97 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/util/OpertareDBSets/OperateDB6.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.util.OpertareDBSets; 2 | 3 | import cn.cyan.util.DB; 4 | 5 | import java.sql.ResultSet; 6 | import java.sql.ResultSetMetaData; 7 | import java.sql.SQLException; 8 | import java.util.Vector; 9 | 10 | /** 11 | * @Author: Cyan 12 | * @Date: 2019/5/31 21:55 13 | */ 14 | public class OperateDB6 { 15 | 16 | public static Vector getRows() { 17 | Vector rows = null; 18 | Vector columnHeads = null; 19 | 20 | try { 21 | //通过构造方法加载数据库驱动 22 | DB db = new DB(); 23 | //执行SQL语句 24 | ResultSet rs = null; 25 | rs = db.executeQuery("select * from 授课表"); 26 | 27 | 28 | if (rs.wasNull()) { 29 | System.out.println("记录为空"); 30 | } 31 | 32 | rows = new Vector(); 33 | 34 | ResultSetMetaData rsmd = rs.getMetaData(); 35 | 36 | while (rs.next()) { 37 | rows.addElement(getNextRow(rs, rsmd)); 38 | } 39 | 40 | 41 | } catch (SQLException e) { 42 | System.out.println("未成功读取数据"); 43 | e.printStackTrace(); 44 | } 45 | 46 | return rows; 47 | } 48 | 49 | //得到数据库表头 50 | public static Vector getHead() { 51 | Vector columnHeads = null; 52 | 53 | try { 54 | DB db = new DB(); 55 | ResultSet rs = db.executeQuery("select * from 授课表"); 56 | 57 | boolean moreRecords = rs.next(); 58 | if (!moreRecords) { 59 | System.out.println("记录为空"); 60 | } 61 | 62 | columnHeads = new Vector(); 63 | ResultSetMetaData rsmd = rs.getMetaData(); 64 | 65 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 66 | columnHeads.addElement(rsmd.getColumnName(i)); 67 | } 68 | 69 | } catch (SQLException e) { 70 | System.out.println("未成功打开数据库"); 71 | e.printStackTrace(); 72 | } 73 | 74 | return columnHeads; 75 | } 76 | 77 | 78 | //得到数据库中下一行数据 79 | private static Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd) throws SQLException { 80 | Vector currentRow = new Vector(); 81 | 82 | for (int i = 1; i <= rsmd.getColumnCount(); i++) { 83 | currentRow.addElement(rs.getString(i)); 84 | } 85 | 86 | return currentRow; 87 | } 88 | 89 | 90 | //测试 91 | public static void main(String[] args) { 92 | getRows(); 93 | } 94 | } 95 | 96 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/AdminBasicInfoPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import cn.cyan.util.DB; 4 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 5 | 6 | import javax.swing.*; 7 | import javax.swing.table.DefaultTableModel; 8 | import java.awt.*; 9 | import java.awt.event.ActionEvent; 10 | import java.awt.event.ActionListener; 11 | import java.net.URL; 12 | import java.sql.ResultSet; 13 | import java.sql.SQLException; 14 | 15 | /** 16 | * @Author: Cyan 17 | * @Date: 2019/5/31 9:01 18 | */ 19 | public class AdminBasicInfoPage extends JFrame { 20 | private String userAccount; 21 | private String userPassword; 22 | private DefaultTableModel defaultTableModel; 23 | private JTable jTablePersonalInfo; 24 | private JScrollPane jScrollPaneBasicInfo; 25 | private JButton jButtonSaveTheChange; 26 | private JLabel jLabelBasicInfo; 27 | private JPanel jPanelBasicInfo; 28 | 29 | public String getUserAccount() { 30 | return userAccount; 31 | } 32 | 33 | public void setUserAccount(String userAccount) { 34 | this.userAccount = userAccount; 35 | } 36 | 37 | public String getUserPassword() { 38 | return userPassword; 39 | } 40 | 41 | public void setUserPassword(String userPassword) { 42 | this.userPassword = userPassword; 43 | } 44 | 45 | public AdminBasicInfoPage() { 46 | 47 | this.setTitle("考勤系统管理员界面"); 48 | this.setLayout(new GridLayout(1, 1)); 49 | this.setBounds(600, 200, 720, 320); 50 | this.setLocationRelativeTo(null); 51 | //修改左上角Java图标 52 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 53 | ImageIcon imageIcon = new ImageIcon(imgURL); 54 | Image image = imageIcon.getImage(); 55 | this.setIconImage(image); 56 | 57 | try { 58 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 59 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 60 | UIManager.put("RootPane.setupButtonVisible", false); 61 | } catch(Exception e) { 62 | //TODO exception 63 | e.printStackTrace(); 64 | } 65 | 66 | jLabelBasicInfo = new JLabel("基本信息"); 67 | jPanelBasicInfo = new JPanel(); 68 | 69 | 70 | // jPanelBasicInfo.setPreferredSize(new Dimension(720, 280)); 71 | 72 | /** 73 | * 基本信息表格 74 | */ 75 | jTablePersonalInfo = new JTable(6, 2); 76 | //设置行宽 77 | jTablePersonalInfo.setRowHeight(30); 78 | //设置列宽 79 | jTablePersonalInfo.getColumnModel().getColumn(0).setPreferredWidth(200); 80 | jTablePersonalInfo.getColumnModel().getColumn(1).setPreferredWidth(400); 81 | //设置表头不可见 82 | jTablePersonalInfo.getTableHeader().setVisible(false); 83 | /** 84 | * 选课信息表格 调整到方法内 85 | */ 86 | 87 | 88 | jScrollPaneBasicInfo = new JScrollPane(jTablePersonalInfo); 89 | jScrollPaneBasicInfo.setPreferredSize(new Dimension(500,250)); 90 | 91 | 92 | 93 | jButtonSaveTheChange = new JButton("保存修改"); 94 | jButtonSaveTheChange.setBackground(Color.CYAN); 95 | jButtonSaveTheChange.setContentAreaFilled(true); 96 | jButtonSaveTheChange.setBorder(null); 97 | 98 | jPanelBasicInfo.add(jLabelBasicInfo); 99 | jPanelBasicInfo.add(jScrollPaneBasicInfo); 100 | jPanelBasicInfo.add(jButtonSaveTheChange); 101 | 102 | this.add(jPanelBasicInfo); 103 | 104 | this.setVisible(true); 105 | this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 106 | } 107 | 108 | 109 | //接收教师功能选择页面账户 110 | //接下来实现表的展示 111 | public void receTheAccountInfo(final AdminBasicInfoPage adminBasicInfoPage) { 112 | final String account = adminBasicInfoPage.getUserAccount(); 113 | final String pwd = adminBasicInfoPage.getUserPassword(); 114 | 115 | //测试传入参数 116 | System.out.println(account); 117 | System.out.println(pwd); 118 | 119 | /** 120 | * 个人基本信息 121 | */ 122 | try { 123 | //获取数据库此账号数据 124 | DB db = new DB(); 125 | ResultSet rs = null; 126 | 127 | rs = db.executeQuery("select * from admin where admin_id = '" + account + "'"); 128 | // 129 | System.out.println("select * from admin where admin_id = '" + account + "'"); 130 | 131 | if (rs.wasNull()) { 132 | System.out.println("获取数据失败为空!"); 133 | } else { 134 | /** 135 | * 接下来获取数据展示在表格中 136 | */ 137 | String attribute_id = null; 138 | String attribute_name = null; 139 | String attribute_sex = null; 140 | String attribute_position = null; 141 | String attribute_department = null; 142 | String loginpassword = null; 143 | 144 | rs.next(); 145 | 146 | attribute_id = rs.getString("admin_id"); 147 | attribute_name = rs.getString("admin_name"); 148 | attribute_sex = rs.getString("admin_sex"); 149 | attribute_position = rs.getString("admin_position"); 150 | attribute_department = rs.getString("admin_department"); 151 | loginpassword = rs.getString("admin_pwd"); 152 | 153 | System.out.println(attribute_id); 154 | System.out.println(attribute_name); 155 | System.out.println(attribute_sex); 156 | System.out.println(attribute_position); 157 | System.out.println(attribute_department); 158 | System.out.println(loginpassword); 159 | 160 | jTablePersonalInfo.setValueAt("职工号", 0, 0); 161 | jTablePersonalInfo.setValueAt("姓名", 1, 0); 162 | jTablePersonalInfo.setValueAt("性别", 2, 0); 163 | jTablePersonalInfo.setValueAt("职位", 3, 0); 164 | jTablePersonalInfo.setValueAt("部门", 4, 0); 165 | jTablePersonalInfo.setValueAt("密码", 5, 0); 166 | 167 | 168 | jTablePersonalInfo.setValueAt(attribute_id, 0, 1); 169 | jTablePersonalInfo.setValueAt(attribute_name, 1, 1); 170 | jTablePersonalInfo.setValueAt(attribute_sex, 2, 1); 171 | jTablePersonalInfo.setValueAt(attribute_position, 3, 1); 172 | jTablePersonalInfo.setValueAt(attribute_department, 4, 1); 173 | jTablePersonalInfo.setValueAt(loginpassword, 5, 1); 174 | 175 | } 176 | 177 | } catch(SQLException e) { 178 | e.printStackTrace(); 179 | } 180 | 181 | jButtonSaveTheChange.addActionListener(new ActionListener() { 182 | @Override 183 | public void actionPerformed(ActionEvent e) { 184 | int column = jTablePersonalInfo.getColumnCount(); 185 | int row = jTablePersonalInfo.getRowCount(); 186 | 187 | //测试 188 | System.out.println(row); 189 | 190 | //value数组存放表格中第二列的所有数据 191 | String[] value = new String[row]; 192 | // //测试 193 | // String str = jTablePersonalInfo.getValueAt(3, 1).toString(); 194 | // System.out.println(str); 195 | 196 | for (int i = 0; i < row; i++) { 197 | 198 | value[i] = jTablePersonalInfo.getValueAt(i, 1).toString(); 199 | System.out.println(value[i]); 200 | 201 | } 202 | 203 | //以下为数据库操作 204 | DB db = new DB(); 205 | 206 | db.executeUpdate("delete from admin where admin_id = '" + account + "'"); 207 | 208 | 209 | db.executeUpdate("insert into admin values(" + "'" + value[0] + "'" + "," + "'" + value[1]+ "'" + "," + 210 | "'" + value[2] + "'" + "," + "'" + value[3] + "'" + "," + "'" +value[4] + "'" + "," + "'" + 211 | value[5] + "'" + ")"); 212 | //测试SQL语句 213 | System.out.println("insert into admin values(" + "'" + value[0] + "'" + "," + "'" + value[1]+ "'" + "," + 214 | "'" + value[2] + "'" + "," + "'" + value[3] + "'" + "," + "'" +value[4] + "'" + "," + "'" + 215 | value[5] + "'" + ")"); 216 | 217 | 218 | System.out.println("操作已完成"); 219 | } 220 | }); 221 | 222 | 223 | } 224 | 225 | 226 | //单元测试 227 | public static void main(String[] args) { 228 | AdminBasicInfoPage adminBasicInfoPage = new AdminBasicInfoPage(); 229 | } 230 | } 231 | 232 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/AdminPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import org.eclipse.swt.SWT; 4 | import org.eclipse.swt.graphics.GC; 5 | import org.eclipse.swt.graphics.ImageData; 6 | import org.eclipse.swt.graphics.PaletteData; 7 | import org.eclipse.swt.graphics.RGB; 8 | import org.eclipse.swt.widgets.Display; 9 | import org.eclipse.swt.graphics.Image; 10 | import org.eclipse.swt.graphics.Rectangle; 11 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 12 | 13 | import javax.swing.*; 14 | import java.awt.*; 15 | import java.awt.event.MouseAdapter; 16 | import java.awt.event.MouseEvent; 17 | import java.net.URL; 18 | import java.awt.Graphics; 19 | import java.awt.Insets; 20 | import java.awt.image.BufferedImage; 21 | import java.awt.image.ColorModel; 22 | import java.awt.image.DirectColorModel; 23 | import java.awt.image.IndexColorModel; 24 | import java.awt.image.WritableRaster; 25 | 26 | 27 | /** 28 | * @Author: Cyan 29 | * @Date: 2019/5/20 8:10 30 | * 考勤入口 和基本信息修改入口 和考勤数据查看 与 特殊情况 如请假信息添加 31 | * java swing 只关闭当前窗体 不关闭其他窗体 32 | * https://blog.csdn.net/u012721519/article/details/51068993 33 | * 34 | * imageicon转image 35 | * Image image=icon.getImage(); 36 | * https://zhidao.baidu.com/question/54882399.html 37 | */ 38 | public class AdminPage extends JFrame{ 39 | 40 | // private JFrame jFrameAdmin; 41 | private JPanel jPanelAdmin; 42 | // private JPanel jPanelBasicInfo; 43 | // private JPanel jPanelAttendanceChecking; 44 | // private JPanel jPanelAttendanceData; 45 | private JLabel jLabelBasicInfo; 46 | private JLabel jLabelBasicInfoText; 47 | private JLabel jLabelDataManipulation; 48 | private JLabel jLabelDataManipulationText; 49 | private JLabel jLabelFaceUploading; 50 | private JLabel jLabelFaceUploadingText; 51 | private GridBagLayout gridBagLayout; 52 | private GridBagConstraints gridBagConstraints; 53 | private String userAccount; 54 | private String userPassword; 55 | private static String userType = "管理员"; 56 | 57 | 58 | public String getUserAccount() { 59 | return userAccount; 60 | } 61 | 62 | public void setUserAccount(String userAccount) { 63 | this.userAccount = userAccount; 64 | } 65 | 66 | public String getUserPassword() { 67 | return userPassword; 68 | } 69 | 70 | public void setUserPassword(String userPassword) { 71 | this.userPassword = userPassword; 72 | } 73 | 74 | public AdminPage() { 75 | // jFrameAdmin = new JFrame(); 76 | /**总面板*/ 77 | jPanelAdmin = new JPanel(); 78 | 79 | /**基本信息图标标签**/ 80 | jLabelBasicInfo = new JLabel(); 81 | jLabelBasicInfoText = new JLabel("管理员信息"); 82 | /**系统后台数据操作图标标签**/ 83 | jLabelDataManipulation = new JLabel(); 84 | jLabelDataManipulationText = new JLabel("系统数据管理"); 85 | /**人脸录入图标标签**/ 86 | jLabelFaceUploading = new JLabel(); 87 | jLabelFaceUploadingText = new JLabel("人脸信息录入"); 88 | 89 | /**网格包布局**/ 90 | gridBagLayout = new GridBagLayout(); 91 | gridBagConstraints = new GridBagConstraints(); 92 | 93 | //修改左上角Java图标 94 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 95 | ImageIcon imageIcon = new ImageIcon(imgURL); 96 | java.awt.Image image = imageIcon.getImage(); 97 | this.setIconImage(image); 98 | 99 | init(); 100 | 101 | 102 | } 103 | 104 | public void init() { 105 | this.setTitle("考勤系统管理员界面"); 106 | // jFrameTeacher.setLayout(null); 107 | // jFrameTeacher.setBounds(300, 200, 1200, 800); 108 | // jFrameTeacher.setLocationRelativeTo(null); 109 | // this.setAlwaysOnTop(true); 110 | // this.setUndecorated(false); 111 | this.getGraphicsConfiguration().getDevice().setFullScreenWindow(this); 112 | 113 | try { 114 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 115 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 116 | UIManager.put("RootPane.setupButtonVisible", false); 117 | } catch(Exception e) { 118 | //TODO exception 119 | e.printStackTrace(); 120 | } 121 | 122 | jPanelAdmin = new JPanel() { 123 | @Override 124 | protected void paintComponent(Graphics g) { 125 | super.paintComponent(g); 126 | 127 | try { 128 | /** 129 | * image如何创建对象 130 | * https://blog.csdn.net/u012723673/article/details/53326257 131 | */ 132 | // BufferedImage bufferedImage = ImageIO.read(new File("viewingImg/AdminPageBackground.png")); 133 | // ImageData imageData = new ImageData("AdminPageBackground.png"); 134 | // Display display = new Display(); 135 | // BufferedImage awtImage = convertToAWT(imageData); 136 | // Image swtImage = new Image(display, convertToSWT(awtImage)); 137 | URL imgURL = this.getClass().getResource("/viewingImg/AdminPageBackground.png"); 138 | ImageIcon imageIcon = new ImageIcon(imgURL); 139 | java.awt.Image image = imageIcon.getImage(); 140 | /** 141 | * 获取屏幕的高度与宽度(两种方式) 142 | * https://blog.csdn.net/jobfyz/article/details/78466171 143 | */ 144 | Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); 145 | int width = dimension.width; //1707px 146 | int height = dimension.height; //960px 147 | g.drawImage(image, 0, 0, width, height, this); 148 | } catch (Exception e) { 149 | e.getStackTrace(); 150 | } 151 | } 152 | }; 153 | 154 | //基本信息入口图标标签 155 | int iconwidth1 = 128; 156 | int iconheight1 = 128; 157 | 158 | URL imgURL1 = this.getClass().getResource("/viewingImg/basicinfo.png"); 159 | ImageIcon imageIcon1 = new ImageIcon(imgURL1); 160 | // ImageIcon imageIcon1; 161 | // imageIcon1 = new ImageIcon("viewingImg/基本信息.png"); 162 | java.awt.Image image1 = imageIcon1.getImage(); 163 | image1 = image1.getScaledInstance(iconwidth1, iconheight1, 1); 164 | imageIcon1.setImage(image1); 165 | jLabelBasicInfo.setIcon(imageIcon1); 166 | // jPanelBasicInfo.add(jLabelBasicInfo); 167 | // jPanelBasicInfo.setBounds(70, 200, iconwidth1, iconheight1); 168 | 169 | 170 | //系统数据管理入口图标标签 171 | int iconwidth2 = 160; 172 | int iconheight2 = 160; 173 | URL imgURL2 = this.getClass().getResource("/viewingImg/data.png"); 174 | ImageIcon imageIcon2 = new ImageIcon(imgURL2); 175 | // ImageIcon imageIcon2; 176 | // imageIcon2 = new ImageIcon("viewingImg/数据.png"); 177 | java.awt.Image image2 = imageIcon1.getImage(); 178 | image2 = image2.getScaledInstance(iconwidth1, iconheight1, 1); 179 | imageIcon1.setImage(image2); 180 | jLabelDataManipulation.setIcon(imageIcon2); 181 | // jPanelAttendanceChecking.add(jLabelAttendanceChecking); 182 | // jPanelAttendanceChecking.setBounds(400, 200, iconwidth2, iconheight2); 183 | 184 | //人脸录入入口图标标签 185 | int iconwidth3 = 128; 186 | int iconheight3 = 128; 187 | 188 | URL imgURL3 = this.getClass().getResource("/viewingImg/face.png"); 189 | ImageIcon imageIcon3 = new ImageIcon(imgURL3); 190 | // ImageIcon imageIcon3; 191 | // imageIcon3 = new ImageIcon("viewingImg/人脸.png"); 192 | java.awt.Image image3 = imageIcon1.getImage(); 193 | image3 = image3.getScaledInstance(iconwidth1, iconheight1, 1); 194 | imageIcon1.setImage(image3); 195 | jLabelFaceUploading.setIcon(imageIcon3); 196 | // jPanelAttendanceData.add(jLabelAttendanceData); 197 | // jPanelAttendanceData.setBounds(800, 200, iconwidth3, iconheight3); 198 | 199 | 200 | /** 201 | * 文字标签 202 | */ 203 | Color color = new Color(191, 173, 111); 204 | jLabelBasicInfoText.setFont(new Font("微软雅黑", Font.BOLD, 24)); 205 | jLabelBasicInfoText.setForeground(color); 206 | jLabelDataManipulationText.setFont(new Font("微软雅黑", Font.BOLD, 24)); 207 | jLabelDataManipulationText.setForeground(color); 208 | jLabelFaceUploadingText.setFont(new Font("微软雅黑", Font.BOLD, 24)); 209 | jLabelFaceUploadingText.setForeground(color); 210 | 211 | 212 | 213 | /** 214 | * 给系统数据管理图标标签添加监听事件 215 | * 如何javaSwing关闭子窗口不关闭父窗口 216 | * http://www.cnblogs.com/hualidezhuanshen/p/5433572.html 217 | * 给系统数据管理图标标签添加鼠标监听事件 218 | * https://blog.csdn.net/xuqimm/article/details/71170300 219 | */ 220 | jLabelDataManipulation.addMouseListener(new MouseAdapter() { 221 | @Override 222 | public void mouseClicked(MouseEvent e) { 223 | super.mouseClicked(e); 224 | 225 | AdminDataManipulationPage adminDataManipulationPage = new AdminDataManipulationPage(); 226 | } 227 | /** 228 | * 图标变换 229 | * 鼠标点击 230 | * 鼠标进入 231 | * 鼠标离开 232 | */ 233 | @Override 234 | public void mousePressed(MouseEvent e) { 235 | super.mousePressed(e); 236 | } 237 | 238 | @Override 239 | public void mouseEntered(MouseEvent e) { 240 | super.mouseEntered(e); 241 | } 242 | 243 | @Override 244 | public void mouseExited(MouseEvent e) { 245 | super.mouseExited(e); 246 | } 247 | }); 248 | 249 | 250 | jLabelDataManipulationText.addMouseListener(new MouseAdapter() { 251 | @Override 252 | public void mouseClicked(MouseEvent e) { 253 | super.mouseClicked(e); 254 | 255 | AdminDataManipulationPage adminDataManipulationPage = new AdminDataManipulationPage(); 256 | } 257 | 258 | @Override 259 | public void mousePressed(MouseEvent e) { 260 | super.mousePressed(e); 261 | } 262 | 263 | @Override 264 | public void mouseEntered(MouseEvent e) { 265 | super.mouseEntered(e); 266 | } 267 | 268 | @Override 269 | public void mouseExited(MouseEvent e) { 270 | super.mouseExited(e); 271 | } 272 | }); 273 | 274 | 275 | /** 276 | * 管理员基本信息图标标签和文字标签添加鼠标监听事件 277 | */ 278 | jLabelBasicInfo.addMouseListener(new MouseAdapter() { 279 | @Override 280 | public void mouseClicked(MouseEvent e) { 281 | super.mouseClicked(e); 282 | 283 | AdminBasicInfoPage adminBasicInfoPage = new AdminBasicInfoPage(); 284 | String account = getUserAccount(); 285 | String pwd = getUserPassword(); 286 | 287 | adminBasicInfoPage.setUserAccount(account); 288 | adminBasicInfoPage.setUserPassword(pwd); 289 | 290 | adminBasicInfoPage.receTheAccountInfo(adminBasicInfoPage); 291 | 292 | } 293 | 294 | @Override 295 | public void mousePressed(MouseEvent e) { 296 | super.mousePressed(e); 297 | } 298 | 299 | @Override 300 | public void mouseEntered(MouseEvent e) { 301 | super.mouseEntered(e); 302 | } 303 | 304 | @Override 305 | public void mouseExited(MouseEvent e) { 306 | super.mouseExited(e); 307 | } 308 | }); 309 | 310 | jLabelBasicInfoText.addMouseListener(new MouseAdapter() { 311 | @Override 312 | public void mouseClicked(MouseEvent e) { 313 | super.mouseClicked(e); 314 | 315 | AdminBasicInfoPage adminBasicInfoPage = new AdminBasicInfoPage(); 316 | String account = getUserAccount(); 317 | String pwd = getUserPassword(); 318 | 319 | adminBasicInfoPage.setUserAccount(account); 320 | adminBasicInfoPage.setUserPassword(pwd); 321 | 322 | adminBasicInfoPage.receTheAccountInfo(adminBasicInfoPage); 323 | } 324 | 325 | @Override 326 | public void mousePressed(MouseEvent e) { 327 | super.mousePressed(e); 328 | } 329 | 330 | @Override 331 | public void mouseEntered(MouseEvent e) { 332 | super.mouseEntered(e); 333 | } 334 | 335 | @Override 336 | public void mouseExited(MouseEvent e) { 337 | super.mouseExited(e); 338 | } 339 | }); 340 | 341 | /** 342 | * 考勤后台数据图标标签和文字标签添加鼠标监听事件 343 | */ 344 | jLabelFaceUploading.addMouseListener(new MouseAdapter() { 345 | @Override 346 | public void mouseClicked(MouseEvent e) { 347 | super.mouseClicked(e); 348 | 349 | FaceUploadingPage faceUploadingPage = new FaceUploadingPage(); 350 | } 351 | 352 | @Override 353 | public void mousePressed(MouseEvent e) { 354 | super.mousePressed(e); 355 | } 356 | 357 | @Override 358 | public void mouseEntered(MouseEvent e) { 359 | super.mouseEntered(e); 360 | } 361 | 362 | @Override 363 | public void mouseExited(MouseEvent e) { 364 | super.mouseExited(e); 365 | } 366 | }); 367 | 368 | jLabelFaceUploadingText.addMouseListener(new MouseAdapter() { 369 | @Override 370 | public void mouseClicked(MouseEvent e) { 371 | super.mouseClicked(e); 372 | 373 | FaceUploadingPage faceUploadingPage = new FaceUploadingPage(); 374 | } 375 | 376 | @Override 377 | public void mousePressed(MouseEvent e) { 378 | super.mousePressed(e); 379 | } 380 | 381 | @Override 382 | public void mouseEntered(MouseEvent e) { 383 | super.mouseEntered(e); 384 | } 385 | 386 | @Override 387 | public void mouseExited(MouseEvent e) { 388 | super.mouseExited(e); 389 | } 390 | }); 391 | 392 | 393 | /** 394 | * 设置JPanelTeacher 395 | * 为网格包布局 396 | */ 397 | jPanelAdmin.setOpaque(false); 398 | jPanelAdmin.setLayout(gridBagLayout); 399 | 400 | /** 401 | * 接下来设置各组件以适应网格包布局 402 | */ 403 | //基本信息入口标签显示 404 | gridBagConstraints = new GridBagConstraints(0, 0, 6, 3, 0, 0, 405 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 100, 0, 120 ),0, 0); 406 | gridBagLayout.setConstraints(jLabelBasicInfo, gridBagConstraints); 407 | jPanelAdmin.add(jLabelBasicInfo); 408 | 409 | //考勤入口标签显示 410 | gridBagConstraints = new GridBagConstraints(12, 0, 6, 3, 0, 0, 411 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 120, 0, 120 ),0, 0); 412 | gridBagLayout.setConstraints(jLabelDataManipulation, gridBagConstraints); 413 | jPanelAdmin.add(jLabelDataManipulation); 414 | 415 | //考勤后台数据标签显示 416 | gridBagConstraints = new GridBagConstraints(24, 0, 6, 3, 0, 0, 417 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 120, 0, 100 ),0, 0); 418 | gridBagLayout.setConstraints(jLabelFaceUploading, gridBagConstraints); 419 | jPanelAdmin.add(jLabelFaceUploading); 420 | 421 | //基本信息文字内容标签内容 422 | gridBagConstraints = new GridBagConstraints(0, 6, 6, 2, 0, 0, 423 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 100, 120, 120 ),0, 0); 424 | gridBagLayout.setConstraints(jLabelBasicInfoText, gridBagConstraints); 425 | jPanelAdmin.add(jLabelBasicInfoText); 426 | 427 | //考勤入口文字内容标签内容 428 | gridBagConstraints = new GridBagConstraints(12, 6, 6, 2, 0, 0, 429 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 120, 120, 120 ),0, 0); 430 | gridBagLayout.setConstraints(jLabelDataManipulationText, gridBagConstraints); 431 | jPanelAdmin.add(jLabelDataManipulationText); 432 | 433 | //考勤数据文字内容标签内容 434 | gridBagConstraints = new GridBagConstraints(24, 6, 6, 2, 0, 0, 435 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 120, 120, 100 ),0, 0); 436 | gridBagLayout.setConstraints(jLabelFaceUploadingText, gridBagConstraints); 437 | jPanelAdmin.add(jLabelFaceUploadingText); 438 | 439 | 440 | this.add(jPanelAdmin); 441 | } 442 | 443 | 444 | 445 | 446 | public void showFrameAdmin() { 447 | this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 448 | this.setVisible(true); 449 | } 450 | 451 | private static GridBagConstraints getGridBagConstraints(int gridx, int gridy, int gridwidth, 452 | int gridheight, double weightx, double weighty, 453 | int anchor, int fill, Insets insets, int ipadx, 454 | int ipady) { 455 | return new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, 456 | fill, insets, ipadx, ipady); 457 | } 458 | 459 | /** 460 | * 461 | * @param data 462 | * @return 463 | */ 464 | public static BufferedImage convertToAWT(ImageData data) { 465 | ColorModel colorModel = null; 466 | PaletteData palette = data.palette; 467 | if (palette.isDirect) { 468 | colorModel = new DirectColorModel(data.depth, palette.redMask, 469 | palette.greenMask, palette.blueMask); 470 | BufferedImage bufferedImage = new BufferedImage(colorModel, 471 | colorModel.createCompatibleWritableRaster(data.width, 472 | data.height), false, null); 473 | WritableRaster raster = bufferedImage.getRaster(); 474 | int[] pixelArray = new int[3]; 475 | for (int y = 0; y < data.height; y++) { 476 | for (int x = 0; x < data.width; x++) { 477 | int pixel = data.getPixel(x, y); 478 | RGB rgb = palette.getRGB(pixel); 479 | pixelArray[0] = rgb.red; 480 | pixelArray[1] = rgb.green; 481 | pixelArray[2] = rgb.blue; 482 | raster.setPixels(x, y, 1, 1, pixelArray); 483 | } 484 | } 485 | return bufferedImage; 486 | } else { 487 | RGB[] rgbs = palette.getRGBs(); 488 | byte[] red = new byte[rgbs.length]; 489 | byte[] green = new byte[rgbs.length]; 490 | byte[] blue = new byte[rgbs.length]; 491 | for (int i = 0; i < rgbs.length; i++) { 492 | RGB rgb = rgbs[i]; 493 | red[i] = (byte) rgb.red; 494 | green[i] = (byte) rgb.green; 495 | blue[i] = (byte) rgb.blue; 496 | } 497 | if (data.transparentPixel != -1) { 498 | colorModel = new IndexColorModel(data.depth, rgbs.length, red, 499 | green, blue, data.transparentPixel); 500 | } else { 501 | colorModel = new IndexColorModel(data.depth, rgbs.length, red, 502 | green, blue); 503 | } 504 | BufferedImage bufferedImage = new BufferedImage(colorModel, 505 | colorModel.createCompatibleWritableRaster(data.width, 506 | data.height), false, null); 507 | WritableRaster raster = bufferedImage.getRaster(); 508 | int[] pixelArray = new int[1]; 509 | for (int y = 0; y < data.height; y++) { 510 | for (int x = 0; x < data.width; x++) { 511 | int pixel = data.getPixel(x, y); 512 | pixelArray[0] = pixel; 513 | raster.setPixel(x, y, pixelArray); 514 | } 515 | } 516 | return bufferedImage; 517 | } 518 | } 519 | 520 | /** 521 | * 522 | * @param bufferedImage 523 | * @return 524 | */ 525 | static ImageData convertToSWT(BufferedImage bufferedImage) { 526 | if (bufferedImage.getColorModel() instanceof DirectColorModel) { 527 | DirectColorModel colorModel = (DirectColorModel) bufferedImage 528 | .getColorModel(); 529 | PaletteData palette = new PaletteData(colorModel.getRedMask(), 530 | colorModel.getGreenMask(), colorModel.getBlueMask()); 531 | ImageData data = new ImageData(bufferedImage.getWidth(), 532 | bufferedImage.getHeight(), colorModel.getPixelSize(), 533 | palette); 534 | WritableRaster raster = bufferedImage.getRaster(); 535 | int[] pixelArray = new int[3]; 536 | for (int y = 0; y < data.height; y++) { 537 | for (int x = 0; x < data.width; x++) { 538 | raster.getPixel(x, y, pixelArray); 539 | int pixel = palette.getPixel(new RGB(pixelArray[0], 540 | pixelArray[1], pixelArray[2])); 541 | data.setPixel(x, y, pixel); 542 | } 543 | } 544 | return data; 545 | } else if (bufferedImage.getColorModel() instanceof IndexColorModel) { 546 | IndexColorModel colorModel = (IndexColorModel) bufferedImage 547 | .getColorModel(); 548 | int size = colorModel.getMapSize(); 549 | byte[] reds = new byte[size]; 550 | byte[] greens = new byte[size]; 551 | byte[] blues = new byte[size]; 552 | colorModel.getReds(reds); 553 | colorModel.getGreens(greens); 554 | colorModel.getBlues(blues); 555 | RGB[] rgbs = new RGB[size]; 556 | for (int i = 0; i < rgbs.length; i++) { 557 | rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, 558 | blues[i] & 0xFF); 559 | } 560 | PaletteData palette = new PaletteData(rgbs); 561 | ImageData data = new ImageData(bufferedImage.getWidth(), 562 | bufferedImage.getHeight(), colorModel.getPixelSize(), 563 | palette); 564 | data.transparentPixel = colorModel.getTransparentPixel(); 565 | WritableRaster raster = bufferedImage.getRaster(); 566 | int[] pixelArray = new int[1]; 567 | for (int y = 0; y < data.height; y++) { 568 | for (int x = 0; x < data.width; x++) { 569 | raster.getPixel(x, y, pixelArray); 570 | data.setPixel(x, y, pixelArray[0]); 571 | } 572 | } 573 | return data; 574 | } 575 | return null; 576 | } 577 | 578 | static ImageData createSampleImage(Display display) { 579 | Image image = new Image(display, 100, 100); 580 | Rectangle bounds = image.getBounds(); 581 | GC gc = new GC(image); 582 | gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE)); 583 | gc.fillRectangle(bounds); 584 | gc.setBackground(display.getSystemColor(SWT.COLOR_GREEN)); 585 | gc.fillOval(0, 0, bounds.width, bounds.height); 586 | gc.setForeground(display.getSystemColor(SWT.COLOR_RED)); 587 | gc.drawLine(0, 0, bounds.width, bounds.height); 588 | gc.drawLine(bounds.width, 0, 0, bounds.height); 589 | gc.dispose(); 590 | ImageData data = image.getImageData(); 591 | image.dispose(); 592 | return data; 593 | } 594 | 595 | public static void main(String[] args) { 596 | AdminPage adminPage = new AdminPage(); 597 | adminPage.showFrameAdmin(); 598 | } 599 | } 600 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/AttendanceCheckingDataPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import cn.cyan.util.DB; 4 | import cn.cyan.util.OpertareDBSets.OperateDB4; 5 | import jdk.nashorn.internal.ir.CatchNode; 6 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 7 | import javax.swing.*; 8 | import javax.swing.table.DefaultTableModel; 9 | import java.awt.*; 10 | import java.awt.event.*; 11 | import java.net.URL; 12 | import java.sql.ResultSet; 13 | import java.sql.SQLException; 14 | import java.util.ArrayList; 15 | import java.util.Vector; 16 | 17 | /** 18 | * @Author: Cyan 19 | * @Date: 2019/5/29 22:31 20 | */ 21 | public class AttendanceCheckingDataPage extends JFrame { 22 | 23 | private String userAccount; 24 | private String userPassword; 25 | private DefaultTableModel defaultTableModel; 26 | private JTable jTableAttendanceData; 27 | private JScrollPane jScrollPaneData; 28 | private JButton jButtonSaveTheChange; 29 | private JButton jButtonCheckAmount; 30 | private JPanel jPanelBasicInfo; 31 | private JComboBox jComboBoxselectcheckingtable; 32 | private JPanel jPaneljcombox; 33 | private JPanel jPanelTable; 34 | 35 | public String getUserAccount() { 36 | return userAccount; 37 | } 38 | 39 | public void setUserAccount(String userAccount) { 40 | this.userAccount = userAccount; 41 | } 42 | 43 | public String getUserPassword() { 44 | return userPassword; 45 | } 46 | 47 | public void setUserPassword(String userPassword) { 48 | this.userPassword = userPassword; 49 | } 50 | 51 | public AttendanceCheckingDataPage() { 52 | 53 | this.setTitle("考勤后台界面"); 54 | this.setLayout(new BorderLayout()); 55 | this.setBounds(600, 200, 800, 320); 56 | this.setLocationRelativeTo(null); 57 | //修改左上角Java图标 58 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 59 | ImageIcon imageIcon = new ImageIcon(imgURL); 60 | Image image = imageIcon.getImage(); 61 | this.setIconImage(image); 62 | 63 | try { 64 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 65 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 66 | } catch(Exception e) { 67 | //TODO exception 68 | e.printStackTrace(); 69 | } 70 | 71 | jPanelBasicInfo = new JPanel(); 72 | 73 | 74 | // jPanelBasicInfo.setPreferredSize(new Dimension(720, 280)); 75 | 76 | /** 77 | * 考勤数据表格 78 | */ 79 | // //取得数据库的考勤表的各行数据 80 | // Vector rowData = OperateDB4.getRows(); 81 | // //取得数据库的考勤表的表头数据 82 | // Vector columnNames = OperateDB4.getHead(); 83 | // 84 | // //新建表格 85 | // defaultTableModel = new DefaultTableModel(rowData, columnNames); 86 | // jTableAttendanceData = new JTable(defaultTableModel); 87 | // jScrollPaneData = new JScrollPane(jTableAttendanceData); 88 | jPaneljcombox = new JPanel(); 89 | jPanelTable = new JPanel(); 90 | 91 | jButtonSaveTheChange = new JButton("添加备注"); 92 | jButtonCheckAmount = new JButton("查看未考勤人数"); 93 | jButtonCheckAmount.setBorder(null); 94 | jButtonCheckAmount.setContentAreaFilled(true); 95 | jButtonCheckAmount.setFocusPainted(false); 96 | jPaneljcombox.add(jButtonCheckAmount); 97 | jButtonSaveTheChange.setContentAreaFilled(true); 98 | jButtonSaveTheChange.setBorder(null); 99 | 100 | //将面板和表格分别添加到窗体中 101 | // this.add(jScrollPaneData, BorderLayout.CENTER); 102 | this.add(jButtonSaveTheChange, BorderLayout.EAST); 103 | this.add(jPaneljcombox, BorderLayout.WEST); 104 | this.add(jPanelTable, BorderLayout.CENTER); 105 | 106 | this.setVisible(true); 107 | this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 108 | } 109 | 110 | 111 | //接收教师功能选择页面账户 112 | //接下来实现表的展示 113 | public void receTheAccountInfo(final AttendanceCheckingDataPage attendanceCheckingDataPage) { 114 | final String account = attendanceCheckingDataPage.getUserAccount(); 115 | final String pwd = attendanceCheckingDataPage.getUserPassword(); 116 | 117 | //测试传入参数 118 | System.out.println(account); 119 | System.out.println(pwd); 120 | 121 | 122 | /** 123 | * 通过数据库视图查登录教师所授课课程 124 | */ 125 | try { 126 | DB db = new DB(); 127 | ResultSet rs = null; 128 | int class_account = 0; 129 | ArrayList labels = new ArrayList(); 130 | 131 | rs = db.executeQuery("select class_id from view_selectcheckingclass where class_teacher_id = '" + account + "'"); 132 | if (rs.wasNull()) { 133 | System.out.println("获取数据失败为空!"); 134 | } else { 135 | while (rs.next()) { 136 | class_account++; 137 | String reslut = rs.getString("class_id"); 138 | labels.add(reslut); 139 | } 140 | } 141 | String[] strLabel = (String[]) labels.toArray(new String[0]); 142 | jComboBoxselectcheckingtable = new JComboBox(strLabel); 143 | jComboBoxselectcheckingtable.setEditable(false); 144 | jComboBoxselectcheckingtable.setSelectedIndex(0); 145 | jPaneljcombox.add(jComboBoxselectcheckingtable); 146 | 147 | /** 148 | * 设置默认的选项对应的考勤table 149 | */ 150 | final String defaultItem = jComboBoxselectcheckingtable.getSelectedItem().toString(); 151 | try { 152 | DB db2 = new DB(); 153 | ResultSet rs2 = null; 154 | 155 | System.out.println("here"); 156 | rs2 = db.executeQuery("select s_id, s_name, s_flag, s_lastcheck, s_remark from view_attendancechecking where s_classid = '" + defaultItem + "'"); 157 | // System.out.println("here"); 158 | if (rs2.wasNull()) { 159 | System.out.println("获取数据失败为空!"); 160 | } else { 161 | Vector columnName = new Vector();//字段名 162 | Vector> dataVector = new 163 | Vector>(); //存储所有数据,里面每个小的Vector是存单行的 164 | columnName.add("学生学号"); 165 | columnName.add("学生姓名"); 166 | columnName.add("签到签退标志"); 167 | columnName.add("最近一次考勤"); 168 | columnName.add("备注"); 169 | // System.out.println("here2"); 170 | 171 | try { 172 | while (rs2.next()) { 173 | Vector vec = new Vector();//就是这个存单行的,最后放到上面的大的Vector里面 174 | for (int i = 1; i <= 5; i++) { 175 | vec.add(rs2.getObject(i)); 176 | String test = rs2.getObject(i).toString(); 177 | System.out.println(test); 178 | } 179 | dataVector.add(vec); 180 | } 181 | defaultTableModel = new DefaultTableModel();//建立默认的JTable模型 182 | defaultTableModel.setDataVector(dataVector, columnName);//设定模型数据和字段 183 | jTableAttendanceData = new JTable(defaultTableModel); 184 | jScrollPaneData = new JScrollPane(jTableAttendanceData); 185 | 186 | jPanelTable.invalidate(); 187 | jPanelTable.removeAll(); 188 | jPanelTable.revalidate(); 189 | jPanelTable.add(jScrollPaneData); 190 | attendanceCheckingDataPage.add(jPanelTable, BorderLayout.CENTER); 191 | } catch (SQLException e1) { 192 | e1.printStackTrace(); 193 | } 194 | } 195 | } catch (SQLException e1) { 196 | e1.printStackTrace(); 197 | } 198 | 199 | 200 | } catch (SQLException e) { 201 | e.printStackTrace(); 202 | } 203 | 204 | /** 205 | * 下拉框事件处理 206 | * 根据课程调用视图查询该课程的选课学生生成考勤表 207 | * 根据不同课程重绘表格 208 | * 放borderlayout的center 209 | */ 210 | final Object[] objects = new Object[1]; 211 | jComboBoxselectcheckingtable.addItemListener(new ItemListener() { 212 | public void itemStateChanged(ItemEvent e) { 213 | 214 | //解决关于JComboBox触发事件总是执行两次的问题 215 | if (e.getStateChange() == ItemEvent.SELECTED) { 216 | String class_id = jComboBoxselectcheckingtable.getSelectedItem().toString(); 217 | objects[0] = class_id; 218 | //测试下拉框的选项内容 219 | System.out.println("选择的是" + class_id); 220 | System.out.println(objects[0].toString()); 221 | 222 | try { 223 | DB db = new DB(); 224 | ResultSet rs = null; 225 | 226 | System.out.println("here"); 227 | rs = db.executeQuery("select s_id, s_name, s_flag, s_lastcheck, s_remark from view_attendancechecking where s_classid = '" + class_id + "'"); 228 | // System.out.println("here"); 229 | if (rs.wasNull()) { 230 | System.out.println("获取数据失败为空!"); 231 | } else { 232 | Vector columnName = new Vector();//字段名 233 | Vector> dataVector = new 234 | Vector>(); //存储所有数据,里面每个小的Vector是存单行的 235 | columnName.add("学生学号"); 236 | columnName.add("学生姓名"); 237 | columnName.add("签到签退标志"); 238 | columnName.add("最近一次考勤"); 239 | columnName.add("备注"); 240 | // System.out.println("here2"); 241 | 242 | try { 243 | while (rs.next()) { 244 | Vector vec = new Vector();//就是这个存单行的,最后放到上面的大的Vector里面 245 | for (int i = 1; i <= 5; i++) { 246 | vec.add(rs.getObject(i)); 247 | String test = rs.getObject(i).toString(); 248 | System.out.println(test); 249 | } 250 | dataVector.add(vec); 251 | } 252 | defaultTableModel = new DefaultTableModel();//建立默认的JTable模型 253 | defaultTableModel.setDataVector(dataVector, columnName);//设定模型数据和字段 254 | jTableAttendanceData = new JTable(defaultTableModel); 255 | jScrollPaneData = new JScrollPane(jTableAttendanceData); 256 | 257 | jPanelTable.invalidate(); 258 | jPanelTable.removeAll(); 259 | jPanelTable.revalidate(); 260 | jPanelTable.add(jScrollPaneData); 261 | attendanceCheckingDataPage.add(jPanelTable, BorderLayout.CENTER); 262 | } catch (SQLException e1) { 263 | e1.printStackTrace(); 264 | } 265 | } 266 | } catch (SQLException e1) { 267 | e1.printStackTrace(); 268 | } 269 | 270 | } 271 | } 272 | 273 | }); 274 | 275 | /** 276 | * 添加备注也就是修改 277 | */ 278 | jButtonSaveTheChange.addActionListener(new ActionListener() { 279 | @Override 280 | public void actionPerformed(ActionEvent e) { 281 | int column = jTableAttendanceData.getColumnCount(); 282 | int row = jTableAttendanceData.getRowCount(); 283 | 284 | //value数组存放表格中的所有数据 285 | String[][] value = new String[row][column]; 286 | 287 | for (int i = 0; i < row; i++) { 288 | for (int j = 0; j < column; j++) { 289 | value[i][j] = jTableAttendanceData.getValueAt(i, j).toString(); 290 | } 291 | } 292 | 293 | //以下为数据库操作 294 | DB db = new DB(); 295 | 296 | // db.executeUpdate("delete from view_attendancechecking where s_classid =" + objects[0].toString()); 297 | 298 | for (int i = 0; i < row; i++) { 299 | db.executeUpdate("update student set " + 300 | "student_id = '" + value[i][0] + "'," + 301 | "student_name='" + value[i][1] + "'," + 302 | "student_flag='" + value[i][2] + "'," + 303 | "student_lastchecktime='" + value[i][3] + "'," + 304 | "student_remark='" + value[i][4] + "'" + " " + 305 | "where student_id='" + value[i][0] + "'"); 306 | // System.out.println("update student set " + 307 | // "student_id = '" + value[i][0] + "',"+ 308 | // "student_name='"+ value[i][1] + "',"+ 309 | // "student_flag='" + value[i][2]+ "',"+ 310 | // "student_lastchecktime='"+ value[i][3]+ "',"+ 311 | // "student_remark='" + value[i][4]+ "'"+ " " + 312 | // "where student_id='" + value[i][0] + "'"); 313 | } 314 | 315 | System.out.println("操作已完成"); 316 | } 317 | }); 318 | 319 | /** 320 | * 显示有多少人未签到 321 | */ 322 | jButtonCheckAmount.addActionListener(new ActionListener() { 323 | @Override 324 | public void actionPerformed(ActionEvent e) { 325 | try { 326 | DB db = new DB(); 327 | ResultSet rs = null; 328 | 329 | String class_id = jComboBoxselectcheckingtable.getSelectedItem().toString(); 330 | System.out.println("查看为考勤人数"); 331 | rs = db.executeQuery("select count(s_id) from view_attendancechecking where s_classid = '" + class_id + "' and s_flag = 0"); 332 | if (rs.wasNull()) { 333 | System.out.println("获取数据失败为空!"); 334 | } else { 335 | rs.next(); 336 | int student_count = rs.getInt("count(s_id)"); 337 | System.out.println("未考勤人数;" + student_count); 338 | JOptionPane.showMessageDialog(null, "未考勤人数 " + student_count); 339 | } 340 | } catch (SQLException e1) { 341 | e1.printStackTrace(); 342 | } 343 | } 344 | }); 345 | } 346 | 347 | 348 | //单元测试 349 | public static void main(String[] args) { 350 | new AttendanceCheckingDataPage(); 351 | } 352 | } 353 | 354 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/BasicInfoPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import cn.cyan.util.DB; 4 | import cn.cyan.util.OpertareDBSets.OperateDB; 5 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 6 | 7 | import javax.swing.*; 8 | import javax.swing.table.DefaultTableModel; 9 | import java.awt.*; 10 | import java.awt.event.ActionEvent; 11 | import java.awt.event.ActionListener; 12 | import java.net.URL; 13 | import java.util.Vector; 14 | 15 | /** 16 | * @Author: Cyan 17 | * @Date: 2019/5/27 21:21 18 | * @Reference: https://blog.csdn.net/without_scruple/article/details/78635864#commentBox 19 | */ 20 | public class BasicInfoPage extends JFrame { 21 | 22 | DefaultTableModel tableModel; //默认显示的表格 23 | JButton add, delete, exit, save; //各处理按钮 24 | JTable jTable; //表格 25 | JPanel jPanel; //增加信息的面板 26 | 27 | //构造函数 28 | public BasicInfoPage() { 29 | this.setBounds(500, 600, 800, 450); 30 | this.setTitle("基本信息界面"); 31 | this.setLayout(new BorderLayout()); 32 | this.setLocationRelativeTo(null); 33 | //修改左上角Java图标 34 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 35 | ImageIcon imageIcon = new ImageIcon(imgURL); 36 | Image image = imageIcon.getImage(); 37 | this.setIconImage(image); 38 | 39 | try { 40 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 41 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 42 | UIManager.put("RootPane.setupButtonVisible", false); 43 | } catch(Exception e) { 44 | //TODO exception 45 | e.printStackTrace(); 46 | } 47 | 48 | //新建各按钮组件 49 | add = new JButton("增加"); 50 | delete = new JButton("删除"); 51 | exit = new JButton("保存"); 52 | save = new JButton("退出"); 53 | 54 | jPanel = new JPanel(); 55 | jPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 56 | 57 | jPanel.add(add); 58 | jPanel.add(delete); 59 | jPanel.add(save); 60 | jPanel.add(exit); 61 | 62 | //取得数据库的学生表的各行数据 63 | Vector rowData = OperateDB.getRows(); 64 | //取得数据库的学生表的表头数据 65 | Vector columnNames = OperateDB.getHead(); 66 | 67 | 68 | //新建表格 69 | tableModel = new DefaultTableModel(rowData, columnNames); 70 | jTable = new JTable(tableModel); 71 | 72 | JScrollPane jScrollPane = new JScrollPane(jTable); 73 | 74 | //将面板和表格分别添加到窗体中 75 | this.add(jPanel, BorderLayout.NORTH); 76 | this.add(jScrollPane); 77 | 78 | 79 | } 80 | 81 | //事件处理 82 | public void myEvent(){ 83 | 84 | //增加 85 | add.addActionListener(new ActionListener() { 86 | @Override 87 | public void actionPerformed(ActionEvent e) { 88 | 89 | //增加一行空白区域 90 | tableModel.addRow(new Vector()); 91 | } 92 | }); 93 | 94 | //删除 95 | delete.addActionListener(new ActionListener() { 96 | @Override 97 | public void actionPerformed(ActionEvent e) { 98 | //删除指定行 99 | int rowcount = jTable.getSelectedRow(); 100 | 101 | if (rowcount >= 0) { 102 | tableModel.removeRow(rowcount); 103 | } 104 | } 105 | }); 106 | 107 | /** 108 | * 保存 109 | * 原表格数据全部删除 110 | * 新表格中数据全部获取 111 | * 重新写入原表格 112 | */ 113 | save.addActionListener(new ActionListener() { 114 | @Override 115 | public void actionPerformed(ActionEvent e) { 116 | int column = jTable.getColumnCount(); 117 | int row = jTable.getRowCount(); 118 | 119 | //value数组存放表格中的所有数据 120 | String[][] value = new String[row][column]; 121 | 122 | for (int i = 0; i < row; i++) { 123 | for (int j = 0; j < column; j++) { 124 | value[i][j] = jTable.getValueAt(i, j).toString(); 125 | } 126 | } 127 | 128 | //以下为数据库操作 129 | DB db = new DB(); 130 | 131 | db.executeUpdate("delete from 学生表"); 132 | 133 | for (int i = 0; i < row; i++) { 134 | db.executeUpdate("insert into 学生表(" + value[i][0] + "," + value[i][1] + "," + 135 | value[i][2] + "," + value[i][3] + "," + value[i][4] + ")"); 136 | } 137 | 138 | System.out.println("操作已完成"); 139 | 140 | } 141 | }); 142 | 143 | //退出 144 | exit.addActionListener(new ActionListener() { 145 | @Override 146 | public void actionPerformed(ActionEvent e) { 147 | 148 | System.exit(0); 149 | } 150 | }); 151 | } 152 | 153 | //测试函数 154 | public static void main(String[] args) { 155 | BasicInfoPage basicInfoPage = new BasicInfoPage(); 156 | basicInfoPage.setVisible(true); 157 | basicInfoPage.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/FaceUploadingPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import cn.cyan.facedao.FacebaiduRegister; 4 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 5 | 6 | import javax.swing.*; 7 | import java.awt.*; 8 | import java.awt.event.ActionEvent; 9 | import java.awt.event.ActionListener; 10 | import java.net.URL; 11 | 12 | /** 13 | * @Author: Cyan 14 | * @Date: 2019/5/30 22:41 15 | * 调用facedao里面的 16 | */ 17 | public class FaceUploadingPage extends JFrame { 18 | 19 | // 20 | private FacebaiduRegister facebaiduRegister; 21 | private JPanel jPanel; 22 | private JLabel jLabelStudentID; 23 | private JLabel jLabelStudentName; 24 | private JLabel jLabelFacePath; 25 | private JTextField jTextFieldStudentID; 26 | private JTextField jTextFieldStudentName; 27 | private JTextField jTextFieldFacePath; 28 | private JLabel jLabelSubmit; 29 | private JButton jButtonSubmit; 30 | 31 | public FaceUploadingPage() { 32 | //修改左上角Java图标 33 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 34 | ImageIcon imageIcon = new ImageIcon(imgURL); 35 | Image image = imageIcon.getImage(); 36 | this.setIconImage(image); 37 | 38 | try { 39 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 40 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 41 | UIManager.put("RootPane.setupButtonVisible", false); 42 | } catch(Exception e) { 43 | //TODO exception 44 | e.printStackTrace(); 45 | } 46 | facebaiduRegister = new FacebaiduRegister(); 47 | jPanel = new JPanel(new GridLayout(4,2)); 48 | 49 | jLabelStudentID = new JLabel("学生学号"); 50 | jLabelStudentName = new JLabel("学生姓名"); 51 | jLabelFacePath = new JLabel("人脸图片路径"); 52 | jTextFieldStudentID = new JTextField(); 53 | jTextFieldStudentName = new JTextField(); 54 | jTextFieldFacePath = new JTextField(); 55 | jLabelSubmit = new JLabel("确认信息无误后上传"); 56 | jButtonSubmit = new JButton("提交并上传"); 57 | 58 | jPanel.add(jLabelStudentID); 59 | jPanel.add(jTextFieldStudentID); 60 | jPanel.add(jLabelStudentName); 61 | jPanel.add(jTextFieldStudentName); 62 | jPanel.add(jLabelFacePath); 63 | jPanel.add(jTextFieldFacePath); 64 | jPanel.add(jLabelSubmit); 65 | jPanel.add(jButtonSubmit); 66 | 67 | 68 | this.setTitle("人脸信息录入界面"); 69 | this.setBounds(600, 200, 720, 320); 70 | this.setLocationRelativeTo(null); 71 | this.add(jPanel); 72 | this.setVisible(true); 73 | this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 74 | 75 | Event(); 76 | 77 | } 78 | 79 | public void Event() { 80 | jButtonSubmit.addActionListener(new ActionListener() { 81 | @Override 82 | public void actionPerformed(ActionEvent e) { 83 | String student_id = jTextFieldStudentID.getText(); 84 | String student_name = jTextFieldStudentName.getText(); 85 | String filePath = jTextFieldFacePath.getText(); 86 | 87 | //测试数据获取 88 | System.out.println(student_id); 89 | System.out.println(student_name); 90 | System.out.println(filePath); 91 | 92 | // if (student_id!=null&&student_name!=null&&filePath!=null) { 93 | // facebaiduRegister.uploadingFace(filePath, student_id, student_name); 94 | // } 95 | 96 | } 97 | }); 98 | } 99 | 100 | public static void main(String[] args) { 101 | FaceUploadingPage faceUploadingPage = new FaceUploadingPage(); 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/InitializingPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | /** 4 | * @Author: Cyan 5 | * @Date: 2019/5/19 22:39 6 | */ 7 | 8 | import javax.swing.*; 9 | import javax.swing.border.EmptyBorder; 10 | import java.awt.*; 11 | import java.awt.event.*; 12 | import java.net.URL; 13 | 14 | /** 15 | * 初始化页面 展示系统图片 logo 等信息 16 | * 用户选择 继续 或者 退出本系统 17 | * 总结null布局 和 setComponentZOrder()的使用方法 18 | * 19 | * 关于IntelliJ IDEA如何生成exe程序 20 | * https://blog.csdn.net/qq_29496057/article/details/53333419 21 | * 22 | * 生成jar包 生成可执行文件的图片无法显示问题 23 | * https://phl.iteye.com/blog/1990525 24 | * help me a lot 25 | */ 26 | public class InitializingPage extends JFrame { 27 | 28 | private static final long serialVersionUID = 1L; 29 | Point pressedPoint; 30 | 31 | public InitializingPage() { 32 | //设置窗口背景色 33 | this.getContentPane().setBackground(new Color(222, 221, 226)); 34 | //取消窗体修饰效果 35 | this.setUndecorated(true); 36 | //设置窗体透明度 37 | this.setOpacity(0.99f); 38 | 39 | //窗体使用绝对布局 40 | this.getContentPane().setLayout(null); 41 | //在后面用了 这里用 setBounds后没有效果 要在setBounds后面使用才有效果 42 | // //窗体居中 43 | // this.setLocationRelativeTo(null); 44 | //使窗体最顶层显示 45 | // this.setAlwaysOnTop(true); 46 | //修改左上角Java图标 47 | URL imgURLIcon = this.getClass().getResource("/viewingImg/titleicon.png"); 48 | ImageIcon imageIconIcon = new ImageIcon(imgURLIcon); 49 | Image image = imageIconIcon.getImage(); 50 | this.setIconImage(image); 51 | this.setTitle("人脸识别考勤系统"); 52 | 53 | 54 | 55 | JButton buttonExit = new JButton("退出"); 56 | JButton buttonContinue = new JButton("继续"); 57 | 58 | /** 59 | * 给退出button添加监听事件 60 | */ 61 | buttonExit.addActionListener(new ActionListener() { 62 | // @Override 63 | public void actionPerformed(ActionEvent e) { 64 | System.exit(0); 65 | } 66 | }); 67 | 68 | /** 69 | * 给继续button添加监听事件 70 | */ 71 | buttonContinue.addActionListener(new ActionListener() { 72 | // @Override 73 | public void actionPerformed(ActionEvent e) { 74 | // setVisible(false); 75 | //销毁或者设置窗体不可见 76 | dispose(); 77 | new LoginPage(); 78 | 79 | } 80 | }); 81 | 82 | buttonExit.setBounds(1080, 700, 70, 30); 83 | buttonContinue.setBounds(990, 700, 70, 30); 84 | buttonExit.setFont(new Font("微软雅黑", Font.BOLD, 15)); 85 | buttonContinue.setFont(new Font("微软雅黑", Font.BOLD, 15)); 86 | buttonExit.setForeground(Color.white); 87 | buttonContinue.setForeground(Color.white); 88 | /**如何设置按钮透明https://blog.csdn.net/xietansheng/article/details/74363221**/ 89 | buttonExit.setContentAreaFilled(false); 90 | buttonContinue.setContentAreaFilled(false); 91 | buttonExit.setFocusPainted(false); 92 | buttonContinue.setFocusPainted(false); 93 | 94 | 95 | 96 | 97 | this.add(buttonExit); 98 | this.add(buttonContinue); 99 | this.setComponentZOrder(buttonExit, 1); 100 | this.setComponentZOrder(buttonContinue, 2); 101 | 102 | JTextArea textArea = new JTextArea(); 103 | textArea.setBackground(null); 104 | //设置文本背景透明 105 | textArea.setOpaque(false); 106 | //移除焦点 107 | textArea.setEditable(false); 108 | 109 | textArea.setText("作者:\n" + "Cyan\n" + "日期:\n" + "2019年6月"); 110 | textArea.setFont(new Font("微软雅黑", Font.PLAIN, 15)); 111 | textArea.setBounds(50, 600, 160, 100); 112 | textArea.setForeground(Color.white); 113 | 114 | this.add(textArea); 115 | // this.getContentPane().add(textArea); 116 | this.setComponentZOrder(textArea, 3); 117 | 118 | /**人脸识别考勤系统**/ 119 | JTextField jTextField = new JTextField(); 120 | jTextField.setBackground(null); 121 | jTextField.setBorder(new EmptyBorder(0, 0, 0, 0)); //设置无边框 setBorder(null);这种可以,但是如果updateUI后会重新出新边框。 可以用setBorder(new EmptyBorder(0,0,0,0);来设置 122 | jTextField.setOpaque(false); 123 | jTextField.setEditable(false); 124 | jTextField.setForeground(Color.white); 125 | // jTextField.setEnabled(false); //设置以后字体颜色默认 不能设置自己颜色 126 | jTextField.setText("人脸识别考勤系统"); 127 | jTextField.setFont(new Font("微软雅黑", Font.BOLD, 88)); 128 | jTextField.setBounds(50, 36, 800, 200); 129 | 130 | 131 | this.add(jTextField); 132 | this.setComponentZOrder(jTextField, 4); 133 | 134 | 135 | //使用标签存放logo 136 | JLabel jLabelLogo = new JLabel(); 137 | //关于路径问题参考 https://blog.csdn.net/sinat_31719925/article/details/51604650 138 | //width 1159 height 745 139 | //viewingImg viewingImg/index6.png 140 | // ImageIcon imageIcon = new ImageIcon("src/viewingImg/index6.png");//cn/cyan/view/viewingImg/lisa01.jpg src/viewingImg/index6.png 141 | URL imgURL = this.getClass().getResource("/viewingImg/index6.png"); 142 | ImageIcon imageIcon = new ImageIcon(imgURL); 143 | System.out.println(imgURL); 144 | System.out.println(this.getClass().getResource("/viewingImg/index6.png")); 145 | jLabelLogo.setIcon(imageIcon); 146 | jLabelLogo.setBounds(0, 0, 1159, 740); 147 | jLabelLogo.setOpaque(false); 148 | 149 | //加载进 窗体 150 | // this.getContentPane().add(jLabelLogo); 151 | this.add(jLabelLogo); 152 | this.setComponentZOrder(jLabelLogo, 5); 153 | 154 | 155 | /** 156 | * 窗体鼠标移动事件 157 | */ 158 | this.addMouseListener(new MouseAdapter() { 159 | @Override 160 | //鼠标按下事件 161 | public void mousePressed(MouseEvent e) { 162 | //记录鼠标坐标 163 | pressedPoint = e.getPoint(); 164 | } 165 | }); 166 | 167 | this.addMouseMotionListener(new MouseMotionAdapter() { 168 | @Override 169 | //鼠标拖拽事件 170 | public void mouseDragged(MouseEvent e) { 171 | //获取当前坐标 172 | Point point = e.getPoint(); 173 | //获取窗体坐标 174 | Point locationpoint = getLocation(); 175 | 176 | int x = locationpoint.x + point.x - pressedPoint.x; 177 | int y = locationpoint.y + point.y - pressedPoint.y; 178 | //改变窗体位置 179 | setLocation(x, y); 180 | } 181 | }); 182 | 183 | 184 | this.setTitle(""); 185 | this.setBounds(240, 80, 1159, 740); 186 | this.setLocationRelativeTo(null); 187 | this.setVisible(true); 188 | this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 189 | } 190 | 191 | 192 | public static void main(String[] args) { 193 | new InitializingPage(); 194 | } 195 | 196 | } 197 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/LoginPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import cn.cyan.util.DB; 4 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 5 | 6 | import javax.swing.*; 7 | import java.awt.*; 8 | import java.awt.event.ActionEvent; 9 | import java.awt.event.ActionListener; 10 | import java.net.URL; 11 | import java.sql.ResultSet; 12 | import java.sql.SQLException; 13 | 14 | /** 15 | * @Author: Cyan 16 | * @Date: 2019/5/20 8:07 17 | * 界面跳转思路 http://tieba.baidu.com/p/6115593929 18 | * 主要是进入登陆后的界面 可以同一个框架jframe 添加不同的jpanel了 19 | */ 20 | public class LoginPage extends JFrame{ 21 | 22 | private String accountNumber; 23 | private String password; 24 | private String userType; 25 | private String user; 26 | private JFrame jFrameLogin; 27 | private JLabel jLabelAccountNumber; 28 | private JLabel jLabelPassword; 29 | private JLabel jLabelUserType; 30 | private JTextField jTextFieldAccountNumber; 31 | private JTextField jTextFieldPassword; 32 | private JRadioButton jRadioButtonStudent; 33 | private JRadioButton jRadioButtonTeacher; 34 | private JRadioButton jRadioButtonAdmin; 35 | private ButtonGroup buttonGroup;//必须要把单选框放入按钮组作用域中才能实现当选!! 36 | private JButton jButtonChangePassWord; 37 | private JButton jButtonLogin; 38 | private JButton jButtonExit; 39 | private GridBagLayout gridBagLayout; 40 | private GridBagConstraints gridBagConstraints; 41 | private JPanel jPanelLogin; 42 | 43 | 44 | public LoginPage() { 45 | // jFrameLogin = new JFrame(); 46 | jLabelAccountNumber = new JLabel(); 47 | jLabelPassword = new JLabel(); 48 | jLabelUserType = new JLabel(); 49 | jTextFieldAccountNumber = new JTextField(); 50 | jTextFieldPassword = new JTextField(); 51 | jRadioButtonStudent = new JRadioButton(); 52 | jRadioButtonTeacher = new JRadioButton(); 53 | jRadioButtonAdmin = new JRadioButton(); 54 | buttonGroup = new ButtonGroup(); 55 | jButtonChangePassWord = new JButton(); 56 | jButtonLogin = new JButton(); 57 | jButtonExit = new JButton(); 58 | gridBagLayout = new GridBagLayout(); 59 | gridBagConstraints = new GridBagConstraints(); 60 | 61 | init(); 62 | 63 | } 64 | 65 | public void init() { 66 | 67 | this.setTitle("登录"); 68 | //设置窗体最顶层显示 69 | // jFrameLogin.setAlwaysOnTop(true); 70 | 71 | //修改左上角Java图标 72 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 73 | ImageIcon imageIcon = new ImageIcon(imgURL); 74 | Image image = imageIcon.getImage(); 75 | this.setIconImage(image); 76 | 77 | try { 78 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 79 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 80 | UIManager.put("RootPane.setupButtonVisible", false); 81 | } catch(Exception e) { 82 | //TODO exception 83 | e.printStackTrace(); 84 | } 85 | 86 | /** 87 | * 重载jpanel的paintComponent(Graphics g)方法 88 | * 通过重载该方法,在JPanel的绘制阶段将指定图片绘制上去即可。 89 | * 由于背景是绘制出来的,因此不会对布局有任何影响。 90 | * https://www.jb51.net/article/128171.htm 91 | */ 92 | jPanelLogin = new JPanel() { 93 | @Override 94 | protected void paintComponent(Graphics g) { 95 | super.paintComponent(g); 96 | 97 | // ImageIcon imageIcon = new ImageIcon("viewingImg/LoginPageBackground.png"); 98 | try { 99 | /** 100 | * image如何创建对象 101 | * https://blog.csdn.net/u012723673/article/details/53326257 102 | */ 103 | // Image image = ImageIO.read(new File("viewingImg/LoginPageBackground.png")); 104 | // imageIcon.paintIcon(this, g, 0, 0); 105 | URL imgURL = this.getClass().getResource("/viewingImg/LoginPageBackground.png"); 106 | ImageIcon imageIcon = new ImageIcon(imgURL); 107 | Image image = imageIcon.getImage(); 108 | /** 109 | * 获取屏幕的高度与宽度(两种方式) 110 | * https://blog.csdn.net/jobfyz/article/details/78466171 111 | */ 112 | // GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); 113 | // Rectangle rectangle = graphicsEnvironment.getMaximumWindowBounds(); 114 | // int width = rectangle.width; 115 | // int height = rectangle.height; 116 | Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); 117 | int width = dimension.width; //1707px 118 | int height = dimension.height; //960px 119 | // System.out.println(width + " " + height); 120 | g.drawImage(image, 0, 0, width, height, this); 121 | } catch (Exception e) { 122 | e.getStackTrace(); 123 | } 124 | 125 | } 126 | }; 127 | 128 | jLabelAccountNumber.setText("账 号: "); 129 | jLabelPassword.setText("密 码: "); 130 | jLabelUserType.setText("用户类型:"); 131 | jLabelAccountNumber.setFont(new Font("微软雅黑", Font.BOLD, 16)); 132 | jLabelPassword.setFont(new Font("微软雅黑", Font.BOLD, 16)); 133 | jLabelUserType.setFont(new Font("微软雅黑", Font.BOLD, 16)); 134 | 135 | //设置文本域长度 136 | jTextFieldAccountNumber.setColumns(20); 137 | jTextFieldPassword.setColumns(20); 138 | 139 | jRadioButtonStudent.setText("学生"); 140 | jRadioButtonTeacher.setText("教师"); 141 | jRadioButtonAdmin.setText("管理员"); 142 | jRadioButtonStudent.setFont(new Font("微软雅黑", Font.BOLD, 16)); 143 | jRadioButtonTeacher.setFont(new Font("微软雅黑", Font.BOLD, 16)); 144 | jRadioButtonAdmin.setFont(new Font("微软雅黑", Font.BOLD, 16)); 145 | 146 | 147 | jButtonLogin.setText(""); 148 | jButtonChangePassWord.setText(""); 149 | jButtonExit.setText(""); 150 | jButtonLogin.setFont(new Font("微软雅黑", Font.BOLD, 12)); 151 | jButtonChangePassWord.setFont(new Font("微软雅黑", Font.BOLD, 12)); 152 | jButtonExit.setFont(new Font("微软雅黑", Font.BOLD, 12)); 153 | //设置按钮透明度和无边框 154 | //https://blog.csdn.net/u011393661/article/details/39587391 155 | jButtonLogin.setMargin(new Insets(0, 0, 0, 0)); 156 | jButtonLogin.setContentAreaFilled(false); //不绘制按钮底色 157 | jButtonLogin.setBorderPainted(false); //不绘制边框 158 | jButtonLogin.setFocusPainted(false);//不绘制焦点框 https://www.cnblogs.com/xinluwutu/p/5958659.html 159 | URL imgURL1 = this.getClass().getResource("/viewingImg/LoginOrigin.png"); 160 | // ImageIcon imageIcon1 = new ImageIcon(imgURL1); 161 | System.out.println(this.getClass().getResource("/viewingImg/LoginOrigin.png")); 162 | jButtonLogin.setIcon(new ImageIcon(imgURL1));//设置默认图片 163 | URL imgURL2 = this.getClass().getResource("/viewingImg/LoginRoll.png"); 164 | System.out.println(this.getClass().getResource("/viewingImg/LoginRoll.png")); 165 | jButtonLogin.setRolloverIcon(new ImageIcon(imgURL2));//设置鼠标经过图片 166 | URL imgURL3 = this.getClass().getResource("/viewingImg/LoginPressed.png"); 167 | System.out.println(this.getClass().getResource("/viewingImg/LoginPressed.png")); 168 | jButtonLogin.setPressedIcon(new ImageIcon(imgURL3));//设置鼠标按下图片 169 | 170 | jButtonExit.setMargin(new Insets(0, 0, 0, 0)); 171 | jButtonExit.setContentAreaFilled(false); //不绘制按钮底色 172 | jButtonExit.setBorderPainted(false); //不绘制边框 173 | jButtonExit.setFocusPainted(false);//不绘制焦点框 https://www.cnblogs.com/xinluwutu/p/5958659.html 174 | URL imgURL4 = this.getClass().getResource("/viewingImg/QuitOrigin.png"); 175 | jButtonExit.setIcon(new ImageIcon(imgURL4));//设置默认图片 176 | URL imgURL5 = this.getClass().getResource("/viewingImg/QuitRoll.png"); 177 | jButtonExit.setRolloverIcon(new ImageIcon(imgURL5));//设置鼠标经过图片 178 | URL imgURL6 = this.getClass().getResource("/viewingImg/QuitPressed.png"); 179 | jButtonExit.setPressedIcon(new ImageIcon(imgURL6));//设置鼠标按下图片 180 | 181 | jButtonChangePassWord.setMargin(new Insets(0, 0, 0, 0)); 182 | jButtonChangePassWord.setContentAreaFilled(false); //不绘制按钮底色 183 | jButtonChangePassWord.setBorderPainted(false); //不绘制边框 184 | jButtonChangePassWord.setFocusPainted(false);//不绘制焦点框 https://www.cnblogs.com/xinluwutu/p/5958659.html 185 | URL imgURL7 = this.getClass().getResource("/viewingImg/ChangePwdOrigin.png"); 186 | jButtonChangePassWord.setIcon(new ImageIcon(imgURL7));//设置默认图片 187 | URL imgURL8 = this.getClass().getResource("/viewingImg/ChangePwdRoll.png"); 188 | jButtonChangePassWord.setRolloverIcon(new ImageIcon(imgURL8));//设置鼠标经过图片 189 | URL imgURL9 = this.getClass().getResource("/viewingImg/ChangePwdPressed.png"); 190 | jButtonChangePassWord.setPressedIcon(new ImageIcon(imgURL9));//设置鼠标按下图片 191 | 192 | 193 | 194 | //设置jframe为全屏 195 | // this.setUndecorated(false); 196 | this.getGraphicsConfiguration().getDevice().setFullScreenWindow(this); 197 | 198 | // 设置jframe为透明 且使用gridbaglayout布局 199 | jPanelLogin.setOpaque(false); 200 | jPanelLogin.setLayout(gridBagLayout); 201 | 202 | //账号标签显示 203 | gridBagConstraints = new GridBagConstraints(0, 0, 1, 1, 0, 0, 204 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(10, 0, 10, 0 ),0, 0); 205 | gridBagLayout.setConstraints(jLabelAccountNumber, gridBagConstraints); 206 | jPanelLogin.add(jLabelAccountNumber); 207 | 208 | //账号文本框显示 209 | gridBagConstraints = new GridBagConstraints(1,0,1,1,0,0, 210 | GridBagConstraints.CENTER, GridBagConstraints.NONE,new Insets(10,0,10,0),100,0); 211 | gridBagLayout.setConstraints(jTextFieldAccountNumber, gridBagConstraints); 212 | jPanelLogin.add(jTextFieldAccountNumber); 213 | 214 | //密码标签显示 215 | gridBagConstraints = new GridBagConstraints(0,1,1,1,0,0, 216 | GridBagConstraints.CENTER, GridBagConstraints.NONE,new Insets(10,0,10,0),0,0); 217 | gridBagLayout.setConstraints(jLabelPassword, gridBagConstraints); 218 | jPanelLogin.add(jLabelPassword); 219 | 220 | //密码文本框显示 221 | gridBagConstraints = new GridBagConstraints(1,1,1,1,0,0, 222 | GridBagConstraints.CENTER, GridBagConstraints.NONE,new Insets(10,0,10,0),100,0); 223 | gridBagLayout.setConstraints(jTextFieldPassword, gridBagConstraints); 224 | jPanelLogin.add(jTextFieldPassword); 225 | 226 | //用户类型(权限)标签显示 227 | 228 | gridBagConstraints = new GridBagConstraints(0,2,1,1,0,0, 229 | GridBagConstraints.CENTER, GridBagConstraints.NONE,new Insets(10,0,10,0),0,0); 230 | gridBagLayout.setConstraints(jLabelUserType, gridBagConstraints); 231 | jPanelLogin.add(jLabelUserType); 232 | 233 | //用户类型单选框显示 234 | gridBagConstraints = new GridBagConstraints(1,2,1,1,0,0, 235 | GridBagConstraints.CENTER, GridBagConstraints.NONE,new Insets(10,0,10,0),100,0); 236 | final JPanel jPanelUserType = new JPanel(); 237 | //单选框按钮组透明(本身透明 外带jpanel透明) 238 | //https://bbs.csdn.net/topics/390790530 239 | jRadioButtonStudent.setOpaque(false); 240 | jRadioButtonTeacher.setOpaque(false); 241 | jRadioButtonAdmin.setOpaque(false); 242 | jRadioButtonStudent.setFocusPainted(false); 243 | jRadioButtonTeacher.setFocusPainted(false); 244 | jRadioButtonAdmin.setFocusPainted(false); 245 | buttonGroup.add(jRadioButtonStudent); 246 | buttonGroup.add(jRadioButtonTeacher); 247 | buttonGroup.add(jRadioButtonAdmin); 248 | jPanelUserType.add(jRadioButtonStudent); 249 | jPanelUserType.add(jRadioButtonTeacher); 250 | jPanelUserType.add(jRadioButtonAdmin); 251 | //单选框承载的组件jpanel背景透明 252 | jPanelUserType.setOpaque(false); 253 | gridBagLayout.setConstraints(jPanelUserType, gridBagConstraints); 254 | jPanelLogin.add(jPanelUserType); 255 | 256 | //修改密码显示 257 | gridBagConstraints = new GridBagConstraints(0,3,1,1,0,0, 258 | GridBagConstraints.CENTER, GridBagConstraints.NONE,new Insets(10,0,10,0),0,0); 259 | gridBagLayout.setConstraints(jButtonChangePassWord, gridBagConstraints); 260 | jPanelLogin.add(jButtonChangePassWord); 261 | jButtonChangePassWord.addActionListener(new ActionListener() { 262 | @Override 263 | public void actionPerformed(ActionEvent e) { 264 | accountNumber = jTextFieldAccountNumber.getText(); 265 | 266 | //获取单选框信息 267 | for (Component btn : jPanelUserType.getComponents()) { 268 | if (btn instanceof JRadioButton) { 269 | if (((JRadioButton)btn).isSelected()) { 270 | userType = ((JRadioButton) btn).getText(); 271 | System.out.println("测试: 用户选择的角色权限为: "+ userType); 272 | } 273 | } 274 | } 275 | 276 | password = jTextFieldPassword.getText(); 277 | 278 | 279 | /** 280 | * 测试用户类型是否选择 281 | */ 282 | Boolean flag = true; 283 | while (flag == true) { 284 | if (userType == null) { 285 | Object[] usertypes = {"学生", "教师", "管理员"}; 286 | int op = (int)JOptionPane.showOptionDialog(null, "选择用户类型", 287 | "提示输入", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE, null, usertypes, usertypes[0]); 288 | System.out.println("下标为" + op); 289 | 290 | //出口检测 291 | if (op >= 0) { 292 | flag = false; 293 | userType = (String)usertypes[op]; 294 | System.out.println("usertype is " + userType); 295 | } else { 296 | flag = true; 297 | } 298 | } else { //若不为空 299 | break; 300 | } 301 | } 302 | 303 | //测试 304 | System.out.println(accountNumber); 305 | System.out.println(userType); 306 | System.out.println(password); 307 | 308 | PasswordChangingPage passwordChangingPage = new PasswordChangingPage(); 309 | passwordChangingPage.setAcoountNumber(accountNumber); 310 | passwordChangingPage.setUserType(userType); 311 | passwordChangingPage.setPassword(password); 312 | passwordChangingPage.receDataFromLoginPage(passwordChangingPage); 313 | 314 | } 315 | }); 316 | 317 | //登录按钮显示 318 | gridBagConstraints = new GridBagConstraints(1,3,1,1,0,0, 319 | GridBagConstraints.CENTER, GridBagConstraints.NONE,new Insets(10,0,10,0),0,0); 320 | gridBagLayout.setConstraints(jButtonLogin, gridBagConstraints); 321 | jButtonLogin.addActionListener(new ActionListener() { 322 | @Override 323 | public void actionPerformed(ActionEvent e) { 324 | //获取账号文本域的数据 325 | accountNumber = jTextFieldAccountNumber.getText().toString(); 326 | System.out.println("测试: 用户输入的账号为: " + accountNumber); 327 | //获取密码文本域的数据 328 | password = jTextFieldPassword.getText(); 329 | System.out.println("测试: 用户输入的密码为: " + password); 330 | //获取单选框的数据信息 331 | for (Component btn : jPanelUserType.getComponents()) { 332 | if (btn instanceof JRadioButton) { 333 | if (((JRadioButton)btn).isSelected()) { 334 | userType = ((JRadioButton) btn).getText(); 335 | System.out.println("测试: 用户选择的角色权限为: "+ userType); 336 | } 337 | } 338 | } 339 | 340 | /** 341 | * 根据usertype修改user 342 | */ 343 | if (userType.equals("学生")) { 344 | user = "student"; 345 | } else if (userType.equals("教师")) { 346 | user = "teacher"; 347 | } else if (userType.equals("管理员")) { 348 | user = "admin"; 349 | } 350 | 351 | /** 352 | * 连接数据库 JDBC 353 | * 查询 是否存在此用户 和密码 角色编号 是否正确(数据库需要权限角色表) 354 | */ 355 | try { 356 | DB db = new DB(); 357 | ResultSet rs = null; 358 | rs = db.executeQuery("select * from " + user + " where " + user + "_id = '" + accountNumber + "'"); 359 | //测试语句 360 | System.out.println("select * from " + user + " where " + user + "_id = '" + accountNumber + "'"); 361 | 362 | //判断数据可查询返回结果是否为空 空即不存在此用户权限 363 | if (rs.wasNull()) { 364 | JOptionPane.showMessageDialog(null, "此用户权限不存在,请重新选择正确用户权限!"); 365 | } else { 366 | 367 | /** 368 | * 接下来判断密码是否正确 369 | */ 370 | rs.next(); 371 | String loginpwd = rs.getString(user +"_pwd"); 372 | 373 | if (loginpwd.equals(password)) { 374 | 375 | /** 376 | * 假设存在此用户 及 密码 角色数据对的上号 377 | * 学生界面创建StudentPage对象 378 | * 管理员同样创建AdminPage对象 379 | * 而教师进入教师TeacherPage页面后再打开三种界面 教师基本信息 考勤界面 考勤后台数据查看界面 380 | */ 381 | if (userType.equals("学生")) { 382 | // jFrameLogin.dispose(); 383 | StudentPage studentPage = new StudentPage(); 384 | studentPage.setUserAccount(accountNumber); 385 | studentPage.setUserPassword(password); 386 | studentPage.showTheData(studentPage); 387 | } else if (userType.equals("教师")) { 388 | // jFrameLogin.dispose(); 389 | TeacherPage teacherPage = new TeacherPage(); 390 | teacherPage.setUserAccount(accountNumber); 391 | teacherPage.setUserPassword(password); 392 | teacherPage.showFrameTeacher(); 393 | } else if (userType.equals("管理员")) { 394 | // jFrameLogin.dispose(); 395 | AdminPage adminPage = new AdminPage(); 396 | adminPage.setUserAccount(accountNumber); 397 | adminPage.setUserPassword(password); 398 | adminPage.showFrameAdmin(); 399 | } else { 400 | JOptionPane.showMessageDialog(null, "账户不存在,或者密码错误,或者权限不匹配,请重新输入并再尝试登录"); 401 | } 402 | } else { 403 | JOptionPane.showMessageDialog(null, "密码或账号错误,请确保您的输入无误再尝试登录"); 404 | } 405 | } 406 | } catch (SQLException e1) { 407 | JOptionPane.showMessageDialog(null, "账户不存在,或者密码错误,或者权限不匹配,请重新输入并再尝试登录"); 408 | e1.printStackTrace(); 409 | } 410 | 411 | 412 | 413 | 414 | } 415 | }); 416 | jPanelLogin.add(jButtonLogin); 417 | 418 | //退出按钮显示 419 | gridBagConstraints = getGridBagConstraints(2, 3, 1, 1, 0, 0, 420 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(10, 0, 10, 0), 0, 0); 421 | gridBagLayout.setConstraints(jButtonExit, gridBagConstraints); 422 | jButtonExit.addActionListener(new ActionListener() { 423 | @Override 424 | public void actionPerformed(ActionEvent e) { 425 | System.exit(0); 426 | } 427 | }); 428 | jPanelLogin.add(jButtonExit); 429 | 430 | 431 | //添加面板到框架 432 | this.add(jPanelLogin); 433 | this.setVisible(true); 434 | this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 435 | 436 | } 437 | 438 | private static GridBagConstraints getGridBagConstraints(int gridx, int gridy, int gridwidth, 439 | int gridheight, double weightx, double weighty, 440 | int anchor, int fill, Insets insets, int ipadx, 441 | int ipady) { 442 | return new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, 443 | fill, insets, ipadx, ipady); 444 | } 445 | 446 | public void showFrameLogin() { 447 | this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 448 | this.setVisible(true); 449 | } 450 | 451 | public static void main(String[] args) { 452 | LoginPage loginPage = new LoginPage(); 453 | // loginPage.showFrameLogin(); 454 | 455 | } 456 | } 457 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/PasswordChangingPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import cn.cyan.util.DB; 4 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 5 | 6 | import javax.swing.*; 7 | import java.awt.*; 8 | import java.awt.event.ActionEvent; 9 | import java.awt.event.ActionListener; 10 | import java.net.URL; 11 | import java.sql.ResultSet; 12 | import java.sql.SQLException; 13 | 14 | /** 15 | * @Author: Cyan 16 | * @Date: 2019/6/1 8:49 17 | */ 18 | public class PasswordChangingPage extends JFrame { 19 | 20 | private JPanel jPanel; 21 | private JPanel jPanelNorth; 22 | private JPanel jPanelSouth; 23 | private JPanel jPanelWest; 24 | private JPanel jPanelEast; 25 | private JPanel jPanelCenter; 26 | private JLabel jLabelOldPwd; 27 | private JLabel jLabelNewPwd; 28 | private JLabel jLabelEnsurePwd; 29 | private JTextField jTextFieldOldPwd; 30 | private JTextField jTextFieldNewPwd; 31 | private JTextField jTextFieldEnsurePwd; 32 | private String acoountNumber; 33 | private String userType; 34 | private String password; 35 | private JButton jButtonMakeSure; 36 | private JButton jButtonSubmitChange; 37 | 38 | public String getPassword() { 39 | return password; 40 | } 41 | 42 | public void setPassword(String password) { 43 | this.password = password; 44 | } 45 | 46 | 47 | 48 | public PasswordChangingPage() { 49 | 50 | this.setTitle("修改密码"); 51 | this.setBounds(600, 200, 420, 360); 52 | this.setLocationRelativeTo(null); 53 | //修改左上角Java图标 54 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 55 | ImageIcon imageIcon = new ImageIcon(imgURL); 56 | Image image = imageIcon.getImage(); 57 | this.setIconImage(image); 58 | 59 | try { 60 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 61 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 62 | UIManager.put("RootPane.setupButtonVisible", false); 63 | } catch(Exception e) { 64 | //TODO exception 65 | e.printStackTrace(); 66 | } 67 | 68 | jPanel = new JPanel(new BorderLayout()); 69 | jPanelNorth = new JPanel(); 70 | jPanelSouth = new JPanel(); 71 | jPanelWest = new JPanel(new GridLayout(3, 1, 0, 80)); 72 | jPanelEast = new JPanel(); 73 | jPanelCenter = new JPanel(new GridLayout(3, 1, 0, 80)); 74 | jLabelOldPwd = new JLabel("旧密码"); 75 | jLabelNewPwd = new JLabel("新密码"); 76 | jLabelEnsurePwd = new JLabel("确认密码"); 77 | jTextFieldOldPwd = new JTextField(); 78 | jTextFieldNewPwd = new JTextField(); 79 | jTextFieldEnsurePwd = new JTextField(); 80 | jButtonMakeSure = new JButton("确认"); 81 | jButtonSubmitChange = new JButton("提交"); 82 | 83 | jPanelCenter.add(jTextFieldOldPwd); 84 | jPanelCenter.add(jTextFieldNewPwd); 85 | jPanelCenter.add(jTextFieldEnsurePwd); 86 | 87 | jPanelWest.add(jLabelOldPwd); 88 | jPanelWest.add(jLabelNewPwd); 89 | jPanelWest.add(jLabelEnsurePwd); 90 | 91 | jPanelSouth.add(jButtonMakeSure); 92 | jPanelSouth.add(jButtonSubmitChange); 93 | 94 | jPanel.add(jPanelCenter, BorderLayout.CENTER); 95 | jPanel.add(jPanelWest, BorderLayout.WEST); 96 | jPanel.add(jPanelSouth, BorderLayout.SOUTH); 97 | 98 | 99 | this.add(jPanel); 100 | this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 101 | this.setVisible(true); 102 | 103 | } 104 | 105 | public String getAcoountNumber() { 106 | return acoountNumber; 107 | } 108 | 109 | public void setAcoountNumber(String acoountNumber) { 110 | this.acoountNumber = acoountNumber; 111 | } 112 | 113 | public String getUserType() { 114 | return userType; 115 | } 116 | 117 | public void setUserType(String userType) { 118 | this.userType = userType; 119 | } 120 | 121 | public void receDataFromLoginPage(PasswordChangingPage passwordChangingPage) { 122 | 123 | final String accountNumber = passwordChangingPage.getAcoountNumber(); 124 | final String password = passwordChangingPage.getPassword(); 125 | final String userType = passwordChangingPage.getUserType(); 126 | //测试 127 | System.out.println(accountNumber); 128 | System.out.println(password); 129 | System.out.println(userType); 130 | 131 | 132 | /** 133 | * 根据usertype修改user 134 | */ 135 | String user = null; 136 | if (userType.equals("学生")) { 137 | user = "student"; 138 | } else if (userType.equals("教师")) { 139 | user = "teacher"; 140 | } else if (userType.equals("管理员")) { 141 | user = "admin"; 142 | } 143 | final String usertype = user; 144 | 145 | jButtonMakeSure.addActionListener(new ActionListener() { 146 | @Override 147 | public void actionPerformed(ActionEvent e) { 148 | try { 149 | DB db = new DB(); 150 | ResultSet rs = null; 151 | rs = db.executeQuery("select * from " + usertype + " where " + usertype + "_id = '" + accountNumber + "'"); 152 | //测试语句 153 | System.out.println("select * from " + usertype + " where " + usertype + "_id = '" + accountNumber + "'"); 154 | 155 | //判断数据可查询返回结果是否为空 空即不存在此用户权限 156 | if (rs.wasNull()) { 157 | JOptionPane.showMessageDialog(null, "此用户权限不存在,请重新选择正确用户权限!"); 158 | } else { 159 | 160 | /** 161 | * 接下来判断密码是否正确 162 | */ 163 | rs.next(); 164 | String loginpwd = rs.getString(usertype + "_pwd"); 165 | 166 | if (loginpwd.equals(password)) { 167 | System.out.println("账户密码对应正确"); 168 | 169 | /** 170 | * 假设存在此用户 及 密码 角色数据对的上号 171 | * 172 | */ 173 | if (jTextFieldEnsurePwd.getText().equals(jTextFieldNewPwd.getText())) { 174 | System.out.println("两次输入新密码匹配"); 175 | JOptionPane.showMessageDialog(null,"两次输入的新密码匹配!"); 176 | 177 | if (userType.equals("学生")) { 178 | jButtonSubmitChange.addActionListener(new ActionListener() { 179 | @Override 180 | public void actionPerformed(ActionEvent e) { 181 | DB db = new DB(); 182 | db.executeUpdate("update student set student_pwd = '" + jTextFieldNewPwd.getText() + "' where student_id = '" + accountNumber + "'"); 183 | //测试语句 184 | System.out.println("update student set student_pwd = '" + jTextFieldNewPwd.getText() + "' where studnet_id = '" + accountNumber + "'"); 185 | } 186 | }); 187 | 188 | } else if (userType.equals("教师")) { 189 | 190 | jButtonSubmitChange.addActionListener(new ActionListener() { 191 | @Override 192 | public void actionPerformed(ActionEvent e) { 193 | DB db = new DB(); 194 | db.executeUpdate("update teacher set teacher_pwd = '" + jTextFieldNewPwd.getText() + "' where teacher_id = '" + accountNumber + "'"); 195 | //测试语句 196 | System.out.println("update teacher set teacher_pwd = '" + jTextFieldNewPwd.getText() + "' where teacher_id = '" + accountNumber + "'"); 197 | } 198 | }); 199 | } else if (userType.equals("管理员")) { 200 | 201 | jButtonSubmitChange.addActionListener(new ActionListener() { 202 | @Override 203 | public void actionPerformed(ActionEvent e) { 204 | DB db = new DB(); 205 | db.executeUpdate("update admin set admin_pwd = '" + jTextFieldNewPwd.getText() + "' where admin_id = '" + accountNumber + "'"); 206 | //测试语句 207 | System.out.println("update admin set admin_pwd = '" + jTextFieldNewPwd.getText() + "' where admin_id = '" + accountNumber + "'"); 208 | } 209 | }); 210 | } else { 211 | JOptionPane.showMessageDialog(null, "账户不存在,或者密码错误,或者权限不匹配,请重新输入并再尝试"); 212 | } 213 | } else { 214 | JOptionPane.showMessageDialog(null, "新密码有误!请再次确认输入的新密码!(两次不匹配)"); 215 | } 216 | } else { 217 | JOptionPane.showMessageDialog(null, "密码或账号错误,请确保您的输入无误再尝试登录"); 218 | } 219 | } 220 | 221 | } catch (SQLException e1) { 222 | JOptionPane.showMessageDialog(null, "账户不存在,或者密码错误,或者权限不匹配,请重新输入并再尝试登录"); 223 | e1.printStackTrace(); 224 | } 225 | } 226 | }); 227 | 228 | 229 | 230 | } 231 | 232 | public static void main(String[] args) { 233 | PasswordChangingPage passwordChangingPage = new PasswordChangingPage(); 234 | 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/StudentPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import cn.cyan.util.DB; 4 | import cn.cyan.util.OpertareDBSets.OperateDB2; 5 | import cn.cyan.util.OpertareDBSets.OperateDB3; 6 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 7 | 8 | import javax.swing.*; 9 | import javax.swing.table.DefaultTableModel; 10 | import java.awt.*; 11 | import java.awt.event.ActionEvent; 12 | import java.awt.event.ActionListener; 13 | import java.net.URL; 14 | import java.sql.ResultSet; 15 | import java.sql.SQLException; 16 | import java.util.Vector; 17 | 18 | /** 19 | * @Author: Cyan 20 | * @Date: 2019/5/20 8:10 21 | * 最初想法两个表格 一个基本信息表格 展示并且可以修改 22 | * 一个选课信息结果展示表格 只可查看不可修改 23 | * (学号不可修改 姓名一般也不可修改 性别 年龄 学院 专业 登录密码可以修改) 24 | */ 25 | public class StudentPage extends JFrame { 26 | 27 | private JPanel jPanelStudent; 28 | private static String userType = "学生"; 29 | private String userAccount; 30 | private String userPassword; 31 | private DefaultTableModel defaultTableModel; 32 | private JTable jTablePersonalInfo; 33 | private JTable jTableClasses; 34 | private JScrollPane jScrollPaneBasicInfo; 35 | private JScrollPane jScrollPaneClassesInfo; 36 | private JButton jButtonSaveTheChange; 37 | private JButton jButtonFaceRegister; 38 | private JButton jButtonCheckTheClasses; 39 | private JLabel jLabelBasicInfo; 40 | private JLabel jLabelClassesInfo; 41 | private JPanel jPanelBasicInfo; 42 | private JPanel jPanelClassesInfo; 43 | 44 | public String getUserAccount() { 45 | return userAccount; 46 | } 47 | 48 | public void setUserAccount(String userAccount) { 49 | this.userAccount = userAccount; 50 | } 51 | 52 | public String getUserPassword() { 53 | return userPassword; 54 | } 55 | 56 | public void setUserPassword(String userPassword) { 57 | this.userPassword = userPassword; 58 | } 59 | 60 | public StudentPage() { 61 | 62 | this.setTitle("考勤系统学生界面"); 63 | this.setLayout(new GridLayout(2, 1)); 64 | this.setBounds(600, 200, 800, 600); 65 | this.setLocationRelativeTo(null); 66 | 67 | //修改左上角Java图标 68 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 69 | System.out.println(this.getClass().getResource("/viewingImg/titleicon.png")); 70 | ImageIcon imageIcon = new ImageIcon(imgURL); 71 | Image image = imageIcon.getImage(); 72 | this.setIconImage(image); 73 | 74 | try { 75 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 76 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 77 | UIManager.put("RootPane.setupButtonVisible", false); 78 | } catch(Exception e) { 79 | //TODO exception 80 | e.printStackTrace(); 81 | } 82 | 83 | jLabelBasicInfo = new JLabel("基本信息"); 84 | jLabelClassesInfo = new JLabel("选课信息"); 85 | jPanelBasicInfo = new JPanel(); 86 | jPanelClassesInfo = new JPanel(); 87 | 88 | 89 | jPanelBasicInfo.setPreferredSize(new Dimension(800, 300)); 90 | jPanelClassesInfo.setPreferredSize(new Dimension(800, 300)); 91 | 92 | /** 93 | * 基本信息表格 94 | */ 95 | jTablePersonalInfo = new JTable(8, 2); 96 | //设置行宽 97 | jTablePersonalInfo.setRowHeight(30); 98 | //设置列宽 99 | jTablePersonalInfo.getColumnModel().getColumn(0).setPreferredWidth(200); 100 | jTablePersonalInfo.getColumnModel().getColumn(1).setPreferredWidth(400); 101 | //设置表头不可见 102 | jTablePersonalInfo.getTableHeader().setVisible(false); 103 | /** 104 | * 选课信息表格 调整到方法内 105 | */ 106 | 107 | 108 | jScrollPaneBasicInfo = new JScrollPane(jTablePersonalInfo); 109 | // jScrollPaneBasicInfo.setPreferredSize(new Dimension(500,360)); 110 | 111 | 112 | 113 | jButtonSaveTheChange = new JButton("保存修改"); 114 | jButtonSaveTheChange.setContentAreaFilled(true); 115 | jButtonSaveTheChange.setBorder(null); 116 | jButtonFaceRegister = new JButton("人脸注册"); 117 | jButtonFaceRegister.setContentAreaFilled(true); 118 | jButtonFaceRegister.setBorder(null); 119 | 120 | 121 | jPanelBasicInfo.add(jLabelBasicInfo); 122 | jPanelBasicInfo.add(jScrollPaneBasicInfo); 123 | jPanelBasicInfo.add(jButtonSaveTheChange); 124 | jPanelBasicInfo.add(jButtonFaceRegister); 125 | 126 | this.add(jPanelBasicInfo); 127 | 128 | 129 | 130 | //事件处理 131 | // showTheData(); 132 | 133 | this.setVisible(true); 134 | this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 135 | } 136 | 137 | public void showTheData(final StudentPage studentPage) { 138 | 139 | final String account = studentPage.getUserAccount(); 140 | //测试传值是否成功 141 | System.out.println("传入的账号为:" + account); 142 | 143 | 144 | /** 145 | * 个人基本信息 146 | */ 147 | try { 148 | //获取数据库此账号数据 149 | DB db = new DB(); 150 | ResultSet rs = null; 151 | 152 | rs = db.executeQuery("select * from student where student_id = '" + account + "'"); 153 | // 154 | System.out.println("select * from student where student_id = '" + account + "'"); 155 | 156 | if (rs.wasNull()) { 157 | System.out.println("获取数据失败为空!"); 158 | } else { 159 | /** 160 | * 接下来获取数据展示在表格中 161 | */ 162 | String attribute_id = null; 163 | String attribute_name = null; 164 | String attribute_sex = null; 165 | String attribute_age = null; 166 | String attribute_school = null; 167 | String attribute_major = null; 168 | String attribute_email = null; 169 | String attribute_phonenumber = null; 170 | String loginpassword = null; 171 | 172 | rs.next(); 173 | 174 | attribute_id = rs.getString("student_id"); 175 | attribute_name = rs.getString("student_name"); 176 | attribute_sex = rs.getString("student_sex"); 177 | attribute_age = rs.getString("student_age"); 178 | attribute_school = rs.getString("student_school"); 179 | attribute_major = rs.getString("student_major"); 180 | attribute_email = rs.getString("student_email"); 181 | attribute_phonenumber = rs.getString("student_phone"); 182 | // loginpassword = rs.getString("登录密码"); 183 | 184 | System.out.println(attribute_id); 185 | System.out.println(attribute_name); 186 | System.out.println(attribute_sex); 187 | System.out.println(attribute_age); 188 | System.out.println(attribute_school); 189 | System.out.println(attribute_major); 190 | System.out.println(attribute_email); 191 | System.out.println(attribute_phonenumber); 192 | System.out.println(loginpassword); 193 | 194 | jTablePersonalInfo.setValueAt("学号", 0, 0); 195 | jTablePersonalInfo.setValueAt("姓名", 1, 0); 196 | jTablePersonalInfo.setValueAt("性别", 2, 0); 197 | jTablePersonalInfo.setValueAt("年龄", 3, 0); 198 | jTablePersonalInfo.setValueAt("学院", 4, 0); 199 | jTablePersonalInfo.setValueAt("专业", 5, 0); 200 | jTablePersonalInfo.setValueAt("邮箱", 6, 0); 201 | jTablePersonalInfo.setValueAt("手机号", 7, 0); 202 | // jTablePersonalInfo.setValueAt("密码", 8, 0); 203 | 204 | 205 | jTablePersonalInfo.setValueAt(attribute_id, 0, 1); 206 | jTablePersonalInfo.setValueAt(attribute_name, 1, 1); 207 | jTablePersonalInfo.setValueAt(attribute_sex, 2, 1); 208 | jTablePersonalInfo.setValueAt(attribute_age, 3, 1); 209 | jTablePersonalInfo.setValueAt(attribute_school, 4, 1); 210 | jTablePersonalInfo.setValueAt(attribute_major, 5, 1); 211 | jTablePersonalInfo.setValueAt(attribute_email, 6, 1); 212 | jTablePersonalInfo.setValueAt(attribute_phonenumber, 7, 1); 213 | // jTablePersonalInfo.setValueAt(loginpassword, 8, 1); 214 | 215 | } 216 | 217 | } catch(SQLException e) { 218 | e.printStackTrace(); 219 | } 220 | 221 | 222 | /** 223 | * 个人选课信息查看 224 | * 封装好的OperateDB要更改数据才行 225 | */ 226 | try { 227 | //获取数据库此账号数据 228 | DB db = new DB(); 229 | ResultSet rs = null; 230 | 231 | rs = db.executeQuery("select * from classselecting where select_stu_id = '" + account + "'"); 232 | // 233 | System.out.println("select * from classselecting where select_stu_id = '" + account + "'"); 234 | 235 | if (rs.wasNull()) { 236 | System.out.println("获取数据失败为空!"); 237 | } else { 238 | /** 239 | * 接下来获取数据展示在表格中 240 | */ 241 | // Vector rowData = OperateDB2.getRows(); 242 | // Vector columnNames = OperateDB2.getHead(); 243 | 244 | /** 245 | * 接下来获取数据展示在表格中 246 | */ 247 | String select_id = null; 248 | String select_class_id = null; 249 | String select_stu_id = null; 250 | 251 | //要将指针放到结果集最后一行才能读出总结果集行数 252 | rs.last(); 253 | int rowcount = rs.getRow(); 254 | System.out.println(rowcount); 255 | jTableClasses = new JTable(rowcount, 3); 256 | 257 | jTableClasses.setValueAt("选课id", 0, 0); 258 | jTableClasses.setValueAt("课程id", 0, 1); 259 | jTableClasses.setValueAt("选课学生学号", 0, 2); 260 | 261 | //将指针移到第一行 也就是还包括表头 继续遍历结果 262 | rs.first(); 263 | int i = 1; 264 | while (rs.next() && i < rowcount) { 265 | select_id = rs.getString("select_id"); 266 | select_class_id = rs.getString("select_class_id"); 267 | select_stu_id = rs.getString("select_stu_id"); 268 | 269 | 270 | System.out.println(select_id); 271 | System.out.println(select_class_id); 272 | System.out.println(select_stu_id); 273 | 274 | jTableClasses.setValueAt(select_id, i, 0); 275 | jTableClasses.setValueAt(select_class_id, i, 1); 276 | jTableClasses.setValueAt(select_stu_id, i, 2); 277 | 278 | i++; 279 | } 280 | 281 | // jTablePersonalInfo.setValueAt(loginpassword, 8, 1); 282 | 283 | // defaultTableModel = new DefaultTableModel(rowData, columnNames); 284 | // jTableClasses = new JTable(defaultTableModel); 285 | // 286 | // jTablePersonalInfo.setPreferredScrollableViewportSize(new Dimension(500, 200)); 287 | // jTablePersonalInfo.setFillsViewportHeight(true); 288 | // jTableClasses.setPreferredScrollableViewportSize(new Dimension(500, 200)); 289 | // jTableClasses.setFillsViewportHeight(true); 290 | 291 | jScrollPaneClassesInfo = new JScrollPane(jTableClasses); 292 | // jScrollPaneClassesInfo.setPreferredSize(new Dimension(500, 360)); 293 | 294 | jButtonCheckTheClasses = new JButton("查看详细"); 295 | jButtonCheckTheClasses.setBackground(Color.pink); 296 | jButtonCheckTheClasses.setOpaque(false); 297 | jButtonCheckTheClasses.setBorder(null); 298 | 299 | jPanelClassesInfo.add(jLabelClassesInfo); 300 | jPanelClassesInfo.add(jScrollPaneClassesInfo); 301 | jPanelClassesInfo.add(jButtonCheckTheClasses); 302 | 303 | this.add(jPanelClassesInfo); 304 | 305 | } 306 | 307 | } catch(SQLException e) { 308 | e.printStackTrace(); 309 | } 310 | 311 | 312 | jButtonSaveTheChange.addActionListener(new ActionListener() { 313 | @Override 314 | public void actionPerformed(ActionEvent e) { 315 | int column = jTablePersonalInfo.getColumnCount(); 316 | int row = jTablePersonalInfo.getRowCount(); 317 | 318 | System.out.println(row); 319 | 320 | //value数组存放表格中第二列的所有数据 321 | String[] value = new String[row]; 322 | String str = jTablePersonalInfo.getValueAt(3, 1).toString(); 323 | System.out.println(str); 324 | 325 | for (int i = 0; i < row; i++) { 326 | 327 | value[i] = jTablePersonalInfo.getValueAt(i, 1).toString(); 328 | System.out.println(value[i]); 329 | 330 | } 331 | 332 | //以下为数据库操作 333 | DB db = new DB(); 334 | 335 | db.executeUpdate("delete from student where student_id = '" + account + "'"); 336 | 337 | 338 | db.executeUpdate("insert into student(student_id,student_name,student_sex,student_age,student_school,student_major,student_email,student_phone) " + 339 | "values(" + "'" + value[0] + "'" + "," + "'" + value[1]+ "'" + "," + 340 | "'" + value[2] + "'" + "," + "'" + value[3] + "'" + "," + "'" +value[4] + "'" + "," + "'" + 341 | value[5] + "'" + "," + "'" + value[6] + "'" + "," + "'" + value[7] + "'" + ")"); 342 | // "," + "'" +value[8] + "'" +")"); 343 | //测试SQL语句 344 | System.out.println("insert into student(student_id,student_name,student_sex,student_age,student_school,student_major,student_email,student_phone) " + 345 | "values(" + "'" + value[0] + "'" + "," + "'" + value[1]+ "'" + "," + 346 | "'" + value[2] + "'" + "," + "'" + value[3] + "'" + "," + "'" +value[4] + "'" + "," + "'" + 347 | value[5] + "'" + "," + "'" + value[6] + "'" + "," + "'" + value[7] + "'" + ")"); 348 | 349 | 350 | System.out.println("操作已完成"); 351 | } 352 | }); 353 | 354 | jButtonCheckTheClasses.addActionListener(new ActionListener() { 355 | @Override 356 | public void actionPerformed(ActionEvent e) { 357 | JFrame jFrameCheckingClasses = new JFrame(); 358 | DefaultTableModel tableModel; //默认显示的表格 359 | JTable jTable; //表格 360 | JPanel jPanel; //增加信息的面板 361 | 362 | jFrameCheckingClasses.setBounds(500, 600, 600, 450); 363 | jFrameCheckingClasses.setTitle("课程表"); 364 | 365 | //取得数据库的课程表的各行数据 366 | Vector rowData = OperateDB3.getRows(); 367 | //取得数据库的课程表的表头数据 368 | Vector columnNames = OperateDB3.getHead(); 369 | 370 | //新建表格 371 | tableModel = new DefaultTableModel(rowData, columnNames); 372 | jTable = new JTable(tableModel); 373 | 374 | JScrollPane jScrollPane = new JScrollPane(jTable); 375 | 376 | jFrameCheckingClasses.add(jScrollPane); 377 | jFrameCheckingClasses.setVisible(true); 378 | } 379 | }); 380 | 381 | jButtonFaceRegister.addActionListener(new ActionListener() { 382 | @Override 383 | public void actionPerformed(ActionEvent e) { 384 | StudentRegister studentRegister = new StudentRegister(); 385 | } 386 | }); 387 | 388 | 389 | } 390 | 391 | 392 | 393 | 394 | 395 | 396 | //此方法最好不用 是拿来测试展示界面的 397 | public void showFrameStudent() { 398 | setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 399 | setVisible(true); 400 | } 401 | 402 | public static void main(String[] args) { 403 | StudentPage studentPage = new StudentPage(); 404 | 405 | } 406 | } 407 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/StudentRegister.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import cn.cyan.facedao.FacebaiduRegister; 4 | import com.github.sarxos.webcam.Webcam; 5 | import com.github.sarxos.webcam.WebcamPanel; 6 | import com.github.sarxos.webcam.WebcamResolution; 7 | import com.github.sarxos.webcam.WebcamUtils; 8 | import com.github.sarxos.webcam.util.ImageUtils; 9 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 10 | 11 | import javax.swing.*; 12 | import java.awt.*; 13 | import java.awt.event.ActionEvent; 14 | import java.awt.event.ActionListener; 15 | import java.awt.event.WindowAdapter; 16 | import java.awt.event.WindowEvent; 17 | import java.net.URL; 18 | 19 | /** 20 | * @Author: Cyan 21 | * @Date: 2019/6/18 19:33 22 | * @notice: 如果学生已经注册人脸 那就是更新人脸 或者不再能更改人脸 23 | */ 24 | public class StudentRegister extends JFrame { 25 | private FacebaiduRegister facebaiduRegister; 26 | private JPanel jPanel; 27 | private JLabel jLabelStudentID; 28 | private JLabel jLabelStudentName; 29 | private JLabel jLabelFacePath; 30 | private JTextField jTextFieldStudentID; 31 | private JTextField jTextFieldStudentName; 32 | private JTextField jTextFieldFacePath; 33 | private JLabel jLabelSubmit; 34 | private JButton jButtonSubmit; 35 | private JPanel jPanelbuttons; 36 | 37 | 38 | public StudentRegister() { 39 | this.setTitle("学生人脸注册界面"); 40 | this.setBounds(600, 200, 800, 600); 41 | this.setLocationRelativeTo(null); 42 | 43 | //修改左上角Java图标 44 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 45 | System.out.println(this.getClass().getResource("/viewingImg/titleicon.png")); 46 | ImageIcon imageIcon = new ImageIcon(imgURL); 47 | Image image = imageIcon.getImage(); 48 | this.setIconImage(image); 49 | 50 | try { 51 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 52 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 53 | UIManager.put("RootPane.setupButtonVisible", false); 54 | } catch(Exception e) { 55 | //TODO exception 56 | e.printStackTrace(); 57 | } 58 | 59 | final Webcam webcam = Webcam.getDefault(); 60 | webcam.setViewSize(WebcamResolution.VGA.getSize()); 61 | 62 | /** 63 | * panel是webcam封装好的 64 | */ 65 | final WebcamPanel panel = new WebcamPanel(webcam); 66 | panel.setFPSDisplayed(true); 67 | panel.setDisplayDebugInfo(true); 68 | panel.setImageSizeDisplayed(true); 69 | panel.setMirrored(true); 70 | 71 | facebaiduRegister = new FacebaiduRegister(); 72 | jPanel = new JPanel(new GridLayout(4,2, 10, 60)); 73 | 74 | jLabelStudentID = new JLabel("学生学号"); 75 | jLabelStudentName = new JLabel("学生姓名"); 76 | // jLabelFacePath = new JLabel("人脸图片路径"); 77 | jTextFieldStudentID = new JTextField(); 78 | jTextFieldStudentName = new JTextField(); 79 | jTextFieldStudentName.setSize(100, 10); 80 | // jTextFieldFacePath = new JTextField(); 81 | jLabelSubmit = new JLabel("确认信息无误后上传"); 82 | jButtonSubmit = new JButton("提交并上传"); 83 | 84 | jPanel.add(jLabelStudentID); 85 | jPanel.add(jTextFieldStudentID); 86 | jPanel.add(jLabelStudentName); 87 | jPanel.add(jTextFieldStudentName); 88 | // jPanel.add(jLabelFacePath); 89 | // jPanel.add(jTextFieldFacePath); 90 | jPanel.add(jLabelSubmit); 91 | jPanel.add(jButtonSubmit); 92 | 93 | this.setLayout(new BorderLayout()); 94 | this.add(panel, BorderLayout.CENTER); 95 | this.add(jPanel,BorderLayout.EAST); 96 | this.setResizable(true); 97 | this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 98 | this.pack(); 99 | this.setVisible(true); 100 | 101 | 102 | /** 103 | * 按钮触发事件 104 | */ 105 | //南方panel上拍照按钮取图注册按钮人脸库注册 106 | final JButton button = new JButton("拍照"); 107 | 108 | //添加 中间panel(核心panel视频流) 拍照btn 东方panel 109 | this.add(panel, BorderLayout.CENTER); 110 | this.add(button, BorderLayout.SOUTH); 111 | this.setResizable(true); 112 | this.pack(); 113 | this.setVisible(true); 114 | 115 | /** 116 | * 对象数组法 通过一个final的Object对象数组,存放需要的值 117 | * 传出匿名内部类的变量值 118 | * 以便利用图片地址 119 | * 资料来自 感谢! 120 | * https://blog.csdn.net/u010746364/article/details/50607236 121 | */ 122 | final Object[] objects = new Object[1]; 123 | button.addActionListener(new ActionListener() { 124 | public void actionPerformed(ActionEvent e) 125 | { 126 | 127 | //实现拍照保存-------start 128 | String fileName = "D://Demoimg//" + System.currentTimeMillis(); 129 | objects[0] = fileName + ".jpg"; 130 | System.out.println(objects[0]); 131 | //保存路径即图片名称(不用加后缀) 132 | WebcamUtils.capture(webcam, fileName, ImageUtils.FORMAT_JPG); 133 | 134 | SwingUtilities.invokeLater(new Runnable() { 135 | 136 | @Override 137 | public void run() 138 | { 139 | JOptionPane.showMessageDialog(null, "获取图片成功"); 140 | button.setEnabled(true); //设置按钮可点击 141 | 142 | return; 143 | } 144 | }); 145 | //实现拍照保存-------end 146 | 147 | } 148 | }); 149 | 150 | 151 | 152 | //实现人脸注册 153 | jButtonSubmit.addActionListener(new ActionListener() { 154 | @Override 155 | public void actionPerformed(ActionEvent event) { 156 | try { 157 | String filename = objects[0].toString(); 158 | System.out.println("filename is " + filename); 159 | 160 | String student_id = jTextFieldStudentID.getText(); 161 | String student_name = jTextFieldStudentName.getText(); 162 | 163 | //测试数据获取 164 | System.out.println(student_id); 165 | System.out.println(student_name); 166 | 167 | if (student_id!=null&&student_name!=null&&filename!=null) { 168 | facebaiduRegister.uploadingFace(filename, student_id, student_name); 169 | } 170 | } catch (Exception e) { 171 | // TODO Auto-generated catch block 172 | e.printStackTrace(); 173 | } 174 | } 175 | }); 176 | 177 | this.addWindowListener(new WindowAdapter() { 178 | @Override 179 | public void windowClosing(WindowEvent e) { 180 | super.windowClosing(e); 181 | 182 | webcam.close(); 183 | } 184 | }); 185 | } 186 | 187 | public static void main(String args[]) { 188 | StudentRegister studentRegister = new StudentRegister(); 189 | } 190 | 191 | } 192 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/TeacherBasicInfoPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import cn.cyan.util.DB; 4 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 5 | 6 | import javax.swing.*; 7 | import javax.swing.table.DefaultTableModel; 8 | import java.awt.*; 9 | import java.awt.event.ActionEvent; 10 | import java.awt.event.ActionListener; 11 | import java.net.URL; 12 | import java.sql.ResultSet; 13 | import java.sql.SQLException; 14 | import java.sql.Savepoint; 15 | 16 | /** 17 | * @Author: Cyan 18 | * @Date: 2019/5/29 19:41 19 | */ 20 | public class TeacherBasicInfoPage extends JFrame { 21 | private String userAccount; 22 | private String userPassword; 23 | private DefaultTableModel defaultTableModel; 24 | private JTable jTablePersonalInfo; 25 | private JScrollPane jScrollPaneBasicInfo; 26 | private JButton jButtonSaveTheChange; 27 | private JLabel jLabelBasicInfo; 28 | private JPanel jPanelBasicInfo; 29 | 30 | public String getUserAccount() { 31 | return userAccount; 32 | } 33 | 34 | public void setUserAccount(String userAccount) { 35 | this.userAccount = userAccount; 36 | } 37 | 38 | public String getUserPassword() { 39 | return userPassword; 40 | } 41 | 42 | public void setUserPassword(String userPassword) { 43 | this.userPassword = userPassword; 44 | } 45 | 46 | public TeacherBasicInfoPage() { 47 | 48 | this.setTitle("考勤系统教师界面"); 49 | this.setLayout(new GridLayout(1, 1)); 50 | this.setBounds(600, 200, 720, 520); 51 | this.setLocationRelativeTo(null); 52 | //修改左上角Java图标 53 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 54 | ImageIcon imageIcon = new ImageIcon(imgURL); 55 | Image image = imageIcon.getImage(); 56 | this.setIconImage(image); 57 | 58 | try { 59 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 60 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 61 | UIManager.put("RootPane.setupButtonVisible", false); 62 | } catch(Exception e) { 63 | //TODO exception 64 | e.printStackTrace(); 65 | } 66 | 67 | jLabelBasicInfo = new JLabel("基本信息"); 68 | jPanelBasicInfo = new JPanel(); 69 | 70 | 71 | // jPanelBasicInfo.setPreferredSize(new Dimension(720, 280)); 72 | 73 | /** 74 | * 基本信息表格 75 | */ 76 | jTablePersonalInfo = new JTable(9, 2); 77 | //设置行宽 78 | jTablePersonalInfo.setRowHeight(30); 79 | //设置列宽 80 | jTablePersonalInfo.getColumnModel().getColumn(0).setPreferredWidth(200); 81 | jTablePersonalInfo.getColumnModel().getColumn(1).setPreferredWidth(400); 82 | //设置表头不可见 83 | jTablePersonalInfo.getTableHeader().setVisible(false); 84 | /** 85 | * 选课信息表格 调整到方法内 86 | */ 87 | 88 | 89 | jScrollPaneBasicInfo = new JScrollPane(jTablePersonalInfo); 90 | jScrollPaneBasicInfo.setPreferredSize(new Dimension(500,250)); 91 | 92 | 93 | 94 | jButtonSaveTheChange = new JButton("保存修改"); 95 | jButtonSaveTheChange.setBackground(Color.CYAN); 96 | jButtonSaveTheChange.setContentAreaFilled(true); 97 | jButtonSaveTheChange.setBorder(null); 98 | 99 | jPanelBasicInfo.add(jLabelBasicInfo); 100 | jPanelBasicInfo.add(jScrollPaneBasicInfo); 101 | jPanelBasicInfo.add(jButtonSaveTheChange); 102 | 103 | this.add(jPanelBasicInfo); 104 | 105 | this.setVisible(true); 106 | this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 107 | } 108 | 109 | 110 | //接收教师功能选择页面账户 111 | //接下来实现表的展示 112 | public void receTheAccountInfo(final TeacherBasicInfoPage teacherBasicInfoPage) { 113 | final String account = teacherBasicInfoPage.getUserAccount(); 114 | final String pwd = teacherBasicInfoPage.getUserPassword(); 115 | 116 | //测试传入参数 117 | System.out.println(account); 118 | System.out.println(pwd); 119 | 120 | /** 121 | * 个人基本信息 122 | */ 123 | try { 124 | //获取数据库此账号数据 125 | DB db = new DB(); 126 | ResultSet rs = null; 127 | 128 | rs = db.executeQuery("select * from teacher where teacher_id = '" + account + "'"); 129 | // 130 | System.out.println("select * from teacher where teacher_id = '" + account + "'"); 131 | 132 | if (rs.wasNull()) { 133 | System.out.println("获取数据失败为空!"); 134 | } else { 135 | /** 136 | * 接下来获取数据展示在表格中 137 | */ 138 | String attribute_id = null; 139 | String attribute_name = null; 140 | String attribute_sex = null; 141 | String attribute_age = null; 142 | String attribute_school = null; 143 | String attribute_title = null; 144 | String attribute_email = null; 145 | String attribute_phonenumber = null; 146 | String loginpassword = null; 147 | 148 | rs.next(); 149 | 150 | attribute_id = rs.getString("teacher_id"); 151 | attribute_name = rs.getString("teacher_name"); 152 | attribute_sex = rs.getString("teacher_sex"); 153 | attribute_age = rs.getString("teacher_age"); 154 | attribute_school = rs.getString("teacher_school"); 155 | attribute_title = rs.getString("teacher_position"); 156 | attribute_email = rs.getString("teacher_email"); 157 | attribute_phonenumber = rs.getString("teacher_phone"); 158 | loginpassword = rs.getString("teacher_pwd"); 159 | 160 | System.out.println(attribute_id); 161 | System.out.println(attribute_name); 162 | System.out.println(attribute_sex); 163 | System.out.println(attribute_age); 164 | System.out.println(attribute_school); 165 | System.out.println(attribute_title); 166 | System.out.println(attribute_email); 167 | System.out.println(attribute_phonenumber); 168 | System.out.println(loginpassword); 169 | 170 | jTablePersonalInfo.setValueAt("教师号", 0, 0); 171 | jTablePersonalInfo.setValueAt("姓名", 1, 0); 172 | jTablePersonalInfo.setValueAt("性别", 2, 0); 173 | jTablePersonalInfo.setValueAt("年龄", 3, 0); 174 | jTablePersonalInfo.setValueAt("学院", 4, 0); 175 | jTablePersonalInfo.setValueAt("职称", 5, 0); 176 | jTablePersonalInfo.setValueAt("邮箱", 6, 0); 177 | jTablePersonalInfo.setValueAt("手机号", 7, 0); 178 | jTablePersonalInfo.setValueAt("密码", 8, 0); 179 | 180 | 181 | jTablePersonalInfo.setValueAt(attribute_id, 0, 1); 182 | jTablePersonalInfo.setValueAt(attribute_name, 1, 1); 183 | jTablePersonalInfo.setValueAt(attribute_sex, 2, 1); 184 | jTablePersonalInfo.setValueAt(attribute_age, 3, 1); 185 | jTablePersonalInfo.setValueAt(attribute_school, 4, 1); 186 | jTablePersonalInfo.setValueAt(attribute_title, 5, 1); 187 | jTablePersonalInfo.setValueAt(attribute_email, 6, 1); 188 | jTablePersonalInfo.setValueAt(attribute_phonenumber, 7, 1); 189 | jTablePersonalInfo.setValueAt(loginpassword, 8, 1); 190 | 191 | } 192 | 193 | } catch(SQLException e) { 194 | e.printStackTrace(); 195 | } 196 | 197 | jButtonSaveTheChange.addActionListener(new ActionListener() { 198 | @Override 199 | public void actionPerformed(ActionEvent e) { 200 | int column = jTablePersonalInfo.getColumnCount(); 201 | int row = jTablePersonalInfo.getRowCount(); 202 | 203 | //测试 204 | System.out.println(row); 205 | 206 | //value数组存放表格中第二列的所有数据 207 | String[] value = new String[row]; 208 | // //测试 209 | // String str = jTablePersonalInfo.getValueAt(3, 1).toString(); 210 | // System.out.println(str); 211 | 212 | for (int i = 0; i < row; i++) { 213 | 214 | value[i] = jTablePersonalInfo.getValueAt(i, 1).toString(); 215 | System.out.println(value[i]); 216 | 217 | } 218 | 219 | //以下为数据库操作 220 | DB db = new DB(); 221 | 222 | db.executeUpdate("insert into teacher values(" + "'" + value[0] + "'" + "," + "'" + value[1]+ "'" + "," + 223 | "'" + value[2] + "'" + "," + "'" + value[3] + "'" + "," + "'" +value[4] + "'" + "," + "'" + 224 | value[5] + "'" + "," + "'" + value[6] + "'" + "," + "'" + value[7] + "'" + 225 | "," + "'" +value[8] + "'" +")"); 226 | //测试SQL语句 227 | System.out.println("insert into teacher values(" + "'" + value[0] + "'" + "," + "'" + value[1]+ "'" + "," + 228 | "'" + value[2] + "'" + "," + "'" + value[3] + "'" + "," + "'" +value[4] + "'" + "," + "'" + 229 | value[5] + "'" + "," + "'" + value[6] + "'" + "," + "'" + value[7] + "'" + 230 | "," + "'" +value[8] + "'" +")"); 231 | 232 | 233 | System.out.println("操作已完成"); 234 | } 235 | }); 236 | 237 | 238 | } 239 | 240 | 241 | //单元测试 242 | public static void main(String[] args) { 243 | new TeacherBasicInfoPage(); 244 | } 245 | } 246 | -------------------------------------------------------------------------------- /src/main/java/cn/cyan/view/TeacherPage.java: -------------------------------------------------------------------------------- 1 | package cn.cyan.view; 2 | 3 | import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; 4 | 5 | import javax.swing.*; 6 | import java.awt.*; 7 | import java.awt.event.MouseAdapter; 8 | import java.awt.event.MouseEvent; 9 | import java.net.URL; 10 | 11 | /** 12 | * @Author: Cyan 13 | * @Date: 2019/5/20 8:10 14 | * 考勤入口 和基本信息修改入口 和考勤数据查看 与 特殊情况 如请假信息添加 15 | */ 16 | public class TeacherPage extends JFrame { 17 | 18 | // private JFrame jFrameTeacher; 19 | private JPanel jPanelTeacher; 20 | // private JPanel jPanelBasicInfo; 21 | // private JPanel jPanelAttendanceChecking; 22 | // private JPanel jPanelAttendanceData; 23 | private JLabel jLabelBasicInfo; 24 | private JLabel jLabelBasicInfoText; 25 | private JLabel jLabelAttendanceChecking; 26 | private JLabel jLabelAttendanceCheckingText; 27 | private JLabel jLabelAttendanceData; 28 | private JLabel jLabelAttendanceDataText; 29 | private GridBagLayout gridBagLayout; 30 | private GridBagConstraints gridBagConstraints; 31 | private String userAccount; 32 | private String userPassword; 33 | private static String userType = "教师"; 34 | 35 | 36 | public String getUserAccount() { 37 | return userAccount; 38 | } 39 | 40 | public void setUserAccount(String userAccount) { 41 | this.userAccount = userAccount; 42 | } 43 | 44 | public String getUserPassword() { 45 | return userPassword; 46 | } 47 | 48 | public void setUserPassword(String userPassword) { 49 | this.userPassword = userPassword; 50 | } 51 | 52 | public TeacherPage() { 53 | // jFrameTeacher = new JFrame(); 54 | /**总面板*/ 55 | jPanelTeacher = new JPanel(); 56 | // /**基本信息面板**/ 57 | // jPanelBasicInfo = new JPanel(); 58 | // /**考勤面板**/ 59 | // jPanelAttendanceChecking = new JPanel(); 60 | // /**考勤数据后台**/ 61 | // jPanelAttendanceData = new JPanel(); 62 | /**基本信息图标标签**/ 63 | jLabelBasicInfo = new JLabel(); 64 | jLabelBasicInfoText = new JLabel("教师信息"); 65 | /**考勤图标标签**/ 66 | jLabelAttendanceChecking = new JLabel(); 67 | jLabelAttendanceCheckingText = new JLabel("学生考勤"); 68 | /**考勤后台数据图标标签**/ 69 | jLabelAttendanceData = new JLabel(); 70 | jLabelAttendanceDataText = new JLabel("考勤数据"); 71 | 72 | /**网格包布局**/ 73 | gridBagLayout = new GridBagLayout(); 74 | gridBagConstraints = new GridBagConstraints(); 75 | 76 | //修改左上角Java图标 77 | URL imgURL = this.getClass().getResource("/viewingImg/titleicon.png"); 78 | ImageIcon imageIcon = new ImageIcon(imgURL); 79 | Image image = imageIcon.getImage(); 80 | this.setIconImage(image); 81 | 82 | init(); 83 | 84 | } 85 | 86 | public void init() { 87 | this.setTitle("考勤系统教师界面"); 88 | // jFrameTeacher.setLayout(null); 89 | // jFrameTeacher.setBounds(300, 200, 1200, 800); 90 | // jFrameTeacher.setLocationRelativeTo(null); 91 | // this.setAlwaysOnTop(true); 92 | // this.setUndecorated(false); 93 | this.getGraphicsConfiguration().getDevice().setFullScreenWindow(this); 94 | 95 | try { 96 | BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike; 97 | org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); 98 | UIManager.put("RootPane.setupButtonVisible", false); 99 | } catch(Exception e) { 100 | //TODO exception 101 | e.printStackTrace(); 102 | } 103 | 104 | jPanelTeacher = new JPanel() { 105 | @Override 106 | protected void paintComponent(Graphics g) { 107 | super.paintComponent(g); 108 | 109 | try { 110 | /** 111 | * image如何创建对象 112 | * https://blog.csdn.net/u012723673/article/details/53326257 113 | */ 114 | // Image image = ImageIO.read(new File("viewingImg/TeacherPageBackground.png")); 115 | URL imgURL = this.getClass().getResource("/viewingImg/TeacherPageBackground.png"); 116 | ImageIcon imageIcon = new ImageIcon(imgURL); 117 | Image image = imageIcon.getImage(); 118 | /** 119 | * 获取屏幕的高度与宽度(两种方式) 120 | * https://blog.csdn.net/jobfyz/article/details/78466171 121 | */ 122 | Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); 123 | int width = dimension.width; //1707px 124 | int height = dimension.height; //960px 125 | g.drawImage(image, 0, 0, width, height, this); 126 | } catch (Exception e) { 127 | e.getStackTrace(); 128 | } 129 | } 130 | }; 131 | 132 | //基本信息入口图标标签 133 | int iconwidth1 = 128; 134 | int iconheight1 = 128; 135 | ImageIcon imageIcon1; 136 | URL imgURL1 = this.getClass().getResource("/viewingImg/basicinfo.png"); 137 | System.out.println(this.getClass().getResource("/viewingImg/basicinfo.png")); 138 | imageIcon1 = new ImageIcon(imgURL1); 139 | Image image1 = imageIcon1.getImage(); 140 | image1 = image1.getScaledInstance(iconwidth1, iconheight1, Image.SCALE_DEFAULT); 141 | imageIcon1.setImage(image1); 142 | jLabelBasicInfo.setIcon(imageIcon1); 143 | // jPanelBasicInfo.add(jLabelBasicInfo); 144 | // jPanelBasicInfo.setBounds(70, 200, iconwidth1, iconheight1); 145 | 146 | 147 | //考勤入口图标标签 148 | int iconwidth2 = 160; 149 | int iconheight2 = 160; 150 | ImageIcon imageIcon2; 151 | URL imgURL4 = this.getClass().getResource("/viewingImg/attendanceicon.png"); 152 | imageIcon2 = new ImageIcon(imgURL4); 153 | Image image2 = imageIcon1.getImage(); 154 | image2 = image2.getScaledInstance(iconwidth1, iconheight1, Image.SCALE_DEFAULT); 155 | imageIcon1.setImage(image2); 156 | jLabelAttendanceChecking.setIcon(imageIcon2); 157 | // jPanelAttendanceChecking.add(jLabelAttendanceChecking); 158 | // jPanelAttendanceChecking.setBounds(400, 200, iconwidth2, iconheight2); 159 | 160 | //考勤后台数据入口便签 161 | int iconwidth3 = 160; 162 | int iconheight3 = 160; 163 | ImageIcon imageIcon3; 164 | URL imgURL7 = this.getClass().getResource("/viewingImg/data.png"); 165 | imageIcon3 = new ImageIcon(imgURL7); 166 | Image image3 = imageIcon1.getImage(); 167 | image3 = image3.getScaledInstance(iconwidth1, iconheight1, Image.SCALE_DEFAULT); 168 | imageIcon1.setImage(image3); 169 | jLabelAttendanceData.setIcon(imageIcon3); 170 | // jPanelAttendanceData.add(jLabelAttendanceData); 171 | // jPanelAttendanceData.setBounds(800, 200, iconwidth3, iconheight3); 172 | 173 | 174 | /** 175 | * 文字标签 176 | */ 177 | Color color = new Color(191, 173, 111); 178 | jLabelBasicInfoText.setFont(new Font("微软雅黑", Font.BOLD, 24)); 179 | jLabelBasicInfoText.setForeground(color); 180 | jLabelAttendanceCheckingText.setFont(new Font("微软雅黑", Font.BOLD, 24)); 181 | jLabelAttendanceCheckingText.setForeground(color); 182 | jLabelAttendanceDataText.setFont(new Font("微软雅黑", Font.BOLD, 24)); 183 | jLabelAttendanceDataText.setForeground(color); 184 | 185 | 186 | 187 | /** 188 | * 如何javaSwing关闭子窗口不关闭父窗口 189 | * http://www.cnblogs.com/hualidezhuanshen/p/5433572.html 190 | * 给图标标签添加鼠标监听事件 191 | * https://blog.csdn.net/xuqimm/article/details/71170300 192 | */ 193 | jLabelAttendanceChecking.addMouseListener(new MouseAdapter() { 194 | @Override 195 | public void mouseClicked(MouseEvent e) { 196 | super.mouseClicked(e); 197 | 198 | // jFrameTeacher.setVisible(false); 199 | /** 200 | * 201 | * 控制关闭考勤页面的同时设置被不可见的页面为可见 202 | */ 203 | AttendanceCheckingPage attendanceCheckingPage = new AttendanceCheckingPage(); 204 | } 205 | /** 206 | * 图标变换 207 | * 鼠标点击 208 | * 鼠标进入 209 | * 鼠标离开 210 | */ 211 | @Override 212 | public void mousePressed(MouseEvent e) { 213 | super.mousePressed(e); 214 | } 215 | 216 | @Override 217 | public void mouseEntered(MouseEvent e) { 218 | super.mouseEntered(e); 219 | } 220 | 221 | @Override 222 | public void mouseExited(MouseEvent e) { 223 | super.mouseExited(e); 224 | } 225 | }); 226 | 227 | 228 | /** 229 | * 给图标标签添加监听事件 230 | * 231 | */ 232 | jLabelAttendanceCheckingText.addMouseListener(new MouseAdapter() { 233 | @Override 234 | public void mouseClicked(MouseEvent e) { 235 | super.mouseClicked(e); 236 | 237 | new AttendanceCheckingPage(); 238 | } 239 | 240 | @Override 241 | public void mousePressed(MouseEvent e) { 242 | super.mousePressed(e); 243 | } 244 | 245 | @Override 246 | public void mouseEntered(MouseEvent e) { 247 | super.mouseEntered(e); 248 | } 249 | 250 | @Override 251 | public void mouseExited(MouseEvent e) { 252 | super.mouseExited(e); 253 | } 254 | }); 255 | 256 | 257 | /** 258 | * 教师基本信息图标标签和文字标签添加鼠标监听事件 259 | */ 260 | jLabelBasicInfo.addMouseListener(new MouseAdapter() { 261 | @Override 262 | public void mouseClicked(MouseEvent e) { 263 | super.mouseClicked(e); 264 | 265 | TeacherBasicInfoPage teacherBasicInfoPage = new TeacherBasicInfoPage(); 266 | String account = getUserAccount(); 267 | String pwd = getUserPassword(); 268 | 269 | teacherBasicInfoPage.setUserAccount(account); 270 | teacherBasicInfoPage.setUserPassword(pwd); 271 | 272 | teacherBasicInfoPage.receTheAccountInfo(teacherBasicInfoPage); 273 | 274 | } 275 | 276 | @Override 277 | public void mousePressed(MouseEvent e) { 278 | super.mousePressed(e); 279 | } 280 | 281 | @Override 282 | public void mouseEntered(MouseEvent e) { 283 | super.mouseEntered(e); 284 | } 285 | 286 | @Override 287 | public void mouseExited(MouseEvent e) { 288 | super.mouseExited(e); 289 | } 290 | }); 291 | 292 | jLabelBasicInfoText.addMouseListener(new MouseAdapter() { 293 | @Override 294 | public void mouseClicked(MouseEvent e) { 295 | super.mouseClicked(e); 296 | 297 | TeacherBasicInfoPage teacherBasicInfoPage = new TeacherBasicInfoPage(); 298 | String account = getUserAccount(); 299 | String pwd = getUserPassword(); 300 | 301 | teacherBasicInfoPage.setUserAccount(account); 302 | teacherBasicInfoPage.setUserPassword(pwd); 303 | 304 | teacherBasicInfoPage.receTheAccountInfo(teacherBasicInfoPage); 305 | } 306 | 307 | @Override 308 | public void mousePressed(MouseEvent e) { 309 | super.mousePressed(e); 310 | } 311 | 312 | @Override 313 | public void mouseEntered(MouseEvent e) { 314 | super.mouseEntered(e); 315 | } 316 | 317 | @Override 318 | public void mouseExited(MouseEvent e) { 319 | super.mouseExited(e); 320 | } 321 | }); 322 | 323 | /** 324 | * 考勤后台数据图标标签和文字标签添加鼠标监听事件 325 | */ 326 | jLabelAttendanceData.addMouseListener(new MouseAdapter() { 327 | @Override 328 | public void mouseClicked(MouseEvent e) { 329 | super.mouseClicked(e); 330 | 331 | AttendanceCheckingDataPage attendanceCheckingDataPage = new AttendanceCheckingDataPage(); 332 | String account = getUserAccount(); 333 | String pwd = getUserPassword(); 334 | 335 | attendanceCheckingDataPage.setUserAccount(account); 336 | attendanceCheckingDataPage.setUserPassword(pwd); 337 | 338 | attendanceCheckingDataPage.receTheAccountInfo(attendanceCheckingDataPage); 339 | } 340 | 341 | @Override 342 | public void mousePressed(MouseEvent e) { 343 | super.mousePressed(e); 344 | } 345 | 346 | @Override 347 | public void mouseEntered(MouseEvent e) { 348 | super.mouseEntered(e); 349 | } 350 | 351 | @Override 352 | public void mouseExited(MouseEvent e) { 353 | super.mouseExited(e); 354 | } 355 | }); 356 | 357 | jLabelAttendanceDataText.addMouseListener(new MouseAdapter() { 358 | @Override 359 | public void mouseClicked(MouseEvent e) { 360 | super.mouseClicked(e); 361 | 362 | AttendanceCheckingDataPage attendanceCheckingDataPage = new AttendanceCheckingDataPage(); 363 | String account = getUserAccount(); 364 | String pwd = getUserPassword(); 365 | 366 | attendanceCheckingDataPage.setUserAccount(account); 367 | attendanceCheckingDataPage.setUserPassword(pwd); 368 | 369 | attendanceCheckingDataPage.receTheAccountInfo(attendanceCheckingDataPage); 370 | } 371 | 372 | @Override 373 | public void mousePressed(MouseEvent e) { 374 | super.mousePressed(e); 375 | } 376 | 377 | @Override 378 | public void mouseEntered(MouseEvent e) { 379 | super.mouseEntered(e); 380 | } 381 | 382 | @Override 383 | public void mouseExited(MouseEvent e) { 384 | super.mouseExited(e); 385 | } 386 | }); 387 | 388 | 389 | /** 390 | * 设置JPanelTeacher 391 | * 为网格包布局 392 | */ 393 | jPanelTeacher.setOpaque(false); 394 | jPanelTeacher.setLayout(gridBagLayout); 395 | 396 | /** 397 | * 接下来设置各组件以适应网格包布局 398 | */ 399 | //基本信息入口标签显示 400 | gridBagConstraints = new GridBagConstraints(0, 0, 6, 3, 0, 0, 401 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 100, 0, 120 ),0, 0); 402 | gridBagLayout.setConstraints(jLabelBasicInfo, gridBagConstraints); 403 | jPanelTeacher.add(jLabelBasicInfo); 404 | 405 | //考勤入口标签显示 406 | gridBagConstraints = new GridBagConstraints(12, 0, 6, 3, 0, 0, 407 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 120, 0, 120 ),0, 0); 408 | gridBagLayout.setConstraints(jLabelAttendanceChecking, gridBagConstraints); 409 | jPanelTeacher.add(jLabelAttendanceChecking); 410 | 411 | //考勤后台数据标签显示 412 | gridBagConstraints = new GridBagConstraints(24, 0, 6, 3, 0, 0, 413 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 120, 0, 100 ),0, 0); 414 | gridBagLayout.setConstraints(jLabelAttendanceData, gridBagConstraints); 415 | jPanelTeacher.add(jLabelAttendanceData); 416 | 417 | //基本信息文字内容标签内容 418 | gridBagConstraints = new GridBagConstraints(0, 6, 6, 2, 0, 0, 419 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 100, 120, 120 ),0, 0); 420 | gridBagLayout.setConstraints(jLabelBasicInfoText, gridBagConstraints); 421 | jPanelTeacher.add(jLabelBasicInfoText); 422 | 423 | //考勤入口文字内容标签内容 424 | gridBagConstraints = new GridBagConstraints(12, 6, 6, 2, 0, 0, 425 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 120, 120, 120 ),0, 0); 426 | gridBagLayout.setConstraints(jLabelAttendanceCheckingText, gridBagConstraints); 427 | jPanelTeacher.add(jLabelAttendanceCheckingText); 428 | 429 | //考勤数据文字内容标签内容 430 | gridBagConstraints = new GridBagConstraints(24, 6, 6, 2, 0, 0, 431 | GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 120, 120, 100 ),0, 0); 432 | gridBagLayout.setConstraints(jLabelAttendanceDataText, gridBagConstraints); 433 | jPanelTeacher.add(jLabelAttendanceDataText); 434 | 435 | 436 | this.add(jPanelTeacher); 437 | } 438 | 439 | 440 | 441 | 442 | public void showFrameTeacher() { 443 | this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 444 | this.setVisible(true); 445 | } 446 | 447 | private static GridBagConstraints getGridBagConstraints(int gridx, int gridy, int gridwidth, 448 | int gridheight, double weightx, double weighty, 449 | int anchor, int fill, Insets insets, int ipadx, 450 | int ipady) { 451 | return new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, 452 | fill, insets, ipadx, ipady); 453 | } 454 | 455 | 456 | public static void main(String[] args) { 457 | TeacherPage teacherPage = new TeacherPage(); 458 | teacherPage.showFrameTeacher(); 459 | 460 | } 461 | } 462 | --------------------------------------------------------------------------------