如何找专业的网站建设公司wordpress justnews

张小明 2026/1/11 5:40:36
如何找专业的网站建设公司,wordpress justnews,查询网站注册信息,湖北省荆门市城乡建设网站1、演示视频 基于Java Swing的本地密码管理器2、项目截图 设计说明 3.1 整体架构设计 项目采用分层设计思想#xff0c;分为界面层、业务逻辑层、数据存储层、加密算法层#xff0c;各层职责清晰#xff0c;低耦合高内聚#xff1a; 界面层#xff08;GUI#xff09;分为界面层、业务逻辑层、数据存储层、加密算法层各层职责清晰低耦合高内聚界面层GUI基于Swing框架实现包含主界面、添加密码对话框、修改密码对话框负责用户交互业务逻辑层包含密码生成、数据校验、事件处理等逻辑衔接界面层和数据存储层数据存储层负责本地JSON文件的读写实现密码条目的增删改查加密算法层封装AES加密解密逻辑为密码存储提供安全保障。3.2 类结构设计类名所属层级核心职责AESUtil加密算法层实现AES-128加密/解密提供加密解密静态方法PasswordEntry数据模型层密码条目实体类封装网站、账号、加密密码属性PasswordStorage数据存储层处理本地JSON文件读写实现密码条目的增删改查PasswordGenerator业务逻辑层生成随机强密码确保密码包含多种字符类型PasswordManagerGUI界面层主界面类包含组件初始化、事件绑定、表格数据展示AddPasswordDialog界面层添加密码对话框处理密码添加的用户输入和提交EditPasswordDialog界面层修改密码对话框处理密码修改的用户输入和提交JHintTextField界面层自定义带占位符的文本框兼容JDK 83.3 数据存储设计数据存储采用JSON格式文件路径为System.getProperty(user.home) /passwords.json用户主目录存储结构为密码条目数组示例如下[ { website: 淘宝, account: user123taobao.com, password: 加密后的密码字符串 }, { website: 微信, account: 13800138000, password: 加密后的密码字符串 } ]采用JSON格式的优势可读性强、易于解析、跨平台兼容借助Gson库可快速实现Java对象与JSON字符串的转换。四、算法说明4.1 AES对称加密算法本项目采用AES-128加密算法CBC模式PKCS5Padding填充对密码进行加密核心参数密钥KEY固定16位字符串可自定义示例1234567890abcdef初始化向量IV固定16位字符串可自定义示例abcdef1234567890字符编码UTF-8加密结果Base64编码后的字符串便于存储和传输。加密流程将明文密码转换为UTF-8编码的字节数组通过密钥和IV初始化AES加密器ENCRYPT_MODE对字节数组进行加密得到加密后的字节数组将加密后的字节数组转换为Base64字符串作为最终存储的密码。解密流程将Base64编码的加密密码解码为字节数组通过密钥和IV初始化AES解密器DECRYPT_MODE对字节数组进行解密得到明文密码的字节数组将字节数组转换为UTF-8编码的字符串得到原始密码。4.2 随机强密码生成算法强密码生成算法确保生成的密码包含大写字母、小写字母、数字、特殊符号四类字符且长度可自定义≥8位核心步骤定义四类字符的字符集大写字母A-Z、小写字母a-z、数字0-9、特殊符号!#$%^*()_-[]{}|;:,.?确保密码至少包含每类字符各一个填充剩余长度的随机字符从所有字符集中随机选取打乱密码字符顺序避免前四位固定为四类字符的顺序返回最终生成的随机密码。注意密码长度建议不小于8位长度越长密码安全性越高特殊符号的加入可大幅提升密码的抗破解能力。五、测试说明5.1 测试环境测试项测试环境JDK版本JDK 81.8.0_301操作系统Windows 10 / macOS 14 / Ubuntu 22.04依赖库Gson 2.8.9JSON解析5.2 功能测试用例测试用例ID测试功能测试步骤预期结果测试结果TC001添加密码1. 点击“添加密码”按钮2. 输入网站“测试网站”、账号“test163.com”、密码“123456”3. 点击“保存”提示“添加成功”表格中显示该条目passwords.json文件新增该记录密码为加密后字符串通过TC002查询密码1. 在搜索框输入“测试”2. 点击“查询”按钮表格仅显示包含“测试”关键词的密码条目通过TC003修改密码1. 选择“测试网站”条目2. 点击“修改密码”3. 输入新密码“654321”4. 点击“保存修改”提示“修改成功”表格中该条目密码更新为新的加密字符串原密码可通过“显示原密码”查看通过TC004删除密码1. 选择“测试网站”条目2. 点击“删除密码”3. 确认删除提示“删除成功”表格中该条目消失passwords.json文件中该记录被删除通过TC005生成强密码1. 点击“生成强密码”2. 输入长度“12”3. 确认生成弹出窗口显示12位随机密码包含大小写、数字、特殊符号密码可复制到剪贴板通过TC006加密解密验证1. 添加密码“123456”2. 解密加密后的字符串解密结果与原始密码一致通过5.3 边界测试密码长度测试生成长度为8位、16位、32位的密码验证生成结果符合规则空输入测试添加密码时网站/账号/密码为空验证系统提示“不能为空”关键词为空测试查询框为空时点击查询显示所有密码条目无效数字测试生成密码时输入非数字长度如“abc”验证系统提示“请输入有效的数字”短密码测试生成密码时输入长度“7”验证系统提示“密码长度不能小于8位”。六、关键代码6.1 AES加密解密工具类AESUtil.java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; /** * AES加密工具类兼容JDK8CBC模式PKCS5Padding填充 */ public class AESUtil { // 加密密钥建议替换为自己的密钥长度必须是16位AES-128、24位AES-192或32位AES-256 private static final String KEY 1234567890abcdef; // 初始化向量IV长度必须是16位 private static final String IV abcdef1234567890; /** * AES加密 * param content 要加密的内容 * return 加密后的Base64字符串 * throws Exception 加密异常 */ public static String encrypt(String content) throws Exception { SecretKeySpec secretKey new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), AES); IvParameterSpec iv new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8)); Cipher cipher Cipher.getInstance(AES/CBC/PKCS5Padding); cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); byte[] encrypted cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encrypted); } /** * AES解密 * param content 加密后的Base64字符串 * return 解密后的原始字符串 * throws Exception 解密异常 */ public static String decrypt(String content) throws Exception { SecretKeySpec secretKey new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), AES); IvParameterSpec iv new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8)); Cipher cipher Cipher.getInstance(AES/CBC/PKCS5Padding); cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); byte[] decoded Base64.getDecoder().decode(content); byte[] decrypted cipher.doFinal(decoded); return new String(decrypted, StandardCharsets.UTF_8); } } 6.2 强密码生成工具类PasswordGenerator.java import java.util.Random; /** * 随机强密码生成工具类 */ public class PasswordGenerator { // 密码包含的字符大写字母、小写字母、数字、特殊符号 private static final String UPPER_CASE ABCDEFGHIJKLMNOPQRSTUVWXYZ; private static final String LOWER_CASE abcdefghijklmnopqrstuvwxyz; private static final String NUMBERS 0123456789; private static final String SYMBOLS !#$%^*()_-[]{}|;:,.?; private static final String ALL_CHARS UPPER_CASE LOWER_CASE NUMBERS SYMBOLS; private static final Random RANDOM new Random(); /** * 生成随机强密码 * param length 密码长度建议至少8位 * return 随机密码 */ public static String generateStrongPassword(int length) { if (length 8) { throw new IllegalArgumentException(密码长度不能小于8位); } StringBuilder password new StringBuilder(); // 确保包含至少一种大写、小写、数字、特殊符号 password.append(UPPER_CASE.charAt(RANDOM.nextInt(UPPER_CASE.length()))); password.append(LOWER_CASE.charAt(RANDOM.nextInt(LOWER_CASE.length()))); password.append(NUMBERS.charAt(RANDOM.nextInt(NUMBERS.length()))); password.append(SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()))); // 填充剩余字符 for (int i 4; i length; i) { password.append(ALL_CHARS.charAt(RANDOM.nextInt(ALL_CHARS.length()))); } // 打乱字符顺序避免前四位固定为大写、小写、数字、符号 return shuffleString(password.toString()); } /** * 打乱字符串顺序 * param str 原始字符串 * return 打乱后的字符串 */ private static String shuffleString(String str) { char[] chars str.toCharArray(); for (int i chars.length - 1; i 0; i--) { int j RANDOM.nextInt(i 1); char temp chars[i]; chars[i] chars[j]; chars[j] temp; } return new String(chars); } } 6.3 数据存储工具类PasswordStorage.java import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.*; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; /** * 密码数据存储工具类处理本地JSON文件的读写 */ public class PasswordStorage { // 数据存储的本地文件路径用户主目录下的passwords.json private static final String STORAGE_FILE System.getProperty(user.home) File.separator passwords.json; private static final Gson gson new Gson(); private static final Type LIST_TYPE new TypeToken() {}.getType(); /** * 读取所有密码信息 * return 密码列表 */ public static List loadPasswords() { File file new File(STORAGE_FILE); if (!file.exists()) { return new ArrayList(); } try (Reader reader new FileReader(file)) { return gson.fromJson(reader, LIST_TYPE); } catch (Exception e) { e.printStackTrace(); return new ArrayList(); } } /** * 保存密码列表到本地文件 * param entries 密码列表 * return 是否保存成功 */ public static boolean savePasswords(List entries) { try (Writer writer new FileWriter(STORAGE_FILE)) { gson.toJson(entries, writer); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 添加密码条目 * param entry 密码条目 * return 是否添加成功 */ public static boolean addPassword(PasswordEntry entry) { List entries loadPasswords(); entries.add(entry); return savePasswords(entries); } /** * 根据网站和账号删除密码条目 * param website 网站 * param account 账号 * return 是否删除成功 */ public static boolean deletePassword(String website, String account) { List entries loadPasswords(); boolean removed entries.removeIf(e - e.getWebsite().equals(website) e.getAccount().equals(account)); if (removed) { return savePasswords(entries); } return false; } /** * 根据网站和账号修改密码 * param website 网站 * param account 账号 * param newPassword 新密码加密后的 * return 是否修改成功 */ public static boolean updatePassword(String website, String account, String newPassword) { List entries loadPasswords(); for (PasswordEntry entry : entries) { if (entry.getWebsite().equals(website) entry.getAccount().equals(account)) { entry.setPassword(newPassword); return savePasswords(entries); } } return false; } /** * 查询密码条目支持模糊查询网站或账号 * param keyword 关键词 * return 匹配的密码列表 */ public static List searchPasswords(String keyword) { List entries loadPasswords(); List result new ArrayList(); for (PasswordEntry entry : entries) { if (entry.getWebsite().contains(keyword) || entry.getAccount().contains(keyword)) { result.add(entry); } } return result; } } 6.4 自定义占位符文本框JHintTextField.java import javax.swing.*; import java.awt.*; /** * 自定义带占位符的文本框兼容JDK8修复尺寸和输入问题 */ public class JHintTextField extends JTextField { private String hint; // 占位符文字 // 构造方法1仅指定占位符使用默认列数20 public JHintTextField(String hint) { this(hint, 20); // 默认20列确保有足够宽度 } // 构造方法2指定占位符和列数推荐使用 public JHintTextField(String hint, int columns) { super(columns); // 调用父类的列数构造方法设置文本框列数 this.hint hint; } Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 如果文本框为空绘制占位符 if (getText().isEmpty() hint ! null) { Graphics2D g2 (Graphics2D) g; g2.setColor(Color.GRAY); // 占位符文字颜色 // 调整占位符的绘制位置与文本框的默认文字对齐 int y g.getFontMetrics().getAscent() (getHeight() - g.getFontMetrics().getHeight()) / 2; g2.drawString(hint, getInsets().left, y); } } // 可选重写首选尺寸确保占位符文字能完整显示 Override public Dimension getPreferredSize() { Dimension size super.getPreferredSize(); if (hint ! null) { FontMetrics fm getFontMetrics(getFont()); int hintWidth fm.stringWidth(hint) getInsets().left getInsets().right 10; // 如果占位符宽度大于默认尺寸使用占位符宽度 size.width Math.max(size.width, hintWidth); } return size; } }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

在网站上做播放视频广告是否违法佛山全市住宅限购

5大亮点解密WanVideo:AI视频生成从此告别技术门槛 【免费下载链接】WanVideo_comfy 项目地址: https://ai.gitcode.com/hf_mirrors/Kijai/WanVideo_comfy 在人工智能视频创作领域,WanVideo项目以其创新的多模态融合技术,为普通用户打…

张小明 2026/1/10 8:36:57 网站建设

购物网站首页设计沧州网站制作教程

终极指南:WeChatPad如何实现微信多设备同时登录 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 在当今多设备普及的时代,微信的多设备登录限制给用户带来了诸多不便。WeChatPad项目通过…

张小明 2026/1/10 3:48:35 网站建设

wordpress评分中文版长沙哪里有网站推广优化

作为一名资深的软件测试工程师,我习惯于在自动化测试的世界里游刃有余——脚本是我的得力助手,它们不知疲倦地执行用例、捕捉缺陷,确保软件质量如磐石般稳固。然而,就在几个月前,一个看似平凡的周二,我经历…

张小明 2026/1/10 8:37:02 网站建设

莱芜网站建设自助建站优化网站 备份 还原

STM32F103RCT6原理图完整解析与硬件设计指南 【免费下载链接】STM32F103RCT6原理图资源下载 探索STM32F103RCT6的硬件设计奥秘,本资源为您提供了详尽的原理图,助力您的嵌入式开发之旅。无论您是经验丰富的工程师还是初入门的爱好者,这份原理图…

张小明 2026/1/10 8:37:02 网站建设

南宁企业网站设计公司大连高新园区邮编

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/10 8:37:03 网站建设