这很难吗?就是创建这些表,然后 增改查。
创建表信息语法:http://www.w3cschool.cn/sql_create_table.html

插入表信息语法:http://www.w3school.com.cn/sql/sql_insert.asp
更新表信息语法:http://www.w3school.com.cn/sql/sql_update.asp
这是我用来交作业的程序.虽然不是自己写的.传上来再说了.
等我自己的可以用了.再传...
package jettang
import java.lang.*
import java.awt.*
import java.awt.event.*
import javax.swing.*
import java.sql.*
//////////////////////////////////////////////
//主类
public class STU {
public STU() {
try {
jbInit()
} catch (Exception ex) {
ex.printStackTrace()
}
}
public static void main(String args[]) {
new Frm_Main()
}
private void jbInit() throws Exception {
}
}
//主框架,数据库
class Frm_Main implements ActionListener { //throws IOException
public static final int EXIT_ON_CLOSE = 0
public Jframe frame
public Container c
public JMenuBar menuBar
public JMenu mainMenu1
public JMenu mainMenu2
public JMenu mainMenu3
public JMenuItem subMenu1[] = new JMenuItem[5]
public JMenuItem subMenu2[] = new JMenuItem[7]
public JMenuItem subMenu3[] = new JMenuItem[2]
JButton toolBarButton[] = new JButton[8]
public JToolBar toolBar
//////////////////////////////////////////////
String strTip[] = {"姓名查询...", "添加信息...",
"删除...", "修改...", "修改确认...",
"添加确认...", "删除确认...", "关于产品信息:)"}
//////////////////////////////////////////////
// String id = new String()
String name = new String()
String sex = new String()
String age = new String()
String classid = new String()
String department = new String()
String call = new String()
//////////////////////////////////////////////
Connection con
ResultSet rs
Statement st
// ResultSetmetaData rsmd
// Vector columnHeads=new Vector()
// Vector rows = new Vector()
// Vector currentRow=new Vector()
///////////////////////////////////////////////
public JLabel classidL = new JLabel("班级")
public JLabel nameL = new JLabel("姓名")
public JLabel sexL = new JLabel("性别")
public JLabel ageL = new JLabel("年龄")
public JLabel departmentL = new JLabel("单位")
public JLabel callL = new JLabel("电话")
public JLabel tittleLabel = new JLabel()
//////////////////////////////////////////////
public JTextField classidT = new JTextField()
public JTextField nameT = new JTextField()
public JTextField sexT = new JTextField()
public JTextField ageT = new JTextField()
public JTextField departmentT = new JTextField()
public JTextField callT = new JTextField()
public Jtextarea textT = new Jtextarea()
//////////////////////////////////////////////
//////////////////////////////////////////////
public Frm_Main() {
/////////////////////////////////////////////////
frame = new Jframe("学籍管理系统V1.0")
c = frame.getContentPane()
c.setLayout(null)
menuBar = new JMenuBar()
toolBar = new JToolBar()
toolBar.setFloatable(false)
frame.setJMenuBar(menuBar)
frame.setResizable(false)
////////////////////////////////////////////////
mainMenu1 = new JMenu("管理")
String str1[] = {"添加", "删除", "查询", " ", "关闭"}
for (int i = 0i <5i++) {
if (i == 3) {
mainMenu1.addSeparator()
} else {
subMenu1[i] = new JMenuItem(str1[i])
subMenu1[i].addActionListener(this)
mainMenu1.add(subMenu1[i])
}
}
menuBar.add(mainMenu1)
/////////////////////////////////////////////////
mainMenu2 = new JMenu("操作")
String str2[] = {"查询", "添加", "删除", "修改",
"提交修改", "提交添加", "提交删除"}
for (int i = 0i <7i++) {
subMenu2[i] = new JMenuItem(str2[i])
subMenu2[i].addActionListener(this)
mainMenu2.add(subMenu2[i])
}
menuBar.add(mainMenu2)
/////////////////////////////////////////////////
mainMenu3 = new JMenu("集体查询")
String str3[] = {"按班级...", "按单位..."}
for (int i = 0i <2i++) {
subMenu3[i] = new JMenuItem(str3[i])
subMenu3[i].addActionListener(this)
mainMenu3.add(subMenu3[i])
}
menuBar.add(mainMenu3)
////////////////////////////////////////////////
String strToolBar[] = {"查询", "添加", "删除", "修改", "提交修改",
"提交添加", "提交删除", "关于"}
for (int i = 0i <8i++) {
toolBarButton[i] = new JButton(strToolBar[i])
toolBarButton[i].setToolTipText(strTip[i])
toolBarButton[i].addActionListener(this)
toolBar.add(toolBarButton[i])
}
toolBar.setLocation(0, 0)
toolBar.setSize(400, 30)
c.add(toolBar)
////////////////////////////////////////////////
classidL.setLocation(35, 40)
classidL.setSize(40, 20)
//classidL.setFont(new Font("",Font.BOLD,12))
c.add(classidL)
classidT.setLocation(90, 40)
classidT.setSize(200, 20)
//classidT.setEnabled(false)
c.add(classidT)
nameL.setLocation(35, 70)
nameL.setSize(40, 20)
c.add(nameL)
nameT.setLocation(90, 70)
nameT.setSize(200, 20)
c.add(nameT)
sexL.setLocation(35, 100)
sexL.setSize(40, 20)
c.add(sexL)
sexT.setLocation(90, 100)
sexT.setSize(200, 20)
c.add(sexT)
ageL.setLocation(35, 130)
ageL.setSize(40, 20)
c.add(ageL)
ageT.setLocation(90, 130)
ageT.setSize(200, 20)
c.add(ageT)
departmentL.setLocation(35, 160)
departmentL.setSize(40, 20)
c.add(departmentL)
departmentT.setLocation(90, 160)
departmentT.setSize(200, 20)
c.add(departmentT)
callL.setLocation(35, 190)
callL.setSize(40, 20)
c.add(callL)
callT.setLocation(90, 190)
callT.setSize(200, 20)
c.add(callT)
/////////////////////////////////////////////////
tittleLabel.setText("----------集体查询结果--------")
tittleLabel.setSize(300, 20)
tittleLabel.setLocation(10, 210)
c.add(tittleLabel)
////////////////////////////////////////////
textT.setSize(400, 300)
textT.setLocation(10, 240)
c.add(textT, 14)
///////////////////////////////////////////////
frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE)
frame.setSize(500, 650)
frame.setLocation(200, 200)
frame.setVisible(true)
conDB()
}
//以上是框架设计
//JDBC
public void conDB() {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "数据库错误")
}
try {
con = DriverManager.getConnection("jdbc:odbc:jettang", "sa", "")
st = con.createStatement()
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库连接失败")
}
}
//关闭连接
public void closeDB() {
try {
st.close()
con.close()
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库关闭失败")
}
}
//事件响应
public void actionPerformed(ActionEvent e) {
//////////////////////////////////////////////
if (e.getSource() == toolBarButton[7]) {
JOptionPane.showMessageDialog(null, "当前版本1.0,designed by qyq &wxm")
}
/////////////////////////////////////////////查询(按姓名)
if (e.getSource() == subMenu2[0] || e.getSource() == toolBarButton[0] ||
e.getSource() == subMenu1[2]) {
String idid = JOptionPane.showInputDialog("请输入学生姓名")
if (idid.trim() != "") {
String strSQL = "select * from stuinfo where name ='" + idid +
"'"
try {
rs = st.executeQuery(strSQL)
int count = 0
while (rs.next()) {
classid = rs.getString("classid")
name = rs.getString("name")
department = rs.getString("department")
sex = rs.getString("sex")
age = rs.getString("age")
call = rs.getString("call")
++count
}
if (count == 0) {
JOptionPane.showMessageDialog(null, "无此信息")
} else {
classidT.setText(classid)
nameT.setText(name)
sexT.setText(sex)
ageT.setText(age)
callT.setText(call)
departmentT.setText(department)
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "查询失败")
}
}
}
/////////////////////////////////////////////关闭
if (e.getSource() == subMenu1[4]) {
frame.dispose()
closeDB()
}
/////////////////////////////////////////////添加
if (e.getSource() == subMenu1[0] || e.getSource() == subMenu2[1] ||
e.getSource() == toolBarButton[1]) {
JOptionPane.showMessageDialog(null, "请输入你添加的信息再点击提交添加键")
classidT.setEnabled(true)
classidT.setText("")
nameT.setText("")
sexT.setText("")
ageT.setText("")
callT.setText("")
departmentT.setText("")
}
/////////////////////////////////////////////提交添加
if (e.getSource() == toolBarButton[5] || e.getSource() == subMenu2[5]) {
if ((classidT.getText().trim()).equals("") ||
(nameT.getText().trim()).equals("") ||
(sexT.getText().trim()).equals("") ||
(ageT.getText().trim()).equals("") ||
(callT.getText().trim()).equals("") ||
(departmentT.getText().trim()).equals("")) {
JOptionPane.showMessageDialog(null, "请先点击添加键")
} else {
classid = classidT.getText()
name = nameT.getText()
sex = sexT.getText()
age = ageT.getText()
call = callT.getText()
department = departmentT.getText()
String strSQL =
"insert into stuinfo(classid,name,sex,age,call,department) values('" +
classid + "','" +
name + "','" + sex + "','" + age + "','" + call + "','" +
department + "')"
try {
st.executeUpdate(strSQL)
} catch (Exception exx) {
JOptionPane.showMessageDialog(null, "添加失败")
return
}
JOptionPane.showMessageDialog(null, "添加成功")
classidT.setText("")
nameT.setText("")
sexT.setText("")
ageT.setText("")
callT.setText("")
departmentT.setText("")
}
}
////////////////////////////////////////////提交修改
if (e.getSource() == subMenu2[4] || e.getSource() == toolBarButton[4]) {
if ((classidT.getText().trim()).equals("") ||
(nameT.getText().trim()).equals("") ||
(sexT.getText().trim()).equals("")
|| (ageT.getText().trim()).equals("") ||
(callT.getText().trim()).equals("") ||
(departmentT.getText().trim()).equals("")) {
JOptionPane.showMessageDialog(null, "请先点击修改键")
return
} else {
classid = classidT.getText()
name = nameT.getText()
sex = sexT.getText()
age = ageT.getText()
call = callT.getText()
department = departmentT.getText()
String strSQL = "update stuinfo set classid='" + classid +
"',sex='" + sex + "',age='" + age + "',call='" +
call + "',department='" + department + "'" +
"where name='" + name + "'"
try {
st.executeUpdate(strSQL)
} catch (Exception exx) {
JOptionPane.showMessageDialog(null, "修改失败")
return
}
JOptionPane.showMessageDialog(null, "修改成功")
classidT.setText("")
nameT.setText("")
sexT.setText("")
ageT.setText("")
callT.setText("")
departmentT.setText("")
}
}
///////////////////////////////////////////////修改
if (e.getSource() == subMenu2[3] || e.getSource() == toolBarButton[3]) {
String idid = JOptionPane.showInputDialog
("请输入你要修改的学生姓名后点击提交修改键确认")
if (idid.trim() != "") {
String strSQL = "select * from stuinfo where name ='" + idid +
"'"
try {
rs = st.executeQuery(strSQL)
int count = 0
while (rs.next()) {
classid = rs.getString("classid")
name = rs.getString("name")
department = rs.getString("department")
sex = rs.getString("sex")
age = rs.getString("age")
call = rs.getString("call")
++count
}
if (count == 0) {
JOptionPane.showMessageDialog(null, "无此信息")
} else {
classidT.setText(classid)
nameT.setText(name)
sexT.setText(sex)
ageT.setText(age)
callT.setText(call)
departmentT.setText(department)
classidT.setEnabled(false)
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "修改失败")
}
}
}
/////////////////////////////////////////////////删除
if (e.getSource() == subMenu2[2] || e.getSource() == toolBarButton[2] ||
e.getSource() == subMenu1[1]) {
String idDel = JOptionPane.showInputDialog
("请输入要删除的学生姓名后点击提交删除键确认")
if (idDel.trim() != "") {
String strSQL = "select * from stuinfo where name ='" + idDel +
"'"
try {
rs = st.executeQuery(strSQL)
int count = 0
while (rs.next()) {
classid = rs.getString("classid")
name = rs.getString("name")
department = rs.getString("department")
sex = rs.getString("sex")
age = rs.getString("age")
call = rs.getString("call")
++count
}
if (count == 0) {
JOptionPane.showMessageDialog(null, "无此信息")
} else {
classidT.setText(classid)
nameT.setText(name)
sexT.setText(sex)
ageT.setText(age)
callT.setText(call)
departmentT.setText(department)
classidT.setEnabled(false)
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "删除失败")
}
}
}
//////////////////////////////////////////////////提交删除
if (e.getSource() == toolBarButton[6] ||
e.getSource() == subMenu2[6]) {
if ((classidT.getText().trim()).equals("") ||
(nameT.getText().trim()).equals("") ||
(sexT.getText().trim()).equals("") ||
(ageT.getText().trim()).equals("") ||
(callT.getText().trim()).equals("") ||
(departmentT.getText().trim()).equals("")) {
JOptionPane.showMessageDialog(null, "请先点击删除键")
return
} else {
name = nameT.getText()
String strSQL = "delete from stuinfo where name='" + name +
"'"
try {
st.executeUpdate(strSQL)
} catch (Exception exx) {
JOptionPane.showMessageDialog(null, "删除失败")
return
}
JOptionPane.showMessageDialog(null, "删除成功")
classidT.setText("")
nameT.setText("")
sexT.setText("")
ageT.setText("")
callT.setText("")
departmentT.setText("")
}
}
//////////////////////////////////////////////集体查询(按班级)
if (e.getSource() == subMenu3[0]) {
classidT.setText("")
nameT.setText("")
sexT.setText("")
ageT.setText("")
callT.setText("")
departmentT.setText("")
if ((classidT.getText().trim()).equals("")) {
String idclass = JOptionPane.showInputDialog("请输入班级")
String strSQL = "select * from stuinfo where classid='" +
idclass +
"'"
try {
rs = st.executeQuery(strSQL)
displayres(rs)
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "查询失败")
}
} else {
String idclass = classidT.getText()
String strSQL = "select * from stuinfo where classid='" +
idclass +
"'"
try {
rs = st.executeQuery(strSQL)
displayres(rs)
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "查询失败")
}
}
}
////////////////////////////按单位
if (e.getSource() == subMenu3[1]) {
classidT.setText("")
nameT.setText("")
sexT.setText("")
ageT.setText("")
callT.setText("")
departmentT.setText("")
if ((departmentT.getText().trim()).equals("")) {
String idclass = JOptionPane.showInputDialog("请输入单位")
String strSQL = "select * from stuinfo where department='" +
idclass +
"'"
try {
rs = st.executeQuery(strSQL)
displayres(rs)
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "查询失败")
}
} else {
String idclass = departmentT.getText()
String strSQL = "select * from stuinfo where department='" +
idclass +
"'"
try {
rs = st.executeQuery(strSQL)
displayres(rs)
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "查询失败")
}
}
}
}
public void displayres(ResultSet rs1) throws SQLException {
//定位到达第一条记录
boolean moreRecords = rs1.next()
//如果没有记录,则提示一条消息
if (!moreRecords) {
JOptionPane.showMessageDialog(null, "无此记录")
return
}
try {
//获取数据
getNextRow(rs1)
//刷新Table
c.validate()
}
catch (SQLException sqlex) {
sqlex.printStackTrace()
}
}
public void getNextRow(ResultSet rs2) throws
SQLException {
int count = 1
while (rs2.next()) {
name = " 姓名:" + rs2.getString(1)
age = " 年龄:" + rs2.getString(2) + " 单位:"
department = rs2.getString(3) + "n"
textT.append(count + "." + name + age + department)
count++
}
}
}
你要是想做一个简单的学生信息增删查改还是很容易的,但要做成教务系统就很繁琐,不光是jsp知识, 你还要会建数据库表,表的关联关系要理清楚。数据交互的方式,是json还是直接用el表达式。写代码要采用何种后台框架,原生的jdbc还是hibernate?struts2还是springmvc ....最好还是先把这些零散的知识都了解一遍再开始做。否则做下去发现很困难,及易打消自己的学习积极性。
学生选课系统的设计与实现摘要本文以一个具体的应用系统—学生选课信息系统的设计与实现来说明如何利用UML和EJB组件来设计和构建分布式软件系统平台。UML和组件技术结合使用能提高开发效率,增加系统的易维护性。关键词UMLEJB实例1引言现在信息管理系统软件的开发,采用组件技术可以提高效率,信息管理系统的分析设计也采用UML来进行。两者的结合可以极大的提高开发效率,保证系统开发的易维护性。本文用UML这种设计方法和EJB这种组件技术来设计和实现一个系统。2系统分析本系统设计为学生通过网页登陆学校网站,进行选课。下面用用例图来说明该系统要实现的功能。
2.1用例图2.2系统总体结构图本系统采用三层体系结构,分为表示层,事务处理层,数据存储层。三层结构层次清晰,易维护。图3类图学生选课系统涉及到三个实体类学生,课程,以及学生和课程之间的一个一对多关系类。对每一个类,映射到一张表。学生类和课程类用Container-ManagedEntityBean实现,学生和课程间的一对多关系类,用Bean-ManagedPersistence的EntityBean实现。再设计一个SessionBean对学生选课过程进行控制。页面显示部分用JSP实现。3数据库设计学生表对应学生实体,详细内容如下表1学生表关联表对应学生和课程间的一对多关系,详细内容如下研究开发4实现4.1SessionBean的设计4.1.1定义HomeInterface4.1.2定义RemoteInterfacepublicinterfaceEnrollSessionextendsEJBObject{//-----//这是一个基于SessionBean的Remote接口,这个SessionBean是基于//Stateful的SessionBean,用来对特定学生选课的登记过程进行操作//-----------------------------publicStringgetStudentName()throwsRemoteExceptionpublicvoidenroll(ArrayListcourseItems)throwsRemoteExcep-tionpublicvoidunenroll()throwsRemoteExceptionpublicvoiddeleteStudent()throwsFinderException,RemoteEx-ceptionpublicvoiddeleteCourse(Stringcourse_id)throwsRemoteExcep-tion}4.1.3Client获取HomeInterface和RemoteInterface的参考方式,我们使用JNDI机制来获取Home接口和Remote接口的对象参考。
4.1.4定义回调方法4.1.5实现远程数据库的连接使用JNDI机制,通过数据库的JNDI名称javacomp/env/jdbc/StudentCourseDB来连接后台数据库。
4.1.6SessionBean方法实现//定义变量publicStudentHomesHomepublicEnrollHomeeHomepublicStringstudent_idpublicStringname//回调方法实现publicvoidejbCreate(Stringstudent_id)throwsCreateException{try{Studentstudent=sHome.findByPrimaryKey(student_id)name=student.getName()}catch(ObjectNotFoundExceptione){thrownewCreateException(Student+student_id+notfoundinStudentTBL!)}catch(Exceptione){thrownewEJBException(e.getMessage())}this.student_id=student_id}//商业方法实现publicvoidenroll(ArrayListcourseItems){Enrollenroll=nulltry{enroll=eHome.findByPrimaryKey(student_id)}catch(Exceptione){}try{if(enroll!=null){enroll.replaceCourseItems(courseItems)}else{eHome.create(student_id,courseItems)}}catch(Exceptione){thrownewEJBException(e.getMessage())}}publicvoidunenroll(){try{Enrollenroll=eHome.findByPrimaryKey(student_id)enroll.remove()}catch(Exceptione){thrownewEJBException(e.getMessage())}}//涉及到对两张表的删除。publicvoiddeleteStudent()throwsFinderException{try{Enrollenroll=eHome.findByPrimaryKey(student_id)Studentstudent=sHome.findByPrimaryKey(student_id)enroll.remove()student.remove()}catch(Exceptione){thrownewEJBException(e.getMessage())}}publicvoiddeleteCourse(Stringcourse_id){PreparedStatementps=nulltry{getConnection()StringdeleteStatement=deletefromEnrollTBL+wherestudent_id=?andcourse_id=?ps=con.prepareStatement(deleteStatement)ps.setString(1,student_id)ps.setString(2,course_id)ps.executeUpdate()}catch(Exceptione){thrownewEJBException(e.getMessage())}finally{try{ps.close()con.close()}catch(Exceptione){thrownewEJBException(e.getMessage())}}}4.2EntityBean的设计我们以关联表(EnrollTBL)对应的实体Bean为例进行说明,它涉及到两个表的一对多关系。
4.2.1定义Home接口4.2.2定义RemoteInterfacepublicinterfaceEnrollextendsEJBObject{//---------------//这是一个基于EntityBean的Remote接口,这个EntityBean是基于//Bean-ManagedPersistence的EntityBean,用来对EnrollTBL表进行操作//--------------------------publicArrayListgetCourseItems()throwsRemoteExceptionpublicStringgetStudent_id()throwsRemoteExceptionpublicvoidreplaceCourseItems(ArrayListcourseItems)throwsRemoteException}4.2.3变量定义publicStringstudent_idpublicArrayListcourseItems4.2.4增加数据记录实现publicStringejbCreate(Stringstudent_id,ArrayListcourseItems)throwsCreateException{if(courseItems==null||courseItems.size()==0){thrownewCreateException(ejbCreateexception!)}this.student_id=student_idtry{enroll(courseItems)}catch(Exceptione){thrownewEJBException(ejbCreateexception+e.getMessage())}this.courseItems=courseItemsreturnstudent_id}//根据学生ID,插入课程项。privatevoidenroll(ArrayListcourseItems)throwsSQLException{StringinsertStatement=insertintoEnrollTBLvalues(?,?)PreparedStatementps=con.prepareStatement(insertStatement)try{//------------//依次将所有的课程项目插入EnrollTBL表//------------------ps.setString(1,this.student_id)for(inti=0i<courseItems.size()i++){Stringcourse_id=(String)courseItems.get(i)ps.setString(2,course_id)ps.executeUpdate()}}finally{ps.close()}}//根据学生ID,删除课程项privatevoidunenroll()throwsSQLException{StringdeleteStatement=deletefromEnrollTBL+wherestudent_id=?PreparedStatementps=con.prepareStatement(deleteStatement)try{ps.setString(1,student_id)ps.executeUpdate()}finally{ps.close()}}5部署和运行5.1部署程序5.1.1部署StudentEntityBean,设置事务属性,生成部署文件。
5.1.2同样,再部署其他三个EJB组件EnrollSessionBean,CourseEntityBean,EnrollEntityBean。
5.1.3部署web组件5.1.4部署整个应用程序5.2运行启动J2EE服务器,启动数据库服务器,打开浏览器。学生登录,即可选课。6结论组件技术使得复杂的多层结构应用系统开发变得容易。采用组件技术能提高开发人员的效率,降低软件的开发和维护成本,提高软件的质量,控制所构建系统的复杂性。UML设计方法的使用能提高软件设计的效率和保证设计的规范性。参考文献[1]CraigLarman.UML和模式应用-面向对象分析与设计导论[M].北京机械工业出版社,2003.10-100.[2]刘特.J2EEEJB应用编程实例[M].北京清华大学出版社,2003.90-150.[3]GeriSchneider.用例分析技术[M].北京机械工业出版社,2003.1-98.
-----------------------------------------------
谢谢请采纳:
不能发连接啊,请在百度
搜索‘珍惜知识网’点进去就是了[ORDA]
以上就是关于下面数据库问题应该怎么做?全部的内容,如果了解更多相关内容,可以关注,你们的支持是我们更新的动力!
版权声明:我们致力于保护作者版权,注重分享,被刊用文章【教务管理系统 jdbc】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;
工作时间:8:00-18:00
客服电话
电子邮件
beimuxi@protonmail.com
扫码二维码
获取最新动态
