收藏 分销(赏)

Java程序设计实训教程课件全套教程.ppt

上传人:精**** 文档编号:10251450 上传时间:2025-04-30 格式:PPT 页数:91 大小:2.64MB
下载 相关 举报
Java程序设计实训教程课件全套教程.ppt_第1页
第1页 / 共91页
Java程序设计实训教程课件全套教程.ppt_第2页
第2页 / 共91页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,实训一,扫雷游戏,1.1,系统设计,需求分析,随机,布雷,实现扫雷,功能,标记小,方块,选择游戏的,难度,显示剩余雷,数,显示,已使用时间,最好成绩,记录,重新,开始,加快扫雷,进程,加入声音,1.1,系统设计,类的设计,MineFrame,MinePanel,Block,BlockType,BlockState,Record,Grade,Timer,对话框类,监听器类,1.2,创建主窗口,创建,Java,项目,Saolei,创建子文件夹,image,,将需要的图标复制到该文件夹,创建,MineFrame,类,public class MineFrame extends JFrame,JMenuBar menuBar;,JMenu menu;,JMenuItem menuItems;,String menuItemNames=,初级,中级,高级,自定义,排行榜,退出,;,JTextField minesRemained;/,显示剩余雷数的文本框,JButton reStart;/,重新开始按钮,JTextField timeUsed;/,显示游戏使用时间的文本框,Icon face;/,按钮上的图标,JPanel upPanel;/,计时区域,创建,主程序类,Saolei,1.3,MinePanel,类和,Block,类,BlockType,类,public class BlockType,static final int ZERO=0;/,周围的雷数,static final int ONE=1;,static final int TWO=2;,static final int THREE=3;,static final int FOUR=4;,static final int FIVE=5;,static final int SIX=6;,static final int SEVEN=7;,static final int EIHHT=8;,static final int MINE=9;/,是雷,1.3,MinePanel,类和,Block,类,BlockState,类,public class BlockState,static final int ORIGINAL=0;/,初始状态,static final int OPEN=1;/,翻开状态,static final int MINE_FLAG=2;/,标记为雷,static final int QUESTION_FLAG=3;/,标记为问号,static final int EXPLODED=4;/,爆炸状态,Grade,类,public class Grade,public static final int,LOWER,=1;/,初级,public static final int,MEDIAL,=2;/,中级,public static final int,HIGHER,=3;/,高级,public static final int,SELF_DEFINE,=4;/,自定义,1.3,MinePanel,类和,Block,类,Block,类,属性,private MinePanel minePanel;,private int row;/,在雷区的行号,private int col;/,在雷区的列号,public final int WIDTH=19;/,方块的宽度,public final int HEIGHT=19;/,方块的高度,private int type;/0,1,2,3,4,5,6,7,8,(,9,雷),private int state;/0,原始状态,,1,翻开,,2,标记为雷,,3,标记为问号,public static Toolkit tk;,public static final Image numberImage;/08,public static final Image flagImage;/0,标记为雷、,1,标记为问号,public static final Image bombImage;/0,未爆炸、,1,已爆炸,public static final Image backImage;/,未翻开时的背面,1.3,MinePanel,类和,Block,类,Block,类,方法,public boolean open()/,翻开,遇雷失败,public void draw(Graphics g)/,画出不同类型、不同状态的方块,构造方法、,get,、,set,方法,1.3,MinePanel,类和,Block,类,MinePanel,类,属性,public final int GRID_WIDTH=20;/,方格的宽度,public final int GRID_HEIGHT=20;/,方格的高度,private MineFrame mf;,private int cols;/,雷区的列数,private int rows;/,雷区的行数,private int mines;/,雷区的雷数,private int remainedMines;/,未标记的雷数,private int openedBlocks;/,已经翻开的方块数,private Block blocks;/,方块数组,1.3,MinePanel,类和,Block,类,MinePanel,类,方法,public void initMinePanel(int rows,int cols,int mines)/,初始化参数,private void createBlocks()/,创建小方块,private void layMines()/,随机布雷,private void countMines(int row,int col)/,计算指定方块周围的雷数,public void paint(Graphics g)/,画出雷区,public Dimension getPreferredSize(),1.3,MinePanel,类和,Block,类,将雷区加入到,MineFrame,中,在,MineFrame,类中添加属性,MinePanel minePanel;,private int rows;,private int cols;,private int mines;,添加,initParameter,方法,private void initParameter(int rows,int cols,int mines),this.rows=rows;,this.cols=cols;,this.mines=mines;,1.3,MinePanel,类和,Block,类,将雷区加入到,MineFrame,中,修改构造方法,public,MineFrame(),createMenu();,createUpPanel();,initParameter(10,10,10);,minePanel=new MinePanel(this,rows,cols,mines);,Container c=,this,.getContentPane();,c.add(upPanel,BorderLayout.,NORTH,);,c.add(minePanel,BorderLayout.,CENTER,);,this,.setDefaultCloseOperation(,EXIT_ON_CLOSE,);,this.pack();,this,.setLocationRelativeTo(,null,);,this,.setResizable(,false,);,this,.setVisible(,true,);,1.4,实现扫雷功能,翻开小方块,在,MineFrame,类中添加属性,private boolean gamming;/,正在扫雷?,private boolean stoped;/,游戏已停止?,在,MineFrame,类中添加,set,、,get,方法,修改,MineFrame,类的,initParameter(),方法,MinePanel,类添加鼠标监听器类,MinePanel,类添加,Open(),方法,注册,鼠标,监听器,1.4,实现扫雷功能,处理输赢以及搜索方法,wins,(),方法,lose(),方法,search(),方法,在,open,(),方法,中,调用,wins(),方法,、,lose(),方法,、,search(),方法,1.4,实现扫雷功能,加快扫雷进程,右键单击已经翻开的方块,如果该方块临近的雷已经全部标识出来,则翻开尚未翻开的相邻方块。,1.4,实现扫雷功能,重新开始游戏,在“开始”按钮监听器中填写处理代码。,1.5,选择游戏难度级别,MineFrame,添加,grade,属性,添加,grade,属性,添加,get,和,set,方法,自定义难度,对话框,完善菜单监听器,类,在选择难度级别的菜单处理分支添加相应的代码。,1.6,实现计时功能,UpdateTimeTask,类,创建,UpdateTimeTask,类,添加,UpdateTimeTask,类型的,属性,(,MinePanel,类中),启动计时与终止,计时,启动,计时,:鼠标监听器中,翻开第一个小方块开始计时。,终止,计时,:,wins(),方法,、,lose,(),方法的开始,处,、重新开始按钮监听器中、选择难度级别菜单后。,1.7,扫雷排行榜,Record,类,RecordDao,类,用于输入游戏者名字的对话框,类,显示排行榜的对话框,类,实现排行榜功能,读入排行榜,数据,记录排行榜,数据,显示排行榜数据,1.8,加入声音,在,MinePanel,类中添加播放音频的,sound(),方法,准备音频,文件,播放,音频,文件,扫雷成功时,扫雷失败时,一,次翻开对个方块时,实训二,网络五子棋,界面程序,网络编程,多线程,输入输出,客户端,服务器,涉及知识(,java,),异常处理,输入输出(文件),多线程,数据库,界面,网络程序,2.1,单机版五子棋游戏,黑子先下,两人轮流下一个棋子。先连成五个的一方胜利。,连成五个子的方向可以是水平,垂直,以及两个斜线方向。,2.1,单机版五子棋游戏,1.,创建窗口及工具栏,Five,类,Five,Extends,JFrame,private,JToolBar,toolbar;,private,JButton,startButton,;,private,JButton,backButton,;,private,JButton,exitButton,;,2.,创建棋盘类,ChessBoard,类,public static final,int,MARGIN=15;/,边距,public static final,int,GRID_SPAN=20;/,网格间距,public static final,int,ROWS=18;/,棋盘行数,public static final,int,COLS=18;/,棋盘列,数,Image,img,;,在,Five,类加入:,private,ChessBoard,b,oardPanel,;,准备图片,Boad.jpg,Toolkit,getDefaultToolkit(),getImage(),paintComponent(),getPreferredSize():,(,Jfram,在,pack,时,要知道,board,的大小)。,3.,创建棋子类(,1,),Chess,类,private int col;/,棋子在棋盘中的列索引,private int row;/,棋子在棋盘中的行索引,private Color color;/,颜色,public static final int,DIAMETER=GRID_SPAN-2;,ChessBoard cb;/,棋子是要画在棋盘中,需要一个棋盘的引用,public void draw(Graphics g),在,ChessBoard,类加入:,Chess c=,new Chess(this,2,3,Color.,BLACK);,c.draw(g);,Chess c1=,new Chess(this,5,2,Color.,WHITE);,c1.draw(g);,测试棋子画出的效果。,int xPos=col*cb.,GRID_SPAN+cb.MARGIN,;,int yPos=,row,*cb.,GRID_SPAN+cb.MARGIN,;,将棋盘行列转换为像素坐标:,Ellipse2D.Float,是,Ellipse2D,的内部类,Ellipse2D e=new Ellipse2D.Float(,xPos-,DIAMETER/2,yPos-DIAMETER/2,DIAMETER,DIAMETER),;,RadialGradientPaint,paint=,new RadialGradientPaint(,x,y,15,f,c );,int x=xPos+,DIAMETER/4;,int y=yPos-,DIAMETER/4;,float f=0f,1f;,Color c=Color.,WHITE,Color.BLACK;,白色点的位置,3.,创建棋子类,(2),4.,实现单击鼠标下子,ChessBoard,类,Chess,chessList,;/,记录棋子的数组,int,chessCount,;/,当前棋盘棋子的个数,boolean,isBlack,=true,;/,默认开始是黑棋先,private,boolean,hasChess,(,int,col,int,row)/(,col,row,),处是否已经有棋子,内部类:,class,MouseMonitor,extends,MouseAdapter,mousePressed,(,MouseEvent,e,),方法中,在鼠标按下的位置创建一个棋子并添加到,chessList,中。,将鼠标点的像素坐标转换成棋盘的行列,int col=(,e.getX()-,MARGIN+GRID_SPAN/2)/GRID_SPAN;,int,row=(,e.getY,()-,MARGIN+GRID_SPAN/2)/GRID_SPAN;,在,paintComponent,方法中将,chessList,中棋子全部画出来。,5.,添加判断胜利的功能,ChessBoard,类,boolean,isGamming,=true;/,游戏是否结束,private,boolean,isWin,(,isWin,(,int,col,int,row,),private Chess,getChess,(,int,col,int,row,Color color),在,mousePressed,方法中,调用,isWin,(,int,col,int,row),,进行游戏结束,处理,每下一个棋子,都需要在四个方向上判断是否形成了,5,个子连成一线,如果发现已经有,5,子连成一线了,则输出赢棋信息,并将,isGamming,设置为,false,。,在,mousePressed,方法开始加入,if(!,isGamming,)return;,6.,实现工具栏上的功能,ChessBoard,类,public void,restartGame,(),public void,goback,(),Five,类,内部类,class,ActionMonitor,implements,ActionListener,重新开始,悔棋,退出,7.,改变鼠标指针的形状,ChessBoard,类,内部类:,class,MouseMotionMonitor,extends,MouseMotionAdapter,可以下棋的地方显示,不可以下棋的地方显示,2.2,服务器端界面制作,FiveServer,类,2.3,客户端界面,背景图片,board.jpg,PanelBoard,类,FiveClient,类,1.,创建主窗口和棋盘,图标,:black.jpg,white.jpg,PanelTiming,类,PanelUserList,类,PanelMessage,类,修改,FiveClient,类,2.3,客户端界面,2.,创建客户端界面右侧的三个类,PanelControl,类,修改,FiveClient,类,2.3,客户端界面,3.,创建控制面板类,2.4,实现“连接主机”按钮的功能,add A,Client A,Client B,Server,connect,Client C,add A,tellName,add B,add C,clients,add,1.,连接服务器获取用户名,服务器端(,FiveServer,),内部,类,Client,增加属性,添加两个方法,startServer,(),tellName,(),客户端,(FiveClient),内部监听器类,ActionMonitor,注册监听,设置按钮的状态,服务器端,:,ServerSocket,构造方法的参数:端口号,客户端,:,Socket,构造方法的参数:服务器,ip,,端口号,本机,ip,:,127.0.0.1,2.,将已经连接的客户端添加到用户列表中,创建,Command,类,修改程序中的命令,服务器类添加方法,addAllUserToMe(),addMeToAllUser(),修改,startServer(),方法,创建,Communication,类,客户端类添加,connect(),方法,Communication,添加内部线程类,ReceaveThread,2.5,实现“加入游戏”按钮的功能,(3),refuse,:,A,(2)Join,:,A,Client A,Client B,Server,(1)Join,:,C,Client C,(4)refuse,拒绝的情况,(3)agree,:,A,(2)Join,:,A,(5)Change,:,A,:,playing,Change,:,C,:,playing,Client A,Client B,Server,(1)Join,:,C,Client C,(5),guessColor,(4),猜先,(5),guessColor,2.5,实现“加入游戏”按钮的功能,同意的情况,1.,客户端申请加入后对方选择同意或拒绝,2.5,实现“加入游戏”按钮的功能,Command,类中增加以命令常量,在客户端加入“加入游戏”按钮处理,“加入游戏”按钮监听器,FiveClient,类中添加方法,join(),Communication,类中,添加,join(),方法,服务器接收,jion,命令并发送给对手,,,ClientThread,类,对手接到命令将选择结果发送给服务器,创建计时对话框类,TimeDialog,修改,Communication,类,2.,完成猜棋并准备好下棋,2.5,实现“加入游戏”按钮的功能,服务器收到拒绝或同意的处理,拒绝处理:将拒绝信息发给客户端,同意处理,:猜先,将结果发给客户端,客户端收到拒绝,的处理,-,显示信息框,客户端收到同意的处理,PanelBoard,类加入属性,idGoing,Communication,类处理同意,情况,修改,PanelBoard,类的内部类,MouseMonitor,2.6,实现,下棋功能,1.,客户端向服务器发送下棋消息,2.6,实现,下棋功能,在,Command,类中添加命令,在,Communication,类中添加方法,go(),wins(),在,PanelBoard,类中调用上面两个方法,PanelBoard,添加,FiveClient,类的引用,在,PanelBoard,类中调用,go(),方法和,wins(),方法,2.,服务器接收消息并处理,2.6,实现,下棋功能,Communication,类接收消息,PanelBoard,类添加方法,addOpponentChess(),winsGame(),lossesGame(),resetGame(),3.,客户端接收消息并处理,2.7,实现,“放弃游戏”的,功能,1.Command,类添加常量,2.,添加“放弃游戏”的,监听,代码,3.,在,Communication,类中天 添加,geveup(),方法,4.,服务器接收,giveup,命令并处理,2.7,实现,“放弃游戏”的,功能,1.,设计计时线程类,2.,猜先后启动倒计时线程,2.8,加入,计时,功能,2.9,完善,“关闭程序”按钮的,功能,1.,在,Command,类中添加命令,2.,客户端向服务器发送命令,修改“关闭程序”按钮的响应代码,Communication,类添加方法,disConnect(),3.,服务器处理,quit,命令,4.,客户端处理,delete,命令,2.9,完善,“关闭程序”按钮的,功能,1,目前的程序每方总的用时是在程序中指定的,如果用户希望在申请对局时自己指定用时时间,程序中应如何处理?,2,在我们的程序中,对于异常处理只是调用,printStackTrace(),方法输出异常信息,并没有进行实质上的处理,这显然是不够的。比如在服务器还没有启动时,当客户端程序启动后,单击“连接服务器”按钮,就会产生异常,客户端程序应该显示未连接成功的提示信息,这时不能进行已连接成功的相关处理。应该如何改进程序,较好的处理这个异常问题?,作业,1.,用户,A,向另用户,B,申请后,,B,答复之前,又有用户,C,向用户,A,发出申请。如何处理?,2.,用户注册,登录,记录用户的成绩,级别等。,3.,记录棋谱。,4.,棋谱回放。,其他问题,实训三,棋谱的保存与回放,注册,登录,保存棋谱,棋谱回放,3.1,创建数据库,设计数据库,fiveChess,设计,User,表,字段名,类型,长度,允许空,备注,userid,INT,否,主键,自动增长,name,VARCHAR,10,否,用户名,password,VARCHAR,10,否,密码,email,VARCHAR,30,否,邮箱,level,INT,否,级别,regdate,Date,否,注册日期,3.1,创建数据库,3.,设计,game,表,字段名,类型,长度,允许空,备注,gameid,INT,否,主键,自动增长,gameDate,Date,否,下棋日期,playerBlack,VARCHAR,10,否,黑方,playerWhite,VARCHAR,10,否,白方,winner,VARCHAR,10,否,赢棋方,manualFileName,VARCHAR,100,否,记录棋谱的文件名,3.1,创建数据库,4.,配置,mysql-connector-java,5.,类,CreateDatabase,3.2,用户管理,创建,DBConnection,类,User,类,创建,UserDao,类,创建临时的,Test,类(后面删除),3.3,用户注册和登录,1.,准备工作(,1,),Command,类添加命令常量(,2,)“,connectButton”,改为“,loginButton”,(,3,),FiveClient,类中添加,getC(),方法,用户登录(,1,),Communication,类添加登录方法(,2,)创建登录对话框类,DialogLogin,(,3,)显示登录对话框,(,fiveClient,中修改登录按钮的监听程序段),(,4,)服务器处理,login,命令(,修改,startServer(),方法,),(,5,)删除静态成员,clientNameNum,3.,用户注册,3.,用户注册,(,1,)创建注册对话框类,DialogRegister,(,2,)修改登录对话框中的注册按钮坚挺,if,(,注册,.equals(str),DialogRegister,rd,=,new,DialogRegister(,this,ip);,(,3,)服务器处理注册命令,(,修改,startServer(),方法,),3.4,记录棋局和棋谱,Client,Server,数据文件,win,数据库,Save chessmanual,Save chessgame,棋谱文件名的格式:,黑棋用户名,白棋用户名,结束时间(日期时分),棋谱文件的格式:,直接写一个,Object,黑棋用户名,白棋用户名,结束时间(日期时分),步数,赢棋方,1.,记录棋局,(,1,)棋局管理,设计,Game,类,,GameDao,类(,game,包),Test,类:用于测试,Game,类和,GameDao,类,1.,记录棋局,(,2,),记录棋局到数据库,修改,FiveServer,的内部类,Client,,增加属性,修改猜先程序段,给属性,chessColor,赋值,修改,go,程序段,记录每一步棋的坐标,ClientThread,类中添加保存棋局的方法,修改,win,程序段,调用保存棋局的方法,2.,记录棋普,(,1,)棋谱管理,创建,Manual,类,创建,ManualDao,类,(,2,)记录棋谱到文件,在,ClientThread,类中添加记录棋谱的方法,recordManual(),修改,win,程序段,调用,recordManual(),保存棋谱,3.5,查询棋局和棋谱欣赏,Client,Servert,数据文件,game:userName,数据库,getManual,getGame,Game list,game:Game list,manual:fileName,manual,manual:manual,注:目前只查询自己下过的棋局,1.,查询棋局,(,1,),PanelControl,类:添加“棋谱欣赏”按钮,(,2,),FiveClient,类:添加“棋谱欣赏”按钮的监听,(,3,),Communication,类:添加,getGemes,方法,(,4,),FiveServer,类:添加消息处理(,game,命令),(,5,)客户端接收棋局并显示,DialogGames,类,FiveClient,类添加,showGames,方法,Communication,类接收并处理,game,消息,2.,棋谱欣赏,2.,棋谱欣赏,(,1,)向服务器发送,manual,命令,Communication,类中添加,getManual(),方法,修改,DialogGames,的按钮注册监听器,(,2,)服务器接收,manual,命令并处理,添加处理,manual,命令的程序分支,2.,棋谱欣赏,(,3,)客户端接收棋谱并显示,在棋盘类中添加方法,getChessCount(),setChessCount,棋谱回放对话框,DialogPlayback(),FiveClient,类添加,playBakc,方法,Communication,类处理,manual,命令,实现,GamePlayback,类中两个按钮的监听,完善遗留的问题,对话框在父窗口居中,作业,1,如果将登录对话框,注册对话框在其父窗口中居中显示,应该如何处理?,2,目前的程序,用户,A,登录后,再启动一个客户端,用户,A,还可以登录,即同一个用户可以同时多次登录。如果禁止一个用户同时多次登录,应如何处理。,3,异常处理,在,ManualDao,类的,getManual(),方法中,如果参数指定的棋谱文件不存在,会产生一个异常,目前程序没有很好地处理这一异常,请改进程序,处理好这个异常,能够提示用户棋谱文件不存在的信息。,4,异常处理,下棋结束后,在保存谱时,如果指定的文件夹“,D:fivegame”,不存在,则产生异常,且不能创建棋谱文件。修改程序,如果指定的文件夹不存在,程序能够自动创建该文件夹。,实训四,成绩管理系统,4.1,系统设计,需求分析,班级管理,学生管理,课程管理,成绩录入,成绩修改,成绩查询,4.1,系统设计,数据库设计,班级表,class,学生表,student,字段名,类型(长度),可否为空,是否主键,含义,id,CHAR(3),不可以,是,班级号,name,VARCHAR(30),不可以,不是,班级名,字段名,类型(长度),可否为空,是否主键,含义,id,CHAR(6),不可以,是,学号,name,CHAR(10),不可以,不是,姓名,gender,CHAR(2),不可以,不是,性别,tel,CHAR(11),不可以,不是,电话,birthday,DATE,不可以,不是,出生日期,class,CHAR(3),不可以,不是,班级号,4.1,系统设计,数据库设计,课程表,course,成绩表,score,字段名,类型(长度),可否为空,是否主键,含义,id,CHAR(3),不可以,是,课程号,name,VARCHAR(30),不可以,不是,课程名,schoolHour,INT,不可以,不是,学时,credit,INT,不可以,不是,学分,字段名,类型(长度),可否为空,是否主键,含义,class_id,CHAR(3),不可以,不是,班级号,stu_id,CHAR(6),不可以,与course_id联合主键,学号,course_id,CHAR(3),不可以,与stu_id联合主键,课程号,score,INT,不可以,不是,成绩,4.1,系统设计,类的设计,实体类,:,ClassEntity,、,Student,、,Course,、,Score,数据访问类,:,ClassDao,、,StudentDao,、,CourseDao,、,ScoreDao,对话框类,:,ClassManage,、,StudentManage,、,CourseManage,、,ScoreDialog,、,ScoreQueryByCourse,、,ScoreQueryByStudent,工具类,:,DBConnection,、,CreateDatabase,主窗口类,:,MainFrame,4.2,工具类,创建,Java,项目,Score,建立配置文件,database.properties,配置数据库驱动程序,util,包,创建,DBConnection,类,创建,CreateDatabase,类,4.3,实体,类,建立,entity,包,ClassEntity,Student,Course,Score,4.4,数据访问类,dao,包,ClassDao,StudentDao,CourseDao,ScoreDao,4.5,主窗口类,包结构,4.5,主窗口类,MainFrame,ScoreSystem,public class ScoreSystem,public static void main(String args),new MainFrame();,缺省包,4.6,班级管理,MyTableModel,(,dialog.table,子包,):,实现单元格不可编辑,public,boolean,isCellEditable,(,int,row,int,column),return false;,ClassManage,(dialog,包,),4.7,学生,管理,StudentManage(dialog,包,),4.8,成绩,管理,1.,准备,工作,(dialog.,scoreTable,包,),ScoreTable,:,单击单元格,立即进入编辑状态。,单元格失去焦点结束编辑,保存数据,ScoreTableModel,控制单元格能否编辑,设置每列的数据类型,CreateTableModel,创建,ScoreTableModel,对象,4.8,成绩,管理,2.,成绩录入与修改,(dialog,包,),ScoreDialog,成绩录入与修改的对话框,ScoreInputMonitor,成绩录入监听器,ScoreEditMonitor,成绩修改监听器,4.8,成绩,管理,3.,成绩查询,(dialog,包,),ScoreQueryByCourse,查询课程成绩,ScoreQueryByStudent,查询学生成绩,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服