├── .DS_Store ├── 注意事项.pdf ├── .gitattributes ├── src └── edu │ └── school │ └── card │ ├── SchoolCardApplication.java │ ├── frame │ ├── util │ │ ├── RegexUtils.java │ │ └── BeanUtils.java │ └── component │ │ ├── BaseFrame.java │ │ ├── Layer.java │ │ ├── MyTableMouseMotionListener.java │ │ └── BaseWindow.java │ ├── enums │ ├── LossCode.java │ └── DelCode.java │ ├── anon │ └── ChangeValue.java │ ├── bean │ ├── CreditInfo.java │ ├── ConsumeInfo.java │ └── SchoolCard.java │ ├── cache │ └── GlobalCache.java │ ├── page │ ├── LoginPage.java │ └── CardManagerPage.java │ └── controller │ └── SchoolCardController.java ├── school-card.iml ├── readme.txt └── README.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaGraduationProject/CampusCardManagementSystem/HEAD/.DS_Store -------------------------------------------------------------------------------- /注意事项.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JavaGraduationProject/CampusCardManagementSystem/HEAD/注意事项.pdf -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=java 2 | *.css linguist-language=java 3 | *.html linguist-language=java 4 | -------------------------------------------------------------------------------- /src/edu/school/card/SchoolCardApplication.java: -------------------------------------------------------------------------------- 1 | package edu.school.card; 2 | 3 | import edu.school.card.page.LoginPage; 4 | 5 | public class SchoolCardApplication { 6 | public static void main(String[] args) { 7 | LoginPage login = new LoginPage(); 8 | login.start(); 9 | 10 | // CardManagerPage cardManagerPage = new CardManagerPage(); 11 | // cardManagerPage.start(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/edu/school/card/frame/util/RegexUtils.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.frame.util; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | public class RegexUtils { 7 | 8 | public static boolean isNumberOrEnglish(String value){ 9 | String regex="^[a-zA-Z0-9\u4E00-\u9FA5]+$"; 10 | Pattern pattern = Pattern.compile(regex); 11 | Matcher match=pattern.matcher(value); 12 | return match.matches(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/edu/school/card/frame/component/BaseFrame.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.frame.component; 2 | 3 | import java.awt.*; 4 | 5 | public class BaseFrame extends Frame { 6 | 7 | public void init(String title, int width, int height, boolean visible){ 8 | super.setLayout(null); 9 | super.setTitle(title); 10 | super.setSize(width,height); 11 | super.setVisible(visible); 12 | super.setResizable(false); 13 | super.setLocationRelativeTo(null); 14 | super.addWindowListener(new BaseWindow()); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /school-card.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/edu/school/card/enums/LossCode.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.enums; 2 | 3 | /** 4 | * 挂失枚举类 5 | * @date 2020/11/24 6 | */ 7 | public enum LossCode { 8 | 9 | /** 10 | * 挂失 11 | */ 12 | YES(1,"是"), 13 | /** 14 | * 未挂失 15 | */ 16 | NO(0,"否"); 17 | 18 | private String value; 19 | 20 | private int code; 21 | 22 | LossCode(int code, String value) { 23 | this.value = value; 24 | this.code = code; 25 | } 26 | 27 | public int getCode() { 28 | return code; 29 | } 30 | 31 | public String getValue() { 32 | return value; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/edu/school/card/anon/ChangeValue.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.anon; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 字典值转换注解 10 | * @date 2020/11/24 11 | */ 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Target(ElementType.FIELD) 14 | public @interface ChangeValue { 15 | 16 | /** 17 | * 字段所在列 18 | * @return 19 | */ 20 | int index() default 0; 21 | 22 | /** 23 | * 转换模式 24 | * @return 25 | */ 26 | String pattern() default ""; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/edu/school/card/enums/DelCode.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.enums; 2 | 3 | /** 4 | * @author wujiayao 5 | * @date 2020/11/24 6 | */ 7 | public enum DelCode { 8 | 9 | /** 10 | * 已删 11 | */ 12 | YES(1,"是"), 13 | /** 14 | * 未删 15 | */ 16 | NO(0,"否"); 17 | 18 | private String value; 19 | 20 | private int code; 21 | 22 | DelCode(int code, String value) { 23 | this.value = value; 24 | this.code = code; 25 | } 26 | 27 | public int getCode() { 28 | return code; 29 | } 30 | 31 | public String getValue() { 32 | return value; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------------------------------------------------------------ 2 | 一. schoolcard.txt文档相等于校园卡的数据表. 3 | 4 | 第一列: 校园卡主键 5 | 第二列: 校园卡密码 6 | 第三列: 校园卡余额 7 | 第四列: 校园卡挂失(1:挂失,0:未挂失) 8 | 第五列: 校园卡用户名 9 | 第六列: 校原卡是否已删除(1:删除,0:未删除) 10 | 11 | ------------------------------------------------------------------------------------------------------------------------ 12 | 二. credit.txt文档相等于充值的数据表. 13 | 14 | 第一列: 充值记录主键 15 | 第二列: 校园卡主键 16 | 第三列: 校园卡充值金额 17 | 第四列: 校园卡充值时间 18 | 19 | ------------------------------------------------------------------------------------------------------------------------ 20 | 三. consume.txt文档相等于消费的数据表. 21 | 22 | 第一列: 消费记录主键 23 | 第二列: 校园卡主键 24 | 第三列: 校园卡消费金额 25 | 第四列: 校园卡消费时间 26 | 27 | ------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------------------------------- /src/edu/school/card/frame/component/Layer.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.frame.component; 2 | 3 | import edu.school.card.page.LoginPage; 4 | 5 | import java.awt.*; 6 | import java.awt.event.MouseAdapter; 7 | import java.awt.event.MouseEvent; 8 | import java.awt.event.WindowAdapter; 9 | import java.awt.event.WindowEvent; 10 | 11 | public class Layer { 12 | 13 | public static Frame frame = null; 14 | 15 | public static void alert(String content){ 16 | frame = new Frame(); 17 | frame.setResizable(false); 18 | frame.setTitle("错误提示"); 19 | frame.setVisible(true); 20 | frame.setLocationRelativeTo(null); 21 | frame.setLayout(null); 22 | frame.setAlwaysOnTop(true); 23 | frame.addWindowListener(new WindowAdapter() { 24 | @Override 25 | public void windowClosing(WindowEvent e) { 26 | e.getWindow().setVisible(false); 27 | } 28 | }); 29 | frame.setSize(300,200); 30 | 31 | Panel panel = new Panel(); 32 | panel.setLayout(null); 33 | panel.setSize(300,200); 34 | 35 | Label label = new Label(content, FlowLayout.CENTER); 36 | label.setFont(new Font("宋体",Font.BOLD,20)); 37 | label.setSize(300,200); 38 | panel.add(label); 39 | 40 | panel.setVisible(true); 41 | frame.add(panel); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/edu/school/card/frame/component/MyTableMouseMotionListener.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.frame.component; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | import java.awt.event.MouseEvent; 6 | import java.awt.event.MouseMotionAdapter; 7 | 8 | /** 9 | * @date 2020/11/25 10 | */ 11 | public class MyTableMouseMotionListener extends MouseMotionAdapter { 12 | 13 | private int rowUnderMouse = -1; 14 | 15 | @Override 16 | public void mouseMoved(MouseEvent e){ 17 | JTable table = (JTable)e.getSource(); 18 | Point p = table.getMousePosition(); 19 | if(p != null){ 20 | rowUnderMouse = table.rowAtPoint(p); 21 | if(rowUnderMouse >= 0){ 22 | for(int i=0;i22.校园卡管理系统

11 | 12 |

13 | 14 | 15 |

16 | 17 | # 简介 18 | 19 | > 本代码来源于网络, 请入群(983063232)后联系群主索要sql文件! 20 | > 21 | > 用户名: admin 密码: 123456 22 | > 23 | >------------------------------------------------------------------------------------------------------------------------ 24 | >一. schoolcard.txt文档相等于校园卡的数据表. 25 | 26 | 第一列: 校园卡主键 27 | 第二列: 校园卡密码 28 | 第三列: 校园卡余额 29 | 第四列: 校园卡挂失(1:挂失,0:未挂失) 30 | 第五列: 校园卡用户名 31 | 第六列: 校原卡是否已删除(1:删除,0:未删除) 32 | 33 | >------------------------------------------------------------------------------------------------------------------------ 34 | >二. credit.txt文档相等于充值的数据表. 35 | 36 | 第一列: 充值记录主键 37 | 第二列: 校园卡主键 38 | 第三列: 校园卡充值金额 39 | 第四列: 校园卡充值时间 40 | 41 | ------------------------------------------------------------------------------------------------------------------------ 42 | >三. consume.txt文档相等于消费的数据表. 43 | 44 | 第一列: 消费记录主键 45 | 第二列: 校园卡主键 46 | 第三列: 校园卡消费金额 47 | 第四列: 校园卡消费时间 48 | >------------------------------------------------------------------------------------------------------------------------ 49 | 50 | 51 | 52 | 53 | # 环境 54 | 55 | - IntelliJ IDEA 2009.3 56 | 57 | - JDK 1.8 58 | 59 | 60 | ## 缩略图 61 | 62 | ![](https://bitwise.oss-cn-heyuan.aliyuncs.com/2024/9/10/6864af2b-1ff9-45c2-92d0-2b2beebe6542.png) 63 | 64 | ![](https://bitwise.oss-cn-heyuan.aliyuncs.com/2024/9/10/81db60d2-6629-4f1d-bcac-4a42216d7296.png) 65 | 66 | ![](https://bitwise.oss-cn-heyuan.aliyuncs.com/2024/9/10/50680fc3-a577-4099-be9f-6e83f17003f1.png) 67 | 68 | ![](https://bitwise.oss-cn-heyuan.aliyuncs.com/2024/9/10/e67dd7aa-5373-4d31-a8c5-a80b9fe182b3.png) 69 | 70 | 71 | -------------------------------------------------------------------------------- /src/edu/school/card/bean/SchoolCard.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.bean; 2 | 3 | import edu.school.card.anon.ChangeValue; 4 | 5 | import java.math.BigDecimal; 6 | 7 | /** 8 | * @author wujiayao 9 | * @date 2020/11/24 10 | */ 11 | public class SchoolCard { 12 | 13 | /** 14 | * 卡号 15 | */ 16 | @ChangeValue(index = 0) 17 | private Long cardNo; 18 | 19 | /** 20 | * 用户名 21 | */ 22 | @ChangeValue(index = 4) 23 | private String userName; 24 | 25 | /** 26 | * 密码 27 | */ 28 | @ChangeValue(index = 1) 29 | private String cardPwd; 30 | 31 | /** 32 | * 余额 33 | */ 34 | @ChangeValue(index = 2) 35 | private BigDecimal balance; 36 | 37 | /** 38 | * 是否挂失 39 | */ 40 | @ChangeValue(index = 3,pattern = "1=是,0=否") 41 | private String lossFlag; 42 | 43 | /** 44 | * 是否删除 45 | */ 46 | @ChangeValue(index = 5,pattern = "1=是,0=否") 47 | private String delFlag; 48 | 49 | public Long getCardNo() { 50 | return cardNo; 51 | } 52 | 53 | public void setCardNo(Long cardNo) { 54 | this.cardNo = cardNo; 55 | } 56 | 57 | public String getUserName() { 58 | return userName; 59 | } 60 | 61 | public void setUserName(String userName) { 62 | this.userName = userName; 63 | } 64 | 65 | public String getCardPwd() { 66 | return cardPwd; 67 | } 68 | 69 | public void setCardPwd(String cardPwd) { 70 | this.cardPwd = cardPwd; 71 | } 72 | 73 | public BigDecimal getBalance() { 74 | return balance; 75 | } 76 | 77 | public void setBalance(BigDecimal balance) { 78 | this.balance = balance; 79 | } 80 | 81 | public String getLossFlag() { 82 | return lossFlag; 83 | } 84 | 85 | public void setLossFlag(String lossFlag) { 86 | this.lossFlag = lossFlag; 87 | } 88 | 89 | public String getDelFlag() { 90 | return delFlag; 91 | } 92 | 93 | public void setDelFlag(String delFlag) { 94 | this.delFlag = delFlag; 95 | } 96 | 97 | @Override 98 | public String toString() { 99 | return "SchoolCard{" + 100 | "cardNo=" + cardNo + 101 | ", userName='" + userName + '\'' + 102 | ", cardPwd='" + cardPwd + '\'' + 103 | ", balance=" + balance + 104 | ", lossFlag='" + lossFlag + '\'' + 105 | ", delFlag='" + delFlag + '\'' + 106 | '}'; 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /src/edu/school/card/cache/GlobalCache.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.cache; 2 | 3 | import edu.school.card.bean.ConsumeInfo; 4 | import edu.school.card.bean.CreditInfo; 5 | import edu.school.card.bean.SchoolCard; 6 | import edu.school.card.enums.DelCode; 7 | import edu.school.card.enums.LossCode; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | import java.util.Set; 13 | 14 | public class GlobalCache { 15 | 16 | private static String warn; 17 | 18 | /** 19 | * 校园卡数据缓存 20 | */ 21 | private static Map schoolCardCache = new HashMap<>(); 22 | 23 | /** 24 | * 最大的校园卡主键 25 | */ 26 | private static Long maxCardNo; 27 | 28 | /** 29 | * 查询的当前条数据 30 | */ 31 | private static SchoolCard queryCurrentSchoolCard; 32 | 33 | /** 34 | * 消费数据缓存 35 | */ 36 | private static Map consumeInfoCache = new HashMap<>(); 37 | 38 | /** 39 | * 最大消费数据主键 40 | */ 41 | private static Long maxConsumeId; 42 | 43 | /** 44 | * 充值数据缓存 45 | */ 46 | private static Map creditInfoCache = new HashMap<>(); 47 | 48 | /** 49 | * 最大充值数据主键 50 | */ 51 | private static Long maxCreditId; 52 | 53 | public static String getWarn() { 54 | return warn; 55 | } 56 | 57 | public static void setWarn(String warn) { 58 | GlobalCache.warn = warn; 59 | } 60 | 61 | public static SchoolCard getQueryCurrentSchoolCard() { 62 | return queryCurrentSchoolCard; 63 | } 64 | 65 | public static void setQueryCurrentSchoolCard(SchoolCard queryCurrentSchoolCard) { 66 | GlobalCache.queryCurrentSchoolCard = queryCurrentSchoolCard; 67 | } 68 | 69 | public static Long getMaxCardNo() { 70 | return maxCardNo; 71 | } 72 | 73 | public static void setMaxCardNo(Long maxCardNo) { 74 | GlobalCache.maxCardNo = maxCardNo; 75 | } 76 | 77 | public static Long getMaxConsumeId() { 78 | return maxConsumeId; 79 | } 80 | 81 | public static void setMaxConsumeId(Long maxConsumeId) { 82 | GlobalCache.maxConsumeId = maxConsumeId; 83 | } 84 | 85 | public static Long getMaxCreditId() { 86 | return maxCreditId; 87 | } 88 | 89 | public static void setMaxCreditId(Long maxCreditId) { 90 | GlobalCache.maxCreditId = maxCreditId; 91 | } 92 | 93 | public static Map getSchoolCardCache() { 94 | return schoolCardCache; 95 | } 96 | 97 | public static void setSchoolCardCache(Map schoolCardCache) { 98 | GlobalCache.schoolCardCache = schoolCardCache; 99 | Object[] obj = getMaxKey(schoolCardCache.keySet()); 100 | if (obj.length == 0){ 101 | GlobalCache.setMaxCardNo(0L); 102 | }else { 103 | GlobalCache.setMaxCardNo(Long.parseLong(obj[obj.length - 1].toString())); 104 | } 105 | } 106 | 107 | private static Object[] getMaxKey(Set set) { 108 | Object[] obj = set.toArray(); 109 | Arrays.sort(obj); 110 | return obj; 111 | } 112 | 113 | public static Map getConsumeInfoCache() { 114 | return consumeInfoCache; 115 | } 116 | 117 | public static void setConsumeInfoCache(Map consumeInfoCache) { 118 | GlobalCache.consumeInfoCache = consumeInfoCache; 119 | Object[] obj = getMaxKey(consumeInfoCache.keySet()); 120 | if (obj.length == 0){ 121 | GlobalCache.setMaxConsumeId(0L); 122 | }else { 123 | GlobalCache.setMaxConsumeId(Long.parseLong(obj[obj.length - 1].toString())); 124 | } 125 | } 126 | 127 | public static Map getCreditInfoCache() { 128 | return creditInfoCache; 129 | } 130 | 131 | public static void setCreditInfoCache(Map creditInfoCache) { 132 | GlobalCache.creditInfoCache = creditInfoCache; 133 | Object[] obj = getMaxKey(creditInfoCache.keySet()); 134 | if (obj.length == 0){ 135 | GlobalCache.setMaxCreditId(0L); 136 | }else { 137 | GlobalCache.setMaxCreditId(Long.parseLong(obj[obj.length - 1].toString())); 138 | } 139 | } 140 | 141 | public static Map getNotDelSchoolMap(){ 142 | if (schoolCardCache.size() == 0){ 143 | return null; 144 | } 145 | HashMap map = new HashMap<>(); 146 | Set> entries = schoolCardCache.entrySet(); 147 | for (Map.Entry entry : entries) { 148 | SchoolCard schoolCard = entry.getValue(); 149 | if (schoolCard.getDelFlag().equals(DelCode.YES.getValue())){ 150 | continue; 151 | } 152 | map.put(schoolCard.getCardNo(),schoolCard); 153 | } 154 | return map; 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /src/edu/school/card/frame/component/BaseWindow.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.frame.component; 2 | 3 | import edu.school.card.bean.ConsumeInfo; 4 | import edu.school.card.bean.CreditInfo; 5 | import edu.school.card.bean.SchoolCard; 6 | import edu.school.card.cache.GlobalCache; 7 | import edu.school.card.enums.DelCode; 8 | import edu.school.card.enums.LossCode; 9 | import edu.school.card.frame.util.BeanUtils; 10 | 11 | import java.awt.*; 12 | import java.awt.event.WindowAdapter; 13 | import java.awt.event.WindowEvent; 14 | import java.io.*; 15 | import java.util.Arrays; 16 | import java.util.Map; 17 | import java.util.Set; 18 | 19 | public class BaseWindow extends WindowAdapter { 20 | 21 | @Override 22 | public void windowClosing(WindowEvent e) { 23 | Window window = e.getWindow(); 24 | window.setVisible(false); 25 | // 同步数据 26 | try { 27 | writeData(); 28 | }catch (Exception ex){ 29 | ex.printStackTrace(); 30 | }finally { 31 | System.exit(0); 32 | } 33 | } 34 | 35 | private void writeData() throws IOException { 36 | // 写入校园卡数据 37 | writeSchoolCard(); 38 | // 写入充值记录 39 | writeCredit(); 40 | // 写入消费数记录 41 | writeConsume(); 42 | } 43 | 44 | private void writeConsume() throws IOException{ 45 | if (GlobalCache.getConsumeInfoCache().size() == 0){ 46 | BeanUtils utils = new BeanUtils<>(); 47 | Map conMap = utils.getBeanMap("consume.txt", ConsumeInfo.class); 48 | GlobalCache.setConsumeInfoCache(conMap); 49 | } 50 | FileOutputStream fw = new FileOutputStream(BeanUtils.getPathOut("consume.txt")); 51 | OutputStreamWriter ow = new OutputStreamWriter(fw,"UTF-8"); 52 | Map consumeInfoCache = GlobalCache.getConsumeInfoCache(); 53 | Set set = consumeInfoCache.keySet(); 54 | Object[] obj = set.toArray(); 55 | Arrays.sort(obj); 56 | for (Object key : obj) { 57 | ConsumeInfo consumeInfo = consumeInfoCache.get(key); 58 | ow.write(consumeInfo.getConsumeId()+","+consumeInfo.getCardNo()+","+ 59 | consumeInfo.getConsumeBalance()+","+consumeInfo.getCreateTime()+"\r\n"); 60 | } 61 | ow.flush(); 62 | ow.close(); 63 | fw.close(); 64 | } 65 | 66 | private void writeCredit() throws IOException { 67 | if (GlobalCache.getCreditInfoCache().size() == 0){ 68 | BeanUtils utils = new BeanUtils<>(); 69 | GlobalCache.setCreditInfoCache(utils. 70 | getBeanMap( 71 | "credit.txt", 72 | CreditInfo.class)); 73 | } 74 | FileOutputStream fw = new FileOutputStream(BeanUtils.getPathOut("credit.txt")); 75 | OutputStreamWriter ow = new OutputStreamWriter(fw,"UTF-8"); 76 | Map creditInfoCache = GlobalCache.getCreditInfoCache(); 77 | Set set = creditInfoCache.keySet(); 78 | Object[] obj = set.toArray(); 79 | Arrays.sort(obj); 80 | for (Object key : obj) { 81 | CreditInfo creditInfo = creditInfoCache.get(key); 82 | ow.write(creditInfo.getCreditId()+","+creditInfo.getCardNo()+","+ 83 | creditInfo.getCreditBalance()+","+creditInfo.getCreateTime()+"\r\n"); 84 | } 85 | ow.flush(); 86 | ow.close(); 87 | fw.close(); 88 | } 89 | 90 | private void writeSchoolCard() throws IOException { 91 | FileOutputStream fw = new FileOutputStream(BeanUtils.getPathOut("schoolcard.txt")); 92 | OutputStreamWriter ow = new OutputStreamWriter(fw,"UTF-8"); 93 | Map schoolCardCache = GlobalCache.getSchoolCardCache(); 94 | Set set = schoolCardCache.keySet(); 95 | Object[] obj = set.toArray(); 96 | Arrays.sort(obj); 97 | for (Object key : obj) { 98 | SchoolCard schoolCard = schoolCardCache.get(key); 99 | String lossFlag = schoolCard.getLossFlag(); 100 | if (lossFlag.equals(LossCode.YES.getValue())){ 101 | lossFlag = LossCode.YES.getCode()+""; 102 | }else { 103 | lossFlag = LossCode.NO.getCode()+""; 104 | } 105 | 106 | String delFlag = schoolCard.getDelFlag(); 107 | if (delFlag.equals(DelCode.YES.getValue())){ 108 | delFlag = DelCode.YES.getCode()+""; 109 | }else { 110 | delFlag = DelCode.NO.getCode()+""; 111 | } 112 | ow.write(schoolCard.getCardNo()+","+schoolCard.getCardPwd()+","+ 113 | schoolCard.getBalance()+","+lossFlag+","+ 114 | schoolCard.getUserName()+","+delFlag+"\r\n"); 115 | } 116 | ow.flush(); 117 | ow.close(); 118 | fw.close(); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/edu/school/card/frame/util/BeanUtils.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.frame.util; 2 | 3 | import edu.school.card.anon.ChangeValue; 4 | 5 | import java.io.*; 6 | import java.lang.reflect.Field; 7 | import java.math.BigDecimal; 8 | import java.util.*; 9 | 10 | /** 11 | * 创建bean工具类 12 | * @date 2020/11/24 13 | */ 14 | public class BeanUtils { 15 | 16 | public Map getBeanMap(String pathName, Class clazz){ 17 | String pathOut = getPathOut(pathName); 18 | HashMap map = new HashMap<>(); 19 | BufferedReader br = null; 20 | FileInputStream fis = null; 21 | InputStreamReader isr = null; 22 | try { 23 | fis = new FileInputStream(pathOut); 24 | isr = new InputStreamReader(fis, "UTF-8"); 25 | br = new BufferedReader(isr); 26 | String line = null; 27 | while ((line = br.readLine()) != null){ 28 | createBean(line, clazz, map); 29 | } 30 | } catch (Exception e) { 31 | e.printStackTrace(); 32 | }finally { 33 | try { 34 | br.close(); 35 | isr.close(); 36 | fis.close(); 37 | } catch (IOException e) { 38 | e.printStackTrace(); 39 | } 40 | } 41 | return map; 42 | } 43 | 44 | public static String getPathOut(String pathName) { 45 | String path = BeanUtils.class.getClassLoader().getResource("").getPath().substring(1); 46 | String[] paths = path.split("/"); 47 | String pathOut = ""; 48 | for (int i = 0; i < paths.length; i++) { 49 | int count = paths.length - 4; 50 | if (i < count){ 51 | pathOut += paths[i]+"/"; 52 | } 53 | } 54 | pathOut = pathOut.substring(0, pathOut.length() - 1)+"/CampusCardManagementSystem/src/edu/school/card/conf/"+pathName; 55 | return pathOut; 56 | } 57 | 58 | public Vector getBeanVector(String path, Class clazz){ 59 | Vector vector = new Vector<>(); 60 | FileReader fr = null; 61 | BufferedReader br = null; 62 | try { 63 | fr = new FileReader(path); 64 | br = new BufferedReader(fr); 65 | String line = null; 66 | while ((line = br.readLine()) != null){ 67 | T bean = createBean(line, clazz); 68 | vector.add(bean); 69 | } 70 | } catch (Exception e) { 71 | e.printStackTrace(); 72 | } 73 | return vector; 74 | } 75 | 76 | private T createBean(String line, Class clazz) { 77 | String[] lines = line.split(","); 78 | Field[] fields = clazz.getDeclaredFields(); 79 | T obj = null; 80 | try { 81 | obj = clazz.newInstance(); 82 | for (Field field : fields) { 83 | ChangeValue anon = field.getAnnotation(ChangeValue.class); 84 | if (anon == null){ 85 | continue; 86 | } 87 | int index = anon.index(); 88 | String val = lines[index]; 89 | field.setAccessible(true); 90 | String pattern = anon.pattern(); 91 | if ("".equals(pattern)){ 92 | changeType(field,obj,val); 93 | }else { 94 | String[] ps = pattern.split(","); 95 | for (String p : ps) { 96 | String[] pv = p.split("="); 97 | if (val.equals(pv[0])){ 98 | val = pv[1]; 99 | changeType(field,obj,val); 100 | } 101 | } 102 | } 103 | } 104 | } catch (Exception e) { 105 | e.printStackTrace(); 106 | } 107 | return obj; 108 | } 109 | 110 | private void createBean(String line, Class clazz, HashMap map) { 111 | String[] lines = line.split(","); 112 | Field[] fields = clazz.getDeclaredFields(); 113 | T obj = null; 114 | Long key = 0L; 115 | try { 116 | obj = clazz.newInstance(); 117 | for (Field field : fields) { 118 | ChangeValue anon = field.getAnnotation(ChangeValue.class); 119 | if (anon == null){ 120 | continue; 121 | } 122 | int index = anon.index(); 123 | String val = lines[index]; 124 | if (index == 0){ 125 | key = Long.parseLong(val); 126 | } 127 | field.setAccessible(true); 128 | String pattern = anon.pattern(); 129 | if ("".equals(pattern)){ 130 | changeType(field,obj,val); 131 | }else { 132 | String[] ps = pattern.split(","); 133 | for (String p : ps) { 134 | String[] pv = p.split("="); 135 | if (val.equals(pv[0])){ 136 | val = pv[1]; 137 | changeType(field,obj,val); 138 | } 139 | } 140 | } 141 | } 142 | map.put(key,obj); 143 | } catch (Exception e) { 144 | e.printStackTrace(); 145 | } 146 | } 147 | 148 | private void changeType(Field field, T obj, String val) throws IllegalAccessException { 149 | Class type = field.getType(); 150 | String typeName = type.getName(); 151 | if (typeName.contains("String")){ 152 | field.set(obj,val); 153 | }else if (typeName.contains("Long")){ 154 | field.set(obj,Long.parseLong(val)); 155 | }else if (typeName.contains("BigDecimal")){ 156 | field.set(obj,new BigDecimal(val)); 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /src/edu/school/card/page/LoginPage.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.page; 2 | 3 | import edu.school.card.frame.component.BaseFrame; 4 | import edu.school.card.frame.component.Layer; 5 | 6 | import java.awt.*; 7 | import java.awt.event.MouseAdapter; 8 | import java.awt.event.MouseEvent; 9 | import java.awt.event.WindowAdapter; 10 | import java.awt.event.WindowEvent; 11 | import java.io.FileInputStream; 12 | import java.io.IOException; 13 | import java.io.InputStream; 14 | import java.util.Properties; 15 | 16 | public class LoginPage extends BaseFrame { 17 | 18 | private Panel container; 19 | private Label userNameLabel; 20 | private TextField userNameText; 21 | private Label passwordLabel; 22 | private TextField passwordText; 23 | private Button loginButton; 24 | private Button cancleButton; 25 | 26 | public void start(){ 27 | init("校园卡管理系统",500,400,true); 28 | createComponents(); 29 | } 30 | 31 | private void createComponents() { 32 | // 创建容器 33 | createContainer(); 34 | // 创建标题 35 | createTitle(); 36 | // 创建用户名 37 | createUserName(); 38 | // 创建密码 39 | createPassword(); 40 | // 创建登录按钮 41 | createLoginButton(); 42 | // 创建取消按钮 43 | createCancleButton(); 44 | // 后置处理器 45 | afterProsser(); 46 | // 创建监听器 47 | createListener(); 48 | } 49 | 50 | private void createListener() { 51 | loginButton.addMouseListener(new MouseAdapter() { 52 | @Override 53 | public void mouseClicked(MouseEvent e) { 54 | // 获取用户名 55 | String userName = userNameText.getText(); 56 | if ("".equals(userName)){ 57 | // 禁用组件 58 | enableComponents(false); 59 | // 用户名不能为空 60 | Layer.alert("用户名不能为空"); 61 | Layer.frame.addWindowListener(new WindowAdapter() { 62 | @Override 63 | public void windowClosing(WindowEvent e) { 64 | e.getWindow().setVisible(false); 65 | enableComponents(true); 66 | } 67 | }); 68 | return; 69 | } 70 | // 获取密码 71 | String password = passwordText.getText(); 72 | if ("".equals(password)){ 73 | // 禁用组件 74 | enableComponents(false); 75 | // 用户名不能为空 76 | Layer.alert("密码不能为空"); 77 | Layer.frame.addWindowListener(new WindowAdapter() { 78 | @Override 79 | public void windowClosing(WindowEvent e) { 80 | e.getWindow().setVisible(false); 81 | enableComponents(true); 82 | } 83 | }); 84 | return; 85 | } 86 | 87 | // 登录 88 | login(userName,password); 89 | } 90 | }); 91 | } 92 | 93 | /** 94 | * 登录 95 | * @param userName 96 | * @param password 97 | */ 98 | public void login(String userName, String password){ 99 | Properties properties = new Properties(); 100 | // 使用ClassLoader加载properties配置文件生成对应的输入流 101 | String path = this.getClass().getClassLoader().getResource("").getPath().substring(1); 102 | // 使用properties对象加载输入流 103 | InputStream in = null; 104 | try { 105 | in = new FileInputStream(path+"edu/school/card/conf/userInfo.properties"); 106 | properties.load(in); 107 | } catch (IOException e) { 108 | e.printStackTrace(); 109 | return; 110 | } 111 | //获取key对应的value值 112 | String username = properties.getProperty("username"); 113 | String pwd = properties.getProperty("password"); 114 | try { 115 | in.close(); 116 | } catch (IOException e) { 117 | e.printStackTrace(); 118 | return; 119 | } 120 | if (userName.equals(username)&&password.equals(pwd)){ 121 | // 关闭当前页面 122 | this.setVisible(false); 123 | // 打开管理页面 124 | CardManagerPage cardManagerPage = new CardManagerPage(); 125 | cardManagerPage.start(); 126 | return; 127 | } 128 | // 登录失败 129 | Layer.alert("登录失败,用户名或密码错误"); 130 | enableComponents(false); 131 | Layer.frame.addWindowListener(new WindowAdapter() { 132 | @Override 133 | public void windowClosing(WindowEvent e) { 134 | e.getWindow().setVisible(false); 135 | enableComponents(true); 136 | } 137 | }); 138 | } 139 | 140 | /** 141 | * 启用用组件 142 | */ 143 | private void enableComponents(boolean flag){ 144 | userNameText.setEditable(flag); 145 | passwordText.setEditable(flag); 146 | loginButton.setEnabled(flag); 147 | cancleButton.setEnabled(flag); 148 | } 149 | 150 | private void createLoginButton() { 151 | loginButton = new Button("登 录"); 152 | loginButton.setBounds(100,280,100,50); 153 | loginButton.setFont(new Font("宋体",Font.BOLD,20)); 154 | container.add(loginButton); 155 | } 156 | 157 | private void createCancleButton() { 158 | cancleButton = new Button("取 消"); 159 | cancleButton.setBounds(300,280,100,50); 160 | cancleButton.setFont(new Font("宋体",Font.BOLD,20)); 161 | container.add(cancleButton); 162 | } 163 | 164 | private void createPassword() { 165 | passwordLabel = new Label("密 码 : ", Label.RIGHT); 166 | passwordLabel.setBounds(0,200,200,50); 167 | passwordLabel.setFont(new Font("宋体",Font.BOLD,20)); 168 | container.add(passwordLabel); 169 | 170 | passwordText = new TextField(); 171 | passwordText.setEchoChar('*'); 172 | passwordText.setBounds(200,210,200,30); 173 | passwordText.setFont(new Font("宋体",Font.BOLD,20)); 174 | container.add(passwordText); 175 | } 176 | 177 | private void createUserName() { 178 | userNameLabel = new Label("用 户 名 : ", Label.RIGHT); 179 | userNameLabel.setBounds(0,150,200,50); 180 | userNameLabel.setFont(new Font("宋体",Font.BOLD,20)); 181 | container.add(userNameLabel); 182 | 183 | userNameText = new TextField(); 184 | userNameText.setBounds(200,160,200,30); 185 | userNameText.setFont(new Font("宋体",Font.BOLD,20)); 186 | container.add(userNameText); 187 | } 188 | 189 | private void afterProsser() { 190 | this.add(container); 191 | } 192 | 193 | private void createTitle() { 194 | Label title = new Label("校园卡管理系统", Label.CENTER); 195 | title.setBounds(0,40,500,100); 196 | title.setFont(new Font("宋体",Font.BOLD,30)); 197 | container.add(title); 198 | } 199 | 200 | private void createContainer() { 201 | container = new Panel(); 202 | container.setLayout(null); 203 | container.setSize(new Dimension(500,400)); 204 | container.setVisible(true); 205 | } 206 | } 207 | -------------------------------------------------------------------------------- /src/edu/school/card/controller/SchoolCardController.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.controller; 2 | 3 | import edu.school.card.bean.ConsumeInfo; 4 | import edu.school.card.bean.CreditInfo; 5 | import edu.school.card.bean.SchoolCard; 6 | import edu.school.card.cache.GlobalCache; 7 | import edu.school.card.enums.DelCode; 8 | import edu.school.card.enums.LossCode; 9 | import edu.school.card.frame.util.BeanUtils; 10 | 11 | import java.math.BigDecimal; 12 | import java.text.SimpleDateFormat; 13 | import java.util.*; 14 | 15 | /** 16 | * @date 2020/11/25 17 | */ 18 | public class SchoolCardController { 19 | 20 | /** 21 | * 开卡 22 | * @param pwd 23 | * @param balance 24 | * @param username 25 | */ 26 | public static void insertSchoolCard(String pwd, String balance, String username) { 27 | SchoolCard schoolCard = new SchoolCard(); 28 | schoolCard.setCardPwd(pwd); 29 | schoolCard.setBalance(new BigDecimal(balance)); 30 | schoolCard.setUserName(username); 31 | schoolCard.setDelFlag(DelCode.NO.getCode()+""); 32 | schoolCard.setLossFlag(LossCode.NO.getCode()+""); 33 | // 生成用户主键编号 34 | long cardNo = GlobalCache.getMaxCardNo() + 1; 35 | schoolCard.setCardNo(cardNo); 36 | // 向缓存中插入 37 | // 创建新Map 38 | HashMap copyMap = new HashMap<>(); 39 | copyMap.putAll(GlobalCache.getSchoolCardCache()); 40 | 41 | // 转换格式 42 | String delFlag = schoolCard.getDelFlag(); 43 | if (delFlag.equals(DelCode.YES.getCode()+"")){ 44 | schoolCard.setDelFlag(DelCode.YES.getValue()); 45 | }else { 46 | schoolCard.setDelFlag(DelCode.NO.getValue()); 47 | } 48 | 49 | String lossFlag = schoolCard.getLossFlag(); 50 | if (lossFlag.equals(LossCode.YES.getCode()+"")){ 51 | schoolCard.setLossFlag(LossCode.YES.getValue()); 52 | }else { 53 | schoolCard.setLossFlag(LossCode.NO.getValue()); 54 | } 55 | 56 | copyMap.put(cardNo,schoolCard); 57 | GlobalCache.setSchoolCardCache(copyMap); 58 | } 59 | 60 | /** 61 | * 挂失 62 | * @param cardNo 63 | */ 64 | public static void lossSchoolCard(String cardNo) { 65 | HashMap map = new HashMap<>(); 66 | Map schoolCardCache = GlobalCache.getSchoolCardCache(); 67 | map.putAll(schoolCardCache); 68 | 69 | Set set = map.keySet(); 70 | for (Long key : set) { 71 | SchoolCard schoolCard = schoolCardCache.get(key); 72 | if (schoolCard.getCardNo().toString().equals(cardNo)){ 73 | schoolCard.setLossFlag(LossCode.YES.getValue()); 74 | schoolCardCache.put(key,schoolCard); 75 | break; 76 | } 77 | } 78 | } 79 | 80 | /** 81 | * 删卡 82 | * @param cardNo 83 | */ 84 | public static void delSchoolCard(String cardNo) { 85 | HashMap map = new HashMap<>(); 86 | Map schoolCardCache = GlobalCache.getSchoolCardCache(); 87 | map.putAll(schoolCardCache); 88 | 89 | Set set = map.keySet(); 90 | for (Long key : set) { 91 | SchoolCard schoolCard = schoolCardCache.get(key); 92 | if (schoolCard.getCardNo().toString().equals(cardNo)){ 93 | schoolCard.setDelFlag(DelCode.YES.getValue()); 94 | schoolCardCache.put(key,schoolCard); 95 | break; 96 | } 97 | } 98 | } 99 | 100 | /** 101 | * 修改密码 102 | * @param cardNo 103 | * @param cardPwd 104 | */ 105 | public static void updateSchoolCard(String cardNo, String cardPwd) { 106 | HashMap map = new HashMap<>(); 107 | Map schoolCardCache = GlobalCache.getSchoolCardCache(); 108 | map.putAll(schoolCardCache); 109 | 110 | Set set = map.keySet(); 111 | for (Long key : set) { 112 | SchoolCard schoolCard = schoolCardCache.get(key); 113 | if (schoolCard.getCardNo().toString().equals(cardNo)){ 114 | if (schoolCard.getLossFlag().equals(LossCode.YES.getValue())){ 115 | return; 116 | } 117 | if (schoolCard.getDelFlag().equals(DelCode.YES.getValue())){ 118 | return; 119 | } 120 | schoolCard.setCardPwd(cardPwd); 121 | schoolCardCache.put(key,schoolCard); 122 | return; 123 | } 124 | } 125 | } 126 | 127 | /** 128 | * 查询校园卡信息 129 | * @param cardNo 130 | * @param cardUser 131 | */ 132 | public static void querySchoolCard(String cardNo, String cardUser) { 133 | HashMap map = new HashMap<>(); 134 | Map schoolCardCache = GlobalCache.getSchoolCardCache(); 135 | map.putAll(schoolCardCache); 136 | 137 | Set set = map.keySet(); 138 | for (Long key : set) { 139 | SchoolCard schoolCard = schoolCardCache.get(key); 140 | if (!cardNo.equals("")){ 141 | if (schoolCard.getCardNo().toString().equals(cardNo)){ 142 | if (schoolCard.getLossFlag().equals(LossCode.YES.getValue())){ 143 | return; 144 | } 145 | if (schoolCard.getDelFlag().equals(DelCode.YES.getValue())){ 146 | return; 147 | } 148 | GlobalCache.setQueryCurrentSchoolCard(schoolCard); 149 | return; 150 | } 151 | } 152 | 153 | if (!cardUser.equals("")){ 154 | if (schoolCard.getUserName().toString().equals(cardUser)){ 155 | if (schoolCard.getLossFlag().equals(LossCode.YES.getValue())){ 156 | return; 157 | } 158 | if (schoolCard.getDelFlag().equals(DelCode.YES.getValue())){ 159 | return; 160 | } 161 | GlobalCache.setQueryCurrentSchoolCard(schoolCard); 162 | return; 163 | } 164 | } 165 | } 166 | } 167 | 168 | /** 169 | * 充值 170 | * @param cardNo 171 | * @param balance 172 | */ 173 | public static void insertBalance(String cardNo, String balance) { 174 | if (GlobalCache.getCreditInfoCache().size() == 0){ 175 | BeanUtils utils = new BeanUtils<>(); 176 | GlobalCache.setCreditInfoCache(utils. 177 | getBeanMap( 178 | "credit.txt", 179 | CreditInfo.class)); 180 | } 181 | HashMap map = new HashMap<>(); 182 | Map schoolCardCache = GlobalCache.getSchoolCardCache(); 183 | map.putAll(schoolCardCache); 184 | 185 | Set set = map.keySet(); 186 | for (Long key : set) { 187 | SchoolCard schoolCard = schoolCardCache.get(key); 188 | if (schoolCard.getCardNo().toString().equals(cardNo)){ 189 | if (schoolCard.getLossFlag().equals(LossCode.YES.getValue())){ 190 | return; 191 | } 192 | if (schoolCard.getDelFlag().equals(DelCode.YES.getValue())){ 193 | return; 194 | } 195 | 196 | BigDecimal balance1 = schoolCard.getBalance(); 197 | BigDecimal bigDecimal = balance1.add(new BigDecimal(balance)); 198 | schoolCard.setBalance(bigDecimal); 199 | schoolCardCache.put(key,schoolCard); 200 | 201 | // 插入充值数据 202 | insertCredit(balance, schoolCard); 203 | return; 204 | } 205 | } 206 | } 207 | 208 | /** 209 | * 向充值表写入数据 210 | * @param balance 211 | * @param schoolCard 212 | */ 213 | private static void insertCredit(String balance, SchoolCard schoolCard) { 214 | CreditInfo creditInfo = new CreditInfo(); 215 | Long maxCreditId = GlobalCache.getMaxCreditId(); 216 | if (maxCreditId == null){ 217 | creditInfo.setCreditId(1L); 218 | }else { 219 | creditInfo.setCreditId(maxCreditId+1); 220 | } 221 | creditInfo.setCardNo(schoolCard.getCardNo()); 222 | creditInfo.setCreditBalance(new BigDecimal(balance)); 223 | creditInfo.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); 224 | 225 | // 向缓存中插入 226 | // 创建新Map 227 | HashMap copyMap = new HashMap<>(); 228 | copyMap.putAll(GlobalCache.getCreditInfoCache()); 229 | copyMap.put(creditInfo.getCreditId(),creditInfo); 230 | GlobalCache.setCreditInfoCache(copyMap); 231 | } 232 | 233 | /** 234 | * 消费 235 | * @param cardNo 236 | * @param balance 237 | */ 238 | public static void divBalance(String cardNo, String balance) { 239 | if (GlobalCache.getConsumeInfoCache().size() == 0){ 240 | BeanUtils utils = new BeanUtils<>(); 241 | Map conMap = utils.getBeanMap("consume.txt", ConsumeInfo.class); 242 | GlobalCache.setConsumeInfoCache(conMap); 243 | } 244 | HashMap map = new HashMap<>(); 245 | Map schoolCardCache = GlobalCache.getSchoolCardCache(); 246 | map.putAll(schoolCardCache); 247 | 248 | Set set = map.keySet(); 249 | for (Long key : set) { 250 | SchoolCard schoolCard = schoolCardCache.get(key); 251 | if (schoolCard.getCardNo().toString().equals(cardNo)){ 252 | if (schoolCard.getLossFlag().equals(LossCode.YES.getValue())){ 253 | return; 254 | } 255 | if (schoolCard.getDelFlag().equals(DelCode.YES.getValue())){ 256 | return; 257 | } 258 | 259 | BigDecimal balance1 = schoolCard.getBalance(); 260 | BigDecimal bigDecimal = balance1.subtract(new BigDecimal(balance)); 261 | // 消费超过余额,返回 262 | if (bigDecimal.compareTo(BigDecimal.ZERO) == -1){ 263 | GlobalCache.setWarn("本次消费超出卡中余额,请先充值"); 264 | return; 265 | } 266 | schoolCard.setBalance(bigDecimal); 267 | schoolCardCache.put(key,schoolCard); 268 | 269 | // 向消费表写入数据 270 | insertConsume(balance, schoolCard); 271 | return; 272 | } 273 | } 274 | } 275 | 276 | private static void insertConsume(String balance, SchoolCard schoolCard) { 277 | ConsumeInfo consumeInfo = new ConsumeInfo(); 278 | Long maxConsumeId = GlobalCache.getMaxConsumeId(); 279 | if (maxConsumeId == null){ 280 | consumeInfo.setConsumeId(1L); 281 | }else { 282 | consumeInfo.setConsumeId(maxConsumeId+1); 283 | } 284 | consumeInfo.setCardNo(schoolCard.getCardNo()); 285 | consumeInfo.setConsumeBalance(new BigDecimal(balance)); 286 | consumeInfo.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); 287 | 288 | // 向缓存中插入 289 | // 创建新Map 290 | HashMap copyMap = new HashMap<>(); 291 | copyMap.putAll(GlobalCache.getConsumeInfoCache()); 292 | copyMap.put(consumeInfo.getConsumeId(),consumeInfo); 293 | GlobalCache.setConsumeInfoCache(copyMap); 294 | } 295 | } 296 | -------------------------------------------------------------------------------- /src/edu/school/card/page/CardManagerPage.java: -------------------------------------------------------------------------------- 1 | package edu.school.card.page; 2 | 3 | import edu.school.card.bean.ConsumeInfo; 4 | import edu.school.card.bean.CreditInfo; 5 | import edu.school.card.bean.SchoolCard; 6 | import edu.school.card.cache.GlobalCache; 7 | import edu.school.card.controller.SchoolCardController; 8 | import edu.school.card.enums.DelCode; 9 | import edu.school.card.frame.component.BaseFrame; 10 | import edu.school.card.frame.component.Layer; 11 | import edu.school.card.frame.util.BeanUtils; 12 | import edu.school.card.frame.util.RegexUtils; 13 | 14 | import javax.swing.*; 15 | import javax.swing.table.DefaultTableModel; 16 | import java.awt.*; 17 | import java.awt.event.MouseAdapter; 18 | import java.awt.event.MouseEvent; 19 | import java.awt.event.WindowAdapter; 20 | import java.awt.event.WindowEvent; 21 | import java.util.Arrays; 22 | import java.util.HashMap; 23 | import java.util.Map; 24 | import java.util.Set; 25 | 26 | /** 27 | * @date 2020/11/24 28 | */ 29 | public class CardManagerPage extends BaseFrame { 30 | 31 | private Panel container; 32 | 33 | private JTable table; 34 | 35 | private String[] titles = {"卡编号","卡密码","卡余额","是否挂失","用户名"}; 36 | 37 | /** 38 | * 开卡 39 | */ 40 | // 卡编号 41 | private TextField startCardNoText; 42 | // 卡密码 43 | private TextField startCardPwdText; 44 | // 卡余额 45 | private TextField startCardYMoneyText; 46 | // 用户名 47 | private TextField startCardUserText; 48 | // 开卡按钮 49 | private Button startCardBtn; 50 | 51 | /** 52 | * 挂失卡 53 | */ 54 | // 卡号 55 | private TextField disAbleCardNoText; 56 | // 挂失按钮 57 | private Button disAbleBtn; 58 | 59 | /** 60 | * 删除卡 61 | */ 62 | // 卡号 63 | private TextField deleteCardNoText; 64 | // 删除按钮 65 | private Button deleteBtn; 66 | 67 | /** 68 | * 卡消费与卡充值 69 | */ 70 | // 卡号 71 | private TextField addCardNoText; 72 | // 余额 73 | private TextField addYMoneyText; 74 | // 充值按钮 75 | private Button addBtn; 76 | // 消费按钮 77 | private Button decBtn; 78 | 79 | /** 80 | * 修改密码 81 | */ 82 | // 卡号 83 | private TextField updateCardNoText; 84 | // 面 85 | private TextField updateCardPwdText; 86 | // 修改按钮 87 | private Button updateBtn; 88 | 89 | /** 90 | * 消费记录,充值记录 91 | */ 92 | // 卡号 93 | private TextField hisCardNoText; 94 | // 充值按钮 95 | private Button hisAddBtn; 96 | // 消费按钮 97 | private Button hisDecBtn; 98 | 99 | /** 100 | * 查询 101 | */ 102 | // 卡号 103 | private TextField queryCardNoText; 104 | // 用户名 105 | private TextField queryCardUserText; 106 | // 查询按钮 107 | private Button queryBtn; 108 | 109 | public void start(){ 110 | init("校园卡管理系统",1000,800,true); 111 | // 创建组件 112 | createComponents(); 113 | } 114 | 115 | private void createComponents() { 116 | // 创建容器 117 | createContainer(); 118 | // 创建表格 119 | createTable(); 120 | // 创建标题 121 | createTitle(); 122 | // 后置处理器 123 | afterProsser(); 124 | // 创建操作栏 125 | createTools(); 126 | // 创建监听事件 127 | createListener(); 128 | } 129 | 130 | /** 131 | * 监听事件 132 | */ 133 | private void createListener() { 134 | // 创建开卡监听事件 135 | createStartCardListener(); 136 | // 创建挂失卡监听事件 137 | createLossCardListener(); 138 | // 创建删除卡监听事件 139 | createDelCardListener(); 140 | // 创建修改卡密码监听事件 141 | createUpdatePwdListener(); 142 | // 创建查询卡信息事件 143 | createQuerySchoolCardListener(); 144 | // 监听充值 145 | createInsertBalanceListener(); 146 | // 监听消费 147 | createDivBalanceListener(); 148 | // 监听充值记录 149 | createInsertHistory(); 150 | // 监听消费记录 151 | createDivHistory(); 152 | } 153 | 154 | private void createDivHistory() { 155 | hisDecBtn.addMouseListener(new MouseAdapter() { 156 | @Override 157 | public void mouseClicked(MouseEvent e) { 158 | String cardNo = hisCardNoText.getText().trim(); 159 | if (alert(cardNo,"卡编号不能为空")){ 160 | return; 161 | } 162 | // 查询编号是否已存在 163 | if (alert2(cardNo,"卡编号不存在,请重新输入", GlobalCache.getSchoolCardCache())){ 164 | return; 165 | } 166 | 167 | // 查询消费记录 168 | getDivHistory(cardNo); 169 | } 170 | }); 171 | } 172 | 173 | private void getDivHistory(String cardNo) { 174 | int count = 0; 175 | if (GlobalCache.getConsumeInfoCache().size() == 0){ 176 | BeanUtils utils = new BeanUtils<>(); 177 | GlobalCache.setConsumeInfoCache(utils. 178 | getBeanMap( 179 | "consume.txt", 180 | ConsumeInfo.class)); 181 | } 182 | 183 | HashMap map = new HashMap<>(); 184 | // 判断卡号是否已被删除,删除则返回 185 | Map schoolCardCache = GlobalCache.getSchoolCardCache(); 186 | Set> entries = schoolCardCache.entrySet(); 187 | for (Map.Entry entry : entries) { 188 | SchoolCard schoolCard = entry.getValue(); 189 | if (schoolCard.getCardNo().toString().equals(cardNo)){ 190 | if (schoolCard.getDelFlag().equals(DelCode.YES.getValue())){ 191 | alert("该卡号已被删除,不可充值查询记录"); 192 | return; 193 | } 194 | 195 | // 查询 196 | Map consumeInfoCache = GlobalCache.getConsumeInfoCache(); 197 | Set> es = consumeInfoCache.entrySet(); 198 | for (Map.Entry e : es) { 199 | ConsumeInfo consumeInfo = e.getValue(); 200 | if (consumeInfo.getCardNo().toString().equals(cardNo)){ 201 | map.put(Long.parseLong(String.valueOf(count)),consumeInfo); 202 | count++; 203 | } 204 | } 205 | break; 206 | } 207 | } 208 | 209 | 210 | Object[][] data = new Object[map.size()][4]; 211 | for (int i = 0; i < data.length; i++) { 212 | Object[] datum = data[i]; 213 | ConsumeInfo consumeInfo = map.get(Long.parseLong(String.valueOf(i))); 214 | for (int j = 0; j < datum.length; j++) { 215 | if (j == 0){ 216 | data[i][j] = consumeInfo.getConsumeId(); 217 | continue; 218 | } 219 | if (j == 1){ 220 | data[i][j] = consumeInfo.getCardNo(); 221 | continue; 222 | } 223 | if (j == 2){ 224 | data[i][j] = consumeInfo.getConsumeBalance(); 225 | continue; 226 | } 227 | if (j == 3){ 228 | data[i][j] = consumeInfo.getCreateTime(); 229 | } 230 | } 231 | } 232 | 233 | String[] title = {"消费编号","卡编号","消费金额","消费时间"}; 234 | table.setModel(new DefaultTableModel(data,title)); 235 | clearInsertHistory(); 236 | } 237 | 238 | private void createInsertHistory() { 239 | hisAddBtn.addMouseListener(new MouseAdapter() { 240 | @Override 241 | public void mouseClicked(MouseEvent e) { 242 | String cardNo = hisCardNoText.getText().trim(); 243 | if (alert(cardNo,"卡编号不能为空")){ 244 | return; 245 | } 246 | // 查询编号是否已存在 247 | if (alert2(cardNo,"卡编号不存在,请重新输入", GlobalCache.getSchoolCardCache())){ 248 | return; 249 | } 250 | 251 | // 查询充值记录 252 | getInsertHistory(cardNo); 253 | } 254 | }); 255 | } 256 | 257 | private void getInsertHistory(String cardNo) { 258 | int count = 0; 259 | BeanUtils utils = new BeanUtils<>(); 260 | if (GlobalCache.getCreditInfoCache().size() == 0){ 261 | GlobalCache.setCreditInfoCache(utils. 262 | getBeanMap( 263 | "credit.txt", 264 | CreditInfo.class)); 265 | } 266 | 267 | HashMap map = new HashMap<>(); 268 | // 判断卡号是否已被删除,删除则返回 269 | Map schoolCardCache = GlobalCache.getSchoolCardCache(); 270 | Set> entries = schoolCardCache.entrySet(); 271 | for (Map.Entry entry : entries) { 272 | SchoolCard schoolCard = entry.getValue(); 273 | if (schoolCard.getCardNo().toString().equals(cardNo)){ 274 | if (schoolCard.getDelFlag().equals(DelCode.YES.getValue())){ 275 | alert("该卡号已被删除,不可充值查询记录"); 276 | return; 277 | } 278 | 279 | // 查询 280 | Map creditInfoCache = GlobalCache.getCreditInfoCache(); 281 | Set> es = creditInfoCache.entrySet(); 282 | for (Map.Entry e : es) { 283 | CreditInfo creditInfo = e.getValue(); 284 | if (creditInfo.getCardNo().toString().equals(cardNo)){ 285 | map.put(Long.parseLong(String.valueOf(count)),creditInfo); 286 | count++; 287 | } 288 | } 289 | break; 290 | } 291 | } 292 | 293 | Object[][] data = new Object[map.size()][4]; 294 | for (int i = 0; i < data.length; i++) { 295 | Object[] datum = data[i]; 296 | CreditInfo creditInfo = map.get(Long.parseLong(String.valueOf(i))); 297 | for (int j = 0; j < datum.length; j++) { 298 | if (j == 0){ 299 | data[i][j] = creditInfo.getCreditId(); 300 | continue; 301 | } 302 | if (j == 1){ 303 | data[i][j] = creditInfo.getCardNo(); 304 | continue; 305 | } 306 | if (j == 2){ 307 | data[i][j] = creditInfo.getCreditBalance(); 308 | continue; 309 | } 310 | if (j == 3){ 311 | data[i][j] = creditInfo.getCreateTime(); 312 | } 313 | } 314 | } 315 | 316 | String[] title = {"充值编号","卡编号","充值金额","充值时间"}; 317 | table.setModel(new DefaultTableModel(data,title)); 318 | clearInsertHistory(); 319 | } 320 | 321 | // /** 322 | // * 获取开卡用户信息 323 | // */ 324 | // private Object[][] getCreditMap() { 325 | // BeanUtils utils = new BeanUtils<>(); 326 | // if (GlobalCache.getSchoolCardCache().size() == 0){ 327 | // GlobalCache.setSchoolCardCache(utils. 328 | // getBeanMap( 329 | // "schoolcard.txt", 330 | // SchoolCard.class)); 331 | // } 332 | // Object[][] data = getObjects(); 333 | // return data; 334 | // } 335 | 336 | private void clearInsertHistory() { 337 | hisCardNoText.setText(null); 338 | } 339 | 340 | private void createDivBalanceListener() { 341 | decBtn.addMouseListener(new MouseAdapter() { 342 | @Override 343 | public void mouseClicked(MouseEvent e) { 344 | String cardNo = addCardNoText.getText().trim(); 345 | if (alert(cardNo,"卡编号不能为空")){ 346 | return; 347 | } 348 | // 查询编号是否已存在 349 | if (alert2(cardNo,"卡编号不存在,请重新输入", GlobalCache.getSchoolCardCache())){ 350 | return; 351 | } 352 | 353 | String balance = addYMoneyText.getText(); 354 | if (alert(balance,"卡余额不能为空")){ 355 | return; 356 | } 357 | if (balance.contains("-")){ 358 | alert("消费不能为负数"); 359 | return; 360 | } 361 | 362 | try { 363 | SchoolCardController.divBalance(cardNo,balance); 364 | }catch (Exception ex){ 365 | ex.printStackTrace(); 366 | alert("警告!!! 请输入正确的金额"); 367 | return; 368 | } 369 | 370 | if (GlobalCache.getWarn() != null){ 371 | alert(GlobalCache.getWarn()); 372 | return; 373 | } 374 | 375 | // 创建表格 376 | table.setModel(new DefaultTableModel(getSchoolCardMap(),titles)); 377 | // 清除数据 378 | clearInsertBalance(); 379 | } 380 | }); 381 | } 382 | 383 | private void createInsertBalanceListener() { 384 | addBtn.addMouseListener(new MouseAdapter() { 385 | @Override 386 | public void mouseClicked(MouseEvent e) { 387 | String cardNo = addCardNoText.getText().trim(); 388 | if (alert(cardNo,"卡编号不能为空")){ 389 | return; 390 | } 391 | // 查询编号是否已存在 392 | if (alert2(cardNo,"卡编号不存在,请重新输入", GlobalCache.getSchoolCardCache())){ 393 | return; 394 | } 395 | 396 | String balance = addYMoneyText.getText(); 397 | if (alert(balance,"卡余额不能为空")){ 398 | return; 399 | } 400 | if (balance.contains("-")){ 401 | alert("充值不能为负数"); 402 | return; 403 | } 404 | 405 | try { 406 | SchoolCardController.insertBalance(cardNo,balance); 407 | }catch (Exception ex){ 408 | ex.printStackTrace(); 409 | alert("警告!!! 请输入正确的金额"); 410 | return; 411 | } 412 | 413 | // 创建表格 414 | table.setModel(new DefaultTableModel(getSchoolCardMap(),titles)); 415 | // 清除数据 416 | clearInsertBalance(); 417 | } 418 | }); 419 | } 420 | 421 | private void clearInsertBalance() { 422 | addCardNoText.setText(null); 423 | addYMoneyText.setText(null); 424 | } 425 | 426 | private void createQuerySchoolCardListener() { 427 | queryBtn.addMouseListener(new MouseAdapter() { 428 | @Override 429 | public void mouseClicked(MouseEvent e) { 430 | String cardNo = queryCardNoText.getText(); 431 | String cardUser = queryCardUserText.getText(); 432 | 433 | if (cardNo.equals("")&&cardUser.equals("")){ 434 | // 显示全部 435 | // 创建表格 436 | table.setModel(new DefaultTableModel(getSchoolCardMap(),titles)); 437 | // 清除数据 438 | clearQueryCard(); 439 | return; 440 | }else if ((!cardNo.equals(""))&&cardUser.equals("")){ 441 | // 编号不为空时 442 | // 查询编号是否已存在 443 | if (alert2(cardNo,"卡编号不存在,请重新输入", GlobalCache.getSchoolCardCache())){ 444 | return; 445 | } 446 | 447 | }else if (cardNo.equals("")&&(!cardUser.equals(""))){ 448 | // 用户不为空时 449 | // 查询用户名是否已存在 450 | if (alertNoUser(cardUser,"卡用户名不存在,请修改用户名", GlobalCache.getSchoolCardCache())){ 451 | return; 452 | } 453 | } 454 | // 查询校园卡信息 455 | try { 456 | SchoolCardController.querySchoolCard(cardNo,cardUser); 457 | }catch (Exception ex){ 458 | ex.printStackTrace(); 459 | alert("警告!!!出现异常了"); 460 | return; 461 | } 462 | 463 | if (GlobalCache.getQueryCurrentSchoolCard() == null){ 464 | alert("查无此人!!!"); 465 | return; 466 | } 467 | 468 | // 创建表格 469 | table.setModel(new DefaultTableModel(getQueryCurrentSchoolCard(),titles)); 470 | // 清除数据 471 | clearQueryCard(); 472 | } 473 | }); 474 | } 475 | 476 | private Object[][] getQueryCurrentSchoolCard() { 477 | SchoolCard schoolCard = GlobalCache.getQueryCurrentSchoolCard(); 478 | Object[][] data = new Object[1][5]; 479 | for (int i = 0; i < data.length; i++) { 480 | Object[] datum = data[i]; 481 | for (int j = 0; j < datum.length; j++) { 482 | if (j == 0){ 483 | data[i][j] = schoolCard.getCardNo(); 484 | continue; 485 | } 486 | if (j == 1){ 487 | data[i][j] = schoolCard.getCardPwd(); 488 | continue; 489 | } 490 | if (j == 2){ 491 | data[i][j] = schoolCard.getBalance(); 492 | continue; 493 | } 494 | if (j == 3){ 495 | data[i][j] = schoolCard.getLossFlag(); 496 | continue; 497 | } 498 | if (j == 4){ 499 | data[i][j] = schoolCard.getUserName(); 500 | } 501 | } 502 | } 503 | return data; 504 | } 505 | 506 | private void clearQueryCard() { 507 | queryCardUserText.setText(null); 508 | queryCardNoText.setText(null); 509 | } 510 | 511 | private void createUpdatePwdListener() { 512 | updateBtn.addMouseListener(new MouseAdapter() { 513 | @Override 514 | public void mouseClicked(MouseEvent e) { 515 | // 获取卡用户名 516 | String cardNo = updateCardNoText.getText().trim(); 517 | if (alert(cardNo,"卡编号不能为空")){ 518 | return; 519 | } 520 | // 查询用户名是否已存在 521 | if (alert2(cardNo,"卡编号不存在,请重新输入", GlobalCache.getSchoolCardCache())){ 522 | return; 523 | } 524 | 525 | // 获取密码 526 | String cardPwd = updateCardPwdText.getText().trim(); 527 | if (alert(cardPwd, "卡密码不能为空")){ 528 | return; 529 | } 530 | if (alert(cardPwd, "卡密码长度不能小于6位",6)){ 531 | return; 532 | } 533 | if (alert("卡密码只能为数字或英文", RegexUtils.isNumberOrEnglish(cardPwd))){ 534 | return; 535 | } 536 | 537 | // 修改卡密码 538 | try { 539 | SchoolCardController.updateSchoolCard(cardNo,cardPwd); 540 | }catch (Exception ex){ 541 | ex.printStackTrace(); 542 | alert("警告!!!出现异常了"); 543 | return; 544 | } 545 | 546 | // 创建表格 547 | table.setModel(new DefaultTableModel(getSchoolCardMap(),titles)); 548 | // 清除数据 549 | clearUpdateCard(); 550 | } 551 | }); 552 | } 553 | 554 | private void clearUpdateCard() { 555 | updateCardNoText.setText(null); 556 | updateCardPwdText.setText(null); 557 | } 558 | 559 | /** 560 | * 删除 561 | */ 562 | private void createDelCardListener() { 563 | deleteBtn.addMouseListener(new MouseAdapter() { 564 | @Override 565 | public void mouseClicked(MouseEvent e) { 566 | String cardNo = deleteCardNoText.getText().trim(); 567 | if (alert(cardNo, "卡编号不能为空")){ 568 | return; 569 | } 570 | if (alert2(cardNo, "卡编号不存在,请重新输入",GlobalCache.getSchoolCardCache())){ 571 | return; 572 | } 573 | 574 | // 删除 575 | try { 576 | SchoolCardController.delSchoolCard(cardNo); 577 | }catch (Exception ex){ 578 | ex.printStackTrace(); 579 | alert("警告!!!出现异常了"); 580 | return; 581 | } 582 | 583 | // 创建表格 584 | table.setModel(new DefaultTableModel(getSchoolCardMap(),titles)); 585 | // 清除数据 586 | clearDelCard(); 587 | } 588 | }); 589 | } 590 | 591 | private void clearDelCard() { 592 | deleteCardNoText.setText(null); 593 | } 594 | 595 | /** 596 | * 挂失 597 | */ 598 | private void createLossCardListener() { 599 | disAbleBtn.addMouseListener(new MouseAdapter() { 600 | @Override 601 | public void mouseClicked(MouseEvent e) { 602 | String cardNo = disAbleCardNoText.getText().trim(); 603 | if (alert(cardNo, "卡编号不能为空")){ 604 | return; 605 | } 606 | if (alert2(cardNo, "卡编号不存在,请重新输入",GlobalCache.getSchoolCardCache())){ 607 | return; 608 | } 609 | 610 | // 挂失 611 | try { 612 | SchoolCardController.lossSchoolCard(cardNo); 613 | }catch (Exception ex){ 614 | ex.printStackTrace(); 615 | alert("警告!!!出现异常了"); 616 | return; 617 | } 618 | 619 | // 创建表格 620 | table.setModel(new DefaultTableModel(getSchoolCardMap(),titles)); 621 | // 清除数据 622 | clearLossCard(); 623 | } 624 | }); 625 | } 626 | 627 | private void clearLossCard() { 628 | disAbleCardNoText.setText(null); 629 | } 630 | 631 | /** 632 | * 开卡 633 | */ 634 | private void createStartCardListener() { 635 | startCardBtn.addMouseListener(new MouseAdapter() { 636 | @Override 637 | public void mouseClicked(MouseEvent e) { 638 | // 获取卡密码 639 | String pwd = startCardPwdText.getText().trim(); 640 | if (alert(pwd, "卡密码不能为空")){ 641 | return; 642 | } 643 | if (alert(pwd, "卡密码长度不能小于6位",6)){ 644 | return; 645 | } 646 | if (alert("卡密码只能为数字或英文", RegexUtils.isNumberOrEnglish(pwd))){ 647 | return; 648 | } 649 | // 获取卡余额 650 | String balance = startCardYMoneyText.getText().trim(); 651 | if (alert(balance,"卡余额不能为空")){ 652 | return; 653 | } 654 | // 获取卡用户名 655 | String username = startCardUserText.getText().trim(); 656 | if (alert(username,"卡用户名不能为空")){ 657 | return; 658 | } 659 | 660 | // 查询用户名是否已存在 661 | if (alert(username,"卡用户名已存在,请修改用户名", GlobalCache.getSchoolCardCache())){ 662 | return; 663 | } 664 | 665 | // 插入校园卡数据 666 | try { 667 | SchoolCardController.insertSchoolCard(pwd,balance,username); 668 | }catch (Exception ex){ 669 | alert("警告!!!出现异常了"); 670 | return; 671 | } 672 | // 创建表格 673 | table.setModel(new DefaultTableModel(getSchoolCardMap(),titles)); 674 | // 清除数据 675 | clearStartCard(); 676 | } 677 | }); 678 | } 679 | 680 | private void clearStartCard() { 681 | startCardPwdText.setText(null); 682 | startCardYMoneyText.setText(null); 683 | startCardUserText.setText(null); 684 | } 685 | 686 | public boolean alert(String value,String content){ 687 | if ("".equals(value)){ 688 | // 禁用组件 689 | enableComponents(false); 690 | // 用户名不能为空 691 | Layer.alert(content); 692 | Layer.frame.addWindowListener(new WindowAdapter() { 693 | @Override 694 | public void windowClosing(WindowEvent e) { 695 | e.getWindow().setVisible(false); 696 | enableComponents(true); 697 | } 698 | }); 699 | return true; 700 | } 701 | return false; 702 | } 703 | 704 | public void alert(String content){ 705 | // 禁用组件 706 | enableComponents(false); 707 | // 用户名不能为空 708 | Layer.alert(content); 709 | Layer.frame.addWindowListener(new WindowAdapter() { 710 | @Override 711 | public void windowClosing(WindowEvent e) { 712 | e.getWindow().setVisible(false); 713 | enableComponents(true); 714 | } 715 | }); 716 | } 717 | 718 | public boolean alert(String value,String content,int length){ 719 | if (value.length() < length){ 720 | // 禁用组件 721 | enableComponents(false); 722 | // 用户名不能为空 723 | Layer.alert(content); 724 | Layer.frame.addWindowListener(new WindowAdapter() { 725 | @Override 726 | public void windowClosing(WindowEvent e) { 727 | e.getWindow().setVisible(false); 728 | enableComponents(true); 729 | } 730 | }); 731 | return true; 732 | } 733 | return false; 734 | } 735 | 736 | public boolean alert(String value,String content, Map map){ 737 | boolean flag = false; 738 | Set> entries = map.entrySet(); 739 | for (Map.Entry entry : entries) { 740 | SchoolCard schoolCard = entry.getValue(); 741 | if (schoolCard.getUserName().equals(value)){ 742 | flag = true; 743 | break; 744 | } 745 | } 746 | 747 | if (flag){ 748 | // 禁用组件 749 | enableComponents(false); 750 | // 用户名不能为空 751 | Layer.alert(content); 752 | Layer.frame.addWindowListener(new WindowAdapter() { 753 | @Override 754 | public void windowClosing(WindowEvent e) { 755 | e.getWindow().setVisible(false); 756 | enableComponents(true); 757 | } 758 | }); 759 | return true; 760 | } 761 | return false; 762 | } 763 | 764 | public boolean alertNoUser(String value,String content, Map map){ 765 | boolean flag = true; 766 | Set> entries = map.entrySet(); 767 | for (Map.Entry entry : entries) { 768 | SchoolCard schoolCard = entry.getValue(); 769 | if (schoolCard.getUserName().equals(value)){ 770 | flag = false; 771 | break; 772 | } 773 | } 774 | 775 | if (flag){ 776 | // 禁用组件 777 | enableComponents(false); 778 | // 用户名不能为空 779 | Layer.alert(content); 780 | Layer.frame.addWindowListener(new WindowAdapter() { 781 | @Override 782 | public void windowClosing(WindowEvent e) { 783 | e.getWindow().setVisible(false); 784 | enableComponents(true); 785 | } 786 | }); 787 | return true; 788 | } 789 | return false; 790 | } 791 | 792 | public boolean alert2(String value,String content, Map map){ 793 | boolean flag = false; 794 | Set> entries = map.entrySet(); 795 | for (Map.Entry entry : entries) { 796 | SchoolCard schoolCard = entry.getValue(); 797 | if (schoolCard.getCardNo().toString().equals(value)){ 798 | flag = true; 799 | break; 800 | } 801 | } 802 | 803 | if (!flag){ 804 | // 禁用组件 805 | enableComponents(false); 806 | // 用户名不能为空 807 | Layer.alert(content); 808 | Layer.frame.addWindowListener(new WindowAdapter() { 809 | @Override 810 | public void windowClosing(WindowEvent e) { 811 | e.getWindow().setVisible(false); 812 | enableComponents(true); 813 | } 814 | }); 815 | return true; 816 | } 817 | return false; 818 | } 819 | 820 | public boolean alert(String content,boolean flag){ 821 | if (!flag){ 822 | // 禁用组件 823 | enableComponents(false); 824 | // 用户名不能为空 825 | Layer.alert(content); 826 | Layer.frame.addWindowListener(new WindowAdapter() { 827 | @Override 828 | public void windowClosing(WindowEvent e) { 829 | e.getWindow().setVisible(false); 830 | enableComponents(true); 831 | } 832 | }); 833 | return true; 834 | } 835 | return false; 836 | } 837 | 838 | private void enableComponents(boolean flag) { 839 | startCardPwdText.setEnabled(flag); 840 | startCardYMoneyText.setEnabled(flag); 841 | startCardUserText.setEnabled(flag); 842 | startCardBtn.setEnabled(flag); 843 | 844 | disAbleCardNoText.setEnabled(flag); 845 | disAbleBtn.setEnabled(flag); 846 | 847 | deleteCardNoText.setEnabled(flag); 848 | deleteBtn.setEnabled(flag); 849 | 850 | addCardNoText.setEnabled(flag); 851 | addYMoneyText.setEnabled(flag); 852 | addBtn.setEnabled(flag); 853 | decBtn.setEnabled(flag); 854 | 855 | updateCardNoText.setEnabled(flag); 856 | updateCardPwdText.setEnabled(flag); 857 | updateBtn.setEnabled(flag); 858 | 859 | hisCardNoText.setEnabled(flag); 860 | hisAddBtn.setEnabled(flag); 861 | hisDecBtn.setEnabled(flag); 862 | 863 | queryCardNoText.setEnabled(flag); 864 | queryCardUserText.setEnabled(flag); 865 | queryBtn.setEnabled(flag); 866 | } 867 | 868 | private void createTools() { 869 | // 创建卡编号标签 870 | createLabel(); 871 | // 创建开卡行 872 | createCardFirstRow(); 873 | // 创建挂失行 874 | createCardSecondRow(); 875 | // 创建删除行 876 | createCardThirdRow(); 877 | // 创建消费充值行 878 | createCardFourRow(); 879 | // 创建修改密码行 880 | createCardFifthRow(); 881 | // 创建充值消费记录行 882 | createCardSixRow(); 883 | // 创建查询行 884 | createCardSevenRow(); 885 | } 886 | 887 | private void createCardSevenRow() { 888 | queryCardNoText = new TextField(); 889 | queryCardNoText.setBounds(10,660,160,30); 890 | queryCardNoText.setFont(new Font("宋体",Font.BOLD,16)); 891 | 892 | queryCardUserText = new TextField(); 893 | queryCardUserText.setBounds(610,660,160,30); 894 | queryCardUserText.setFont(new Font("宋体",Font.BOLD,16)); 895 | 896 | queryBtn = new Button("查询"); 897 | queryBtn.setBounds(825,660,160,30); 898 | queryBtn.setFont(new Font("宋体",Font.BOLD,16)); 899 | 900 | container.add(queryBtn); 901 | container.add(queryCardNoText); 902 | container.add(queryCardUserText); 903 | } 904 | 905 | private void createCardSixRow() { 906 | hisCardNoText = new TextField(); 907 | hisCardNoText.setBounds(10,620,160,30); 908 | hisCardNoText.setFont(new Font("宋体",Font.BOLD,16)); 909 | 910 | hisAddBtn = new Button("充值记录"); 911 | hisAddBtn.setBounds(610,620,160,30); 912 | hisAddBtn.setFont(new Font("宋体",Font.BOLD,16)); 913 | 914 | hisDecBtn = new Button("消费记录"); 915 | hisDecBtn.setBounds(825,620,160,30); 916 | hisDecBtn.setFont(new Font("宋体",Font.BOLD,16)); 917 | 918 | container.add(hisDecBtn); 919 | container.add(hisAddBtn); 920 | container.add(hisCardNoText); 921 | } 922 | 923 | private void createCardFifthRow() { 924 | updateCardNoText = new TextField(); 925 | updateCardNoText.setBounds(10,580,160,30); 926 | updateCardNoText.setFont(new Font("宋体",Font.BOLD,16)); 927 | 928 | updateCardPwdText = new TextField(); 929 | updateCardPwdText.setBounds(210,580,160,30); 930 | updateCardPwdText.setFont(new Font("宋体",Font.BOLD,16)); 931 | 932 | updateBtn = new Button("修改密码"); 933 | updateBtn.setBounds(825,580,160,30); 934 | updateBtn.setFont(new Font("宋体",Font.BOLD,16)); 935 | 936 | container.add(updateBtn); 937 | container.add(updateCardNoText); 938 | container.add(updateCardPwdText); 939 | } 940 | 941 | private void createCardFourRow() { 942 | addCardNoText = new TextField(); 943 | addCardNoText.setBounds(10,540,160,30); 944 | addCardNoText.setFont(new Font("宋体",Font.BOLD,16)); 945 | 946 | addYMoneyText = new TextField(); 947 | addYMoneyText.setBounds(410,540,160,30); 948 | addYMoneyText.setFont(new Font("宋体",Font.BOLD,16)); 949 | 950 | addBtn = new Button("卡充值"); 951 | addBtn.setBounds(610,540,160,30); 952 | addBtn.setFont(new Font("宋体",Font.BOLD,16)); 953 | 954 | decBtn = new Button("卡消费"); 955 | decBtn.setBounds(825,540,160,30); 956 | decBtn.setFont(new Font("宋体",Font.BOLD,16)); 957 | 958 | container.add(addCardNoText); 959 | container.add(addYMoneyText); 960 | container.add(addBtn); 961 | container.add(decBtn); 962 | } 963 | 964 | private void createCardThirdRow() { 965 | deleteCardNoText = new TextField(); 966 | deleteCardNoText.setBounds(10,500,160,30); 967 | deleteCardNoText.setFont(new Font("宋体",Font.BOLD,16)); 968 | 969 | deleteBtn = new Button("删除"); 970 | deleteBtn.setBounds(825,500,160,30); 971 | deleteBtn.setFont(new Font("宋体",Font.BOLD,16)); 972 | 973 | container.add(deleteBtn); 974 | container.add(deleteCardNoText); 975 | } 976 | 977 | /** 978 | * 挂失 979 | */ 980 | private void createCardSecondRow() { 981 | disAbleCardNoText = new TextField(); 982 | disAbleCardNoText.setBounds(10,460,160,30); 983 | disAbleCardNoText.setFont(new Font("宋体",Font.BOLD,16)); 984 | 985 | disAbleBtn = new Button("挂失"); 986 | disAbleBtn.setBounds(825,460,160,30); 987 | disAbleBtn.setFont(new Font("宋体",Font.BOLD,16)); 988 | container.add(disAbleBtn); 989 | container.add(disAbleCardNoText); 990 | } 991 | 992 | /** 993 | * 开卡 994 | */ 995 | private void createCardFirstRow() { 996 | startCardNoText = new TextField(); 997 | startCardNoText.setBounds(10,420,160,30); 998 | startCardNoText.setFont(new Font("宋体",Font.BOLD,16)); 999 | 1000 | startCardPwdText = new TextField(); 1001 | startCardPwdText.setBounds(210,420,160,30); 1002 | startCardPwdText.setFont(new Font("宋体",Font.BOLD,16)); 1003 | 1004 | startCardYMoneyText = new TextField(); 1005 | startCardYMoneyText.setBounds(410,420,160,30); 1006 | startCardYMoneyText.setFont(new Font("宋体",Font.BOLD,16)); 1007 | 1008 | startCardUserText = new TextField(); 1009 | startCardUserText.setBounds(610,420,160,30); 1010 | startCardUserText.setFont(new Font("宋体",Font.BOLD,16)); 1011 | 1012 | startCardBtn = new Button("开卡"); 1013 | startCardBtn.setBounds(825,420,160,30); 1014 | startCardBtn.setFont(new Font("宋体",Font.BOLD,16)); 1015 | container.add(startCardBtn); 1016 | 1017 | container.add(startCardNoText); 1018 | container.add(startCardPwdText); 1019 | container.add(startCardYMoneyText); 1020 | container.add(startCardUserText); 1021 | container.add(startCardBtn); 1022 | } 1023 | 1024 | private void createLabel() { 1025 | Label cardNo = new Label("卡编号", Label.RIGHT); 1026 | cardNo.setBounds(50,380,65,40); 1027 | cardNo.setFont(new Font("宋体",Font.BOLD,16)); 1028 | 1029 | Label cardPwd = new Label("卡密码", Label.RIGHT); 1030 | cardPwd.setBounds(250,380,65,40); 1031 | cardPwd.setFont(new Font("宋体",Font.BOLD,16)); 1032 | 1033 | Label cardYMoney = new Label("卡余额", Label.RIGHT); 1034 | cardYMoney.setBounds(450,380,65,40); 1035 | cardYMoney.setFont(new Font("宋体",Font.BOLD,16)); 1036 | 1037 | Label cardUser = new Label("用户名", Label.RIGHT); 1038 | cardUser.setBounds(650,380,65,40); 1039 | cardUser.setFont(new Font("宋体",Font.BOLD,16)); 1040 | 1041 | Label cardOper = new Label("操作", Label.RIGHT); 1042 | cardOper.setBounds(860,380,65,40); 1043 | cardOper.setFont(new Font("宋体",Font.BOLD,16)); 1044 | 1045 | container.add(cardNo); 1046 | container.add(cardPwd); 1047 | container.add(cardYMoney); 1048 | container.add(cardUser); 1049 | container.add(cardOper); 1050 | } 1051 | 1052 | private void createTable() { 1053 | Object[][] datas = getSchoolCardMap();; 1054 | // titles = {"卡编号","卡密码","卡余额","是否挂失","用户名"}; 1055 | table = new JTable(datas, titles); 1056 | table.setBorder(BorderFactory.createLineBorder(Color.GRAY,1)); 1057 | table.setVisible(true); 1058 | table.setBounds(0,0,980,300); 1059 | table.getTableHeader().setPreferredSize(new Dimension(table.getWidth(),50)); 1060 | table.setRowHeight(30); 1061 | table.getTableHeader().setFont(new Font("宋体",Font.BOLD,16)); 1062 | table.setFont(new Font("宋体",Font.BOLD,16)); 1063 | table.setEnabled(false); 1064 | 1065 | JScrollPane panel = new JScrollPane(); 1066 | panel.setBorder(BorderFactory.createLineBorder(Color.GRAY,1)); 1067 | panel.setBounds(10,80,980,300); 1068 | panel.setVisible(true); 1069 | 1070 | panel.setViewportView(table); 1071 | container.add(panel); 1072 | container.setBackground(table.getTableHeader().getBackground()); 1073 | } 1074 | 1075 | /** 1076 | * 获取开卡用户信息 1077 | */ 1078 | private Object[][] getSchoolCardMap() { 1079 | BeanUtils utils = new BeanUtils<>(); 1080 | if (GlobalCache.getSchoolCardCache().size() == 0){ 1081 | GlobalCache.setSchoolCardCache(utils. 1082 | getBeanMap( 1083 | "schoolcard.txt", 1084 | SchoolCard.class)); 1085 | } 1086 | Object[][] data = getObjects(); 1087 | return data; 1088 | } 1089 | 1090 | private Object[][] getObjects() { 1091 | Map notDelSchoolMap = GlobalCache.getNotDelSchoolMap(); 1092 | Object[][] data = new Object[notDelSchoolMap.size()][5]; 1093 | // 数据重新整理 1094 | HashMap map = getDistinctSchoolCardMap(notDelSchoolMap); 1095 | for (int i = 0; i < data.length; i++) { 1096 | Object[] datum = data[i]; 1097 | SchoolCard schoolCard = map.get(Long.parseLong(String.valueOf(i))); 1098 | for (int j = 0; j < datum.length; j++) { 1099 | if (j == 0){ 1100 | data[i][j] = schoolCard.getCardNo(); 1101 | continue; 1102 | } 1103 | if (j == 1){ 1104 | data[i][j] = schoolCard.getCardPwd(); 1105 | continue; 1106 | } 1107 | if (j == 2){ 1108 | data[i][j] = schoolCard.getBalance(); 1109 | continue; 1110 | } 1111 | if (j == 3){ 1112 | data[i][j] = schoolCard.getLossFlag(); 1113 | continue; 1114 | } 1115 | if (j == 4){ 1116 | data[i][j] = schoolCard.getUserName(); 1117 | } 1118 | } 1119 | } 1120 | return data; 1121 | } 1122 | 1123 | private HashMap getDistinctSchoolCardMap(Map schoolCardCache) { 1124 | HashMap map = new HashMap<>(); 1125 | Set set = schoolCardCache.keySet(); 1126 | Object[] obj = set.toArray(); 1127 | Arrays.sort(obj); 1128 | long count = 0; 1129 | for (int i = 0; i < obj.length; i++) { 1130 | Object key = obj[i]; 1131 | map.put(count,schoolCardCache.get(key)); 1132 | count ++; 1133 | } 1134 | return map; 1135 | } 1136 | 1137 | private void createContainer() { 1138 | container = new Panel(); 1139 | container.setLayout(null); 1140 | container.setSize(new Dimension(1000,800)); 1141 | container.setVisible(true); 1142 | } 1143 | 1144 | private void afterProsser() { 1145 | this.add(container); 1146 | } 1147 | 1148 | private void createTitle() { 1149 | Label title = new Label("校园卡列表", Label.CENTER); 1150 | title.setBounds(0,20,1000,60); 1151 | title.setFont(new Font("宋体",Font.BOLD,25)); 1152 | container.add(title); 1153 | } 1154 | } 1155 | --------------------------------------------------------------------------------