热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

初学Java8:通过JDBC实现简易人力资源管理系统

1,人力资源管理系统,实现查询、添加、修改、删除的功能。同时设计登录界面,实现注册、登录,修改密码的功能。通过登录进入人力资源管理系统。2,能实现将输入的数据保存到数据库,并实现对

1,人力资源管理系统,实现查询、添加、修改、删除的功能。同时设计登录界面,实现注册、登录,修改密码的功能。通过登录进入人力资源管理系统。

2,能实现将输入的数据保存到数据库,并实现对数据的查询,修改,删除。

3,在数据库设计两张表,分别是员工表t_staff(列包括id、姓名、性别、年龄),用户表t_user(列包括id、用户名、密码),

3,异常处理,未实现数据有效性验证。(上次已实现,这次主要练习目的是学习JDBC,故未实现)

4,MySQL数据库,客户端:SQLyog

 1 CREATE DATABASE HRMS_db DEFAULT CHARSET utf8;
 2 CREATE TABLE t_staff(
 3     id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
 4     NAME VARCHAR(5) NOT NULL,
 5     sex VARCHAR(1) NOT NULL,
 6     age INT NOT NULL    
 7 );
 8 
 9 SELECT * FROM t_staff;
10 
11 
12 CREATE TABLE t_user(
13     id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
14     NAME VARCHAR(10)  NOT NULL,
15     pswd VARCHAR(10)  NOT NULL
16 );
17 
18 SELECT * FROM t_user;

5,数据库工具类-用于人力资源管理系统,此次是把数据存入数据库,将对数据库的操作定义成方法,可以简化之后的程序,提高效率。

  1 package hrms;
  2 
  3 import java.sql.*;
  4 
  5 /**
  6  * 数据库工具类-用于人力资源管理系统,把数据存入数据库
  7  * 
  8  * @author A_zhi 2016-9-8
  9  *
 10  */
 11 public class DBUtil {
 12     /**
 13      * 定义final变量
 14      */
 15     public static final String DRIVER = "com.mysql.jdbc.Driver";//驱动
 16     public static final String URL = "jdbc:mysql://localhost:3306/hrms_db?characterEncoding=utf-8";//地址
 17     public static final String USER = "root";//客户端SQLyog用户名为“root”
 18     public static final String PASSWORD = "";//客户端SQLyog无密码
 19     private static Connection con = null;
 20 
 21     /**
 22      * 建立Java-MySQL间的连接
 23      * 
 24      * @return con
 25      * @throws Exception
 26      */
 27     public static Connection getConnection() throws Exception {
 28         Class.forName(DRIVER);//加载Java-MySQL驱动
 29         con = DriverManager.getConnection(URL, USER, PASSWORD);//建立连接
 30         return con;//返回连接
 31     }
 32 
 33     /**
 34      * 关闭 Connection
 35      * 
 36      * @throws Exception
 37      */
 38     public static void closeConnection() throws Exception {
 39         if (con != null && !con.isClosed()) {
 40             con.close();//关闭连接
 41             con = null;
 42         }
 43     }
 44 
 45     /**
 46      * 执行普通SQL命令
 47      * 
 48      * @return 要执行的SQL语句
 49      * @throws Exception
 50      */
 51     public static int executeUpdate(String sql) throws Exception {
 52         con = getConnection();// 连接数据库
 53         Statement st = con.createStatement();// 创建SQL命令
 54         int r = st.executeUpdate(sql);// 执行SQL命令
 55         closeConnection();// 关闭
 56         return r;// 返回
 57     }
 58 
 59     /**
 60      * 执行预编译SQL命令,可执行带"?"参数的SQL语句(增加,删除,修改)
 61      * 
 62      * @param sql
 63      *            要执行的SQL命令
 64      * @param obj
 65      *            未知数目和类型的变量
 66      * @return 要执行的SQL语句
 67      * @throws Exception
 68      */
 69     public static int executeUpdate(String sql, Object... obj) throws Exception {
 70         con = getConnection();
 71         PreparedStatement pst = con.prepareStatement(sql);// 预编译SQL命令
 72         if (obj != null && obj.length > 0) {
 73             for (int i = 0; i ) {
 74                 pst.setObject(i + 1, obj[i]);// 数据库从1开始,
 75             }
 76         }
 77         int r = pst.executeUpdate();
 78         closeConnection();
 79         return r;
 80     }
 81 
 82     /**
 83      * 账号验证  注册,登陆使用,输入用户名和密码存在返回true,否则返回false
 84      * @param name 用户名 pswd  密码
 85      * @return Boolean
 86      * @throws Exception
 87      */
 88     public static boolean queryLogin(String name,String pswd) throws Exception {
 89         String sql = "select name  from t_user where name=? and pswd=?";
 90         ResultSet rs = executeQuery(sql, name,pswd);
 91         if (rs.next())
 92             return true;
 93         else
 94             return false;
 95     }
 96 
 97     /**
 98      * 执行SQL查询命令
 99      * 
100      * @param sql
101      *            要执行的查询SQL命令
102      * @param obj
103      *            未知数目和类型的变量
104      * @return 结果集ResultSet
105      * @throws Exception
106      */
107     public static ResultSet executeQuery(String sql, Object... obj) throws Exception {
108         con = getConnection();
109         PreparedStatement pst = con.prepareStatement(sql);// 还是预编译
110         if (obj != null && obj.length > 0) {
111             for (int i = 0; i ) {
112                 pst.setObject(i + 1, obj[i]);
113             }
114         }
115         ResultSet rs = pst.executeQuery();
116         return rs;
117     }
118 }
119 // 对于封装的查询方法,不能在方法中关闭Connection,否则无法在进行查询
120 // 事先在方法外部定义Connection就是为了查询这个方法,其他方法中Connection可以定义在方法内
121 // 采用脱离连接的行集可以实现关闭connection也能查询,以下附其关键语法
122 // import javax.sql.rowset.CachedRowSet;
123 // import com.sun.rowset.CachedRowSetImpl;
124 // Connection con=DBUtil.getConnection();
125 // PreparedStatement pst=con.prepareStatement(sql);127 // ResultSet rs=pst.executeQuery();
128 // CachedRowSet crs=new CachedRowSetImpl();//创建行集
129 // crs.populate(rs);//将结果集保存到行集
130 // con.close();//关闭
131 // crs.last();//再查询
132 // System.out.println(crs.getString("name"));

6,人力资源管理系统,把数据存入数据库,运用封装,此类为系统的主界面以及操作方法,只有登录之后才能进入。

  1 package hrms;
  2 
  3 import java.util.Scanner;
  4 import java.sql.*;
  5 
  6 /**
  7  * 人力资源管理系统,把数据存入数据库(运用封装)
  8  * 
  9  * 此类提供主界面及其数据操作
 10  * 
 11  * @author A_zhi
 12  * 
 13  *         2016-9-8
 14  * 
 15  *         数据库信息:
 16  * 
 17  *         CREATE DATABASE HRMS_db DEFAULT CHARSET utf8; CREATE TABLE t_staff(
 18  *         id INT PRIMARY KEY NOT NULL AUTO_INCREMENT , NAME VARCHAR(5) NOT
 19  *         NULL, sex VARCHAR(1) NOT NULL, age INT NOT NULL );SELECT * FROM
 20  *         t_staff;
 21  *
 22  */
 23 public class HrmsByJdbc {
 24     public static Scanner sc = new Scanner(System.in);
 25 
 26     /**
 27      * 主界面,来自之前的复制
 28      */
 29     public static void mainInterface() {
 30         while (true) {
 31             System.out.println("\n\n");
 32             System.out.println("**********************************************");
 33             System.out.println("*            人力资源管理系统                 *");
 34             System.out.println("**********************************************");
 35             System.out.println("*             1、查看员工信息                 *");
 36             System.out.println("*             2、添加员工信息                 *");
 37             System.out.println("*             3、修改员工信息                 *");
 38             System.out.println("*             4、删除员工信息                 *");
 39             System.out.println("*             0、退出系统                     *");
 40             System.out.println("**********************************************");
 41             System.out.print("请选择:");
 42             int num = sc.nextInt();
 43             if (num == 0) {
 44                 System.out.println("\n  Thanks For Your Use!");
 45                 System.exit(0);//退出系统,之前用的是break,但是它却返回到了登录界面,所以百度得到这个表达式
 46             } else {
 47                 switch (num) {
 48                 case 1:
 49                     query();// 查询
 50                     break;
 51                 case 2:
 52                     add();// 添加
 53                     break;
 54                 case 3:
 55                     update();// 修改
 56                     break;
 57                 case 4:
 58                     del();// 删除
 59                     break;
 60                 default:
 61                     System.out.println("没有这个选项,请重新输入...");
 62                 }
 63             }
 64         }
 65     }
 66 
 67     // 1、查询
 68     private static void query() {
 69         System.out.print("您要查询全部信息还是单个员工信息?\n  a、全部,b、单个 :");
 70         String num1 = sc.next();
 71         String sql = null;
 72         try {
 73             switch (num1) {
 74             case "a":
 75                 sql = "select * from t_staff";
 76                 ResultSet rsa = DBUtil.executeQuery(sql);//调用工具类的方法
 77                 System.out.println("编号\t姓名\t性别\t年龄");
 78                 while (rsa.next()) {
 79                     int id = rsa.getInt(1);
 80                     String name = rsa.getString(2);
 81                     String sex = rsa.getString(3);
 82                     int age = rsa.getInt(4);
 83                     System.out.println(id + "\t" + name + "\t" + sex + "\t" + age);
 84                 }
 85                 break;
 86             case "b":
 87                 System.out.print("请输入您要查询的员工id:");
 88                 int idnum = sc.nextInt();
 89                 sql = "select * from t_staff where id=?";
 90                 ResultSet rsb = DBUtil.executeQuery(sql, idnum);
 91                 System.out.println("编号\t姓名\t性别\t年龄");
 92                 while (rsb.next()) {
 93                     int id = rsb.getInt(1);
 94                     String name = rsb.getString(2);
 95                     String sex = rsb.getString(3);
 96                     int age = rsb.getInt(4);
 97                     System.out.println(id + "\t" + name + "\t" + sex + "\t" + age);
 98                 }
 99                 break;
100             default:
101                 System.out.println("没有这个选项,请重新输入...");
102                 break;
103             }
104 
105         } catch (SQLException e) {
106             System.out.println("数据库错误:" + e.getMessage());
107             e.printStackTrace();
108         } catch (Exception e) {
109             System.out.println("其它错误" + e.getMessage());
110             e.printStackTrace();
111         } finally {
112             try {
113                 DBUtil.closeConnection();
114             } catch (Exception e) {
115                 System.out.println(e.getMessage());
116             }
117         }
118     }
119 
120     // 2、添加
121     private static void add() {
122         System.out.println("\t数据录入");
123         System.out.print("姓名:");
124         String name = sc.next();
125         System.out.print("性别:");
126         String sex = sc.next();
127         System.out.print("年龄:");
128         int age = sc.nextInt();
129         String sql = "INSERT INTO t_staff(NAME,sex,age) VALUES(?,?,?)";
130         try {
131             DBUtil.executeUpdate(sql, name, sex, age);
132             System.out.println("添加成功");
133         } catch (Exception e) {
134             System.out.println("错误:" + e.getMessage());
135         } finally {
136             try {
137                 DBUtil.closeConnection();
138             } catch (Exception e) {
139                 e.printStackTrace();
140             }
141         }
142     }
143 
144     // 3、修改
145     private static void update() {
146         String s1 = "select * from t_staff where id=?";
147         String s2 = "update  t_staff set name=? where id=?";
148         String s3 = "update  t_staff set sex=?  where id=?";
149         String s4 = "update  t_staff set age=?  where id=?";
150         System.out.print("请输入您要修改员工的id:");
151         int idnum3 = sc.nextInt();
152         try {
153             ResultSet rsb = DBUtil.executeQuery(s1, idnum3);
154             System.out.println("编号\t姓名\t性别\t年龄");
155             while (rsb.next()) {
156                 int id = rsb.getInt(1);
157                 String name = rsb.getString(2);
158                 String sex = rsb.getString(3);
159                 int age = rsb.getInt(4);
160                 System.out.println(id + "\t" + name + "\t" + sex + "\t" + age);
161             }
162             System.out.print("你是需要修改此人信息吗? y/n: ");
163             String as = sc.next();
164             if ("y".equals(as)) {
165                 System.out.print("你要修改的是:a、姓名,b、性别,c、年龄 :");
166                 String as1 = sc.next();
167                 if ("a".equals(as1)) {
168                     System.out.print("请输入姓名:");
169                     String inname = sc.next();
170                     DBUtil.executeUpdate(s2, inname, idnum3);
171                 } else if ("b".equals(as1)) {
172                     System.out.print("请输入性别:");
173                     String sex = sc.next();
174                     DBUtil.executeUpdate(s3, sex, idnum3);
175                 } else if ("c".equals(as1)) {
176                     System.out.print("请输入年龄:");
177                     int age = sc.nextInt();
178                     DBUtil.executeUpdate(s4, age, idnum3);
179                 } else {
180                     System.out.println("输入错误,请重新输入...");
181                 }
182             }
183             System.out.println("修改成功!");
184         } catch (Exception e) {
185             e.printStackTrace();
186         } finally {
187             try {
188                 DBUtil.closeConnection();
189             } catch (Exception e) {
190                 e.printStackTrace();
191             }
192         }
193 
194     }
195 
196     // 4、删除
197     private static void del() {
198         String s1 = "select * from t_staff where id=?";
199         String s2 = "delete from t_staff where id=?";
200         System.out.print("请输入您要删除员工的id:");
201         int idnum4 = sc.nextInt();
202         ResultSet rs4 = null;
203         try {
204             rs4 = DBUtil.executeQuery(s1, idnum4);
205             System.out.println("编号\t姓名\t性别\t年龄");
206             while (rs4.next()) {
207                 int id = rs4.getInt(1);
208                 String name = rs4.getString(2);
209                 String sex = rs4.getString(3);
210                 int age = rs4.getInt(4);
211                 System.out.println(id + "\t" + name + "\t" + sex + "\t" + age);
212             }
213             System.out.print("您确定要删除此人信息吗? y/n:");
214             String as = sc.next();
215             if ("y".equals(as)) {
216                 DBUtil.executeUpdate(s2, idnum4);
217                 System.out.println("删除成功!");
218             } else {
219                 System.out.println("删除取消!");
220             }
221         } catch (Exception e) {
222             e.getMessage();
223         } finally {
224             try {
225                 DBUtil.closeConnection();
226             } catch (Exception e) {
227                 e.printStackTrace();
228             }
229         }
230     }
231 }

7,登录类,提供账户注册、登录、修改密码的方法

 1 package hrms;
 2 
 3 import java.util.Scanner;
 4 
 5 /**
 6  * 人力资源管理系统 用户操作
 7  * 
 8  * 提供注册,登录,修改密码的方法
 9  * 
10  * 数据库信息:
11  * 
12  * CREATE TABLE t_user( id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, NAME
13  * VARCHAR(10) NOT NULL, pswd VARCHAR(10) NOT NULL );
14  * 
15  * @author A_zhi
16  * 
17  *         2016-9-9
18  */
19 public class Login {
20     private static Scanner sc = new Scanner(System.in);
21 
22     /**
23      * 注册
24      * 
25      * @throws Exception
26      */
27     public static void register() throws Exception {
28         System.out.println("\n");
29         System.out.println("*--------------------------------------------*");
30         System.out.println("*++++++++++欢迎登录人力资源管理系统+++++++++++*");
31         System.out.println("*--------------------------------------------*");
32         String sql = "insert into t_user(name,pswd) values(?,?)";
33         System.out.println("\n");
34         while (true) {
35             System.out.print("请输入用户名:");
36             String inname = sc.next();
37             System.out.print("  请设置密码:");
38             String inpswd = sc.next();
39             boolean b = DBUtil.queryLogin(inname, inpswd);
40             if (b) {
41                 System.out.println("\n该用户名已存在,请重新输入...");
42             } else {
43                 DBUtil.executeUpdate(sql, inname, inpswd);
44                 System.out.print("\n注册成功!欢迎登录!是否立即登陆?y/n :");
45                 String as = sc.next();
46                 if ("y".equals(as)) {
47                     login();
48                 }
49                 break;
50             }
51         }
52     }
53 
54     /**
55      * 登录
56      */
57     public static void login() throws Exception {
58         System.out.println("\n");
59         int count = 0;
60         System.out.println("*--------------------------------------------*");
61         System.out.println("*++++++++++欢迎登录人力资源管理系统+++++++++++*");
62         System.out.println("*--------------------------------------------*");
63         while (true) {
64             System.out.println();
65             System.out.print("请输入用户名:");
66             String inname = sc.next();
67             System.out.print("  请输入密码:");
68             String inpswd = sc.next();
69             boolean b = DBUtil.queryLogin(inname, inpswd);
70             if (b) {
71                 System.out.println("即将进入...");
72                 HrmsByJdbc.mainInterface();
73             } else {
74                 count++;
75                 System.out.println("账号与密码不匹配,请重新输入...\n");
76             }
77             if (count == 3) {
78                 System.out.println("您连续三次输入错误,已退出!");
79                 break;
80             }
81         }
82     }
83 
84     /**
85      * 修改密码
86      * 
87      * @throws Exception
88      */
89     public static void updatePswd() throws Exception {
90 
91         System.out.print("密码修改,之后补充!");
92         login();
93 
94     }
95 }

8,注册登录的主界面,提供主方法,是程序执行的入口

 1 package hrms;
 2 
 3 import java.util.Scanner;
 4 
 5 /**
 6  * 人力资源管理系统
 7  * 
 8  * 注册登录界面,程序执行入口
 9  * 
10  * @author A_zhi
11  *
12  *         2016-9-11
13  */
14 public class TextLogin {
15 
16     public static void main(String[] args) throws Exception {
17         Scanner sc = new Scanner(System.in);
18         while (true) {
19             System.out.println("\n");
20             System.out.println("*--------------------------------------------*");
21             System.out.println("*++++++++++欢迎登录人力资源管理系统+++++++++++*");
22             System.out.println("*--------------------------------------------*");
23             System.out.println("*++++++++++++++++1,注册++++++++++++++++++++++*");
24             System.out.println();
25             System.out.println("*++++++++++++++++2,登陆++++++++++++++++++++++*");
26             System.out.println();
27             System.out.println("*++++++++++++++++3,修改密码++++++++++++++++++*");
28             System.out.println();
29             System.out.println("*++++++++++++++++0,退出++++++++++++++++++++++*");
30             System.out.print("请选择:");
31             int num = sc.nextInt();
32             if (num == 0) {
33                 System.out.println("\n  Thanks For Your Use!");
34                 break;
35             } else {
36                 switch (num) {
37                 case 1:
38                     Login.register();
39                     break;
40                 case 2:
41                     Login.login();
42                     break;
43                 case 3:
44                     Login.updatePswd();;
45                     break;
46                 default:
47                     System.out.println("没有这个选项,请重新输入...");
48                 }
49             }
50         }
51         sc.close();
52     }
53 }

  至今学习Java已有一月有余,去上课前两天,我在家自己看看视频,当时在DOS输出了一个hello  world我都很高兴,一个多月过去了,程序从几行变成了上百行,这段时间很辛苦,很累,但是收获还是有的,虽然我不知道学了一个多月,能到现在的水平是够了还是不够,但是我问心无愧,我努力了。Java知识太多了,这段时间每天讲的都很多,有的甚至来不及消化,就又开始了新的内容,每天早上7点起床去学Java,下午7点回来,吃了饭再看看,还是感觉时间不够。接下来的时间还需要更加努力。

  那天晚上在一个Java学习群,有个自学了几天的朋友发了一个for循环的语句,但是是错的,他说他看着视频就能写,不看视频就出错,就是记不住,我回应道,没有什么代码是你去写十遍记不住的,如果有那就再写十遍。我以后也会尽量再多写对练的。

  加油!坚持!

                                                          A_zhi

                                                          2016-9-11

初学Java8:通过JDBC实现简易人力资源管理系统


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
author-avatar
从容嘛_100
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有