你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接 流量卡知识网 http://53go.cn/ 专注于移动/联通/电信推出的大流量多语音活动长短期套餐手机卡的相关知识的介绍普及听说互换友情链接可以增加网站的收录量,特此来换,如果同意的话就给internetyewu@163.com[微信ganenboy]发信息或者就在此回复下吧!【建站问题也可以一起讨论!】
你好,看完你的博客文章,感觉很不错!希望与你网站首页友情链接 流量卡知识网 http://53go.cn/ 专注于移动/联通/电信推出的大流量多语音活动长短期套餐手机卡的相关知识的介绍普及听说互换友情链接可以增加网站的收录量,特此来换,如果同意的话就给internetyewu@163.com[微信ganenboy]发信息或者就在此回复下吧!【建站问题也可以一起讨论!】
你好
http://bigota.d.miui.com/V14.0.9.0.TLJCNXM/ingres_images_V14.0.9.0.TLJCNXM_20230323.0000.00_13.0_cn_chinatelecom_aff802bb3e.tgz
已添加贵站友链 Southerly 个人博客 || http://www.southerly.top || https://www.southerly.top/imgs/favicon.ico || 一个正在努力搬砖的兼职程序员,记录生活,分享生活,欢迎大家来访。
目前这种不行了
老哥呀,现在这种方法还能爬到数据嘛?可以聊聊不
https://www.aliyundrive.com/s/5N2bKDVZfxC
https://wwi.lanzoup.com/iU6FZ0o4as1i
04824ADB9F824ADB9F0400824ADB9F000F
https://lihh.lanzouf.com/ij6c80nhq7rg
https://cloud.189.cn/web/share?code=FvuIbuJBnEVr
https://lihh.lanzouf.com/ij6c80nhq7rg
https://developer.aliyun.com/plan/student?taskCode=vmfeitian2023&recordId=5246709&undefined&share_source=copy_link
已加,三天之后检查没加本站链接 就下了
首页
大佬聚集地
欢迎大家
教程分享
每日一看
Search
1
欢迎来到河马博客
41,756 阅读
2
守护者群管小栗子框架下载教程
40,887 阅读
3
烟花模拟器(php)
35,661 阅读
4
外链搜索引擎优化如何发布
13,619 阅读
5
一键搭建表白墙源码+教程
13,255 阅读
软件分享
教程分享
源码分享
游戏攻略
百科知识
SEO课程
登录
Search
标签搜索
推特
升学考试
账号
数学
饺子
笔记本电脑
笔记本
研究生考试
字符
英语
函数
马斯克
笔记本电脑排名前十
操作
初一
联想
考研
广告
注册
账户
河马
累计撰写
7,418
篇文章
累计收到
81
条评论
今日撰写
50
篇文章
首页
栏目
软件分享
教程分享
源码分享
游戏攻略
百科知识
SEO课程
页面
大佬聚集地
欢迎大家
教程分享
每日一看
用户登录
登录
搜索到
1714
篇与
的结果
2023-12-07
深度揭秘(java企业考勤管理系统课程设计)java企业考勤管理系统怎么做,[内附完整源码和文档] 基于Java的考勤管理系统,java学生考勤系统设计与实现csdn,
摘 要该考勤信息管理系统用于实现学校对在校学生的考勤信息的管理,是典型的管理信息系统。学生考勤信息的手工登记查询,是一项非常繁重而枯燥的劳动。在计算机技术飞速发展的今天,应用数据库技术实现学生考勤信息统计的管理是行之有效的。本报告系统地介绍了一个基于java的学生考勤信息管理系统,论述了一个基于java的学生/老师考勤信息管理系统的设计原理、设计思想及具体的实现过程,对部分架构及设计思想和设计过程作了详细阐述。系统具有师生个人信息查询、请假、随堂点到等功能,信息管理模块、考勤管理模块和考勤系统模块。本系统开发主要包括后台数据的简历以及前端应用程序代码的开发两部分。其一要求建立起的数据库具有完整性和一致性,并具有一定的数据安全性;其二要求程序界面友好、功能完备,通俗易懂。本次课程设计着重讨论了用java开发考勤管理系统时的数据库访问技术和面对对象程序开发技术,并给出了部分实现代码。关键词:Java;面对对象;学生考勤管理系统一、开发背景随着社会的发展,计算机科学日渐成熟,计算机越来越深入到我们的日常生活中,成为我们不可或缺的辅助工具。其强大的功能已为人们深刻认识,它已进入人类社会的各个领域,并发挥着越来越重要的作用,各行各业的人们无需经过特别的训练就能够使用计算机完成许许多多复杂的工作。随着我国人口的增长,高校的生源也日益增加。学校考勤信息的管理作为高校管理的一项日常工作,也随着学生人数的管理而变得繁琐起来。与此同时,计算机技术的发展也是与时俱进一日千里,于是,使用计算机代替人工记录管理学生的考勤信息自然而然的进入了人们的视野里。二、需求分析我们需要设计一个系统可以实现学生基本信息的查看和管理等功能。在主菜单界面中有输入学生信息、根据ID好查询学生信息、显示数据库中的学生信息、学生请假经过老师审批、学生修改密码、老师查看学生考勤信息等功能,通过不同的选择进入到不同的功能,根据提示进行输入操作。三、模块说明根据分析整个系统主要划分为4个功能模块,分别执行要求中的功能。数据管理中实现对学生的基本信息、学生考缺课的查询,以及具体缺课内容,是迟到、早退、请假、旷课。查询管理通过根据学生学号等信息,来达到我们需求的目的。3.1 用户登录模块功能描述:此模块的主要功能是实现用户登录。系统的用户必须在登录系统后才能进行对应的操作。用户在登录页面正确输入账号、密码时就可以成功登录。当密码错误时,用户根据系统的提示进行密码的修改重新进行登录输入:用户学号、密码、新密码、旧密码输出:欢迎使用考勤信息系统请输入旧密码请输入新密码请再次输入新密码修改成功两次密码不一致,请重新输入密码输入错误,请重输3.2 用户查询模块功能描述:此模块的主要功能是实现用户查询信息。学生在登录系统后查询自己的考勤信息,以此得到自己的出勤情况;老师通过该模块输入:学号、专业班级、个人信息等输出:用户考勤信息或学生个人考勤信息3.3 请假模块功能描述:请假分为学生请假申请、老师请假审批、学生请假状态查询;学生提交的请假申请需要老师的审批,只有批准之后学生请假信息方可录入学生状态查询。学生通过此功能模块进行在线请假及查看请假记录信息;老师在线审批学生请假及查看请假记录信息输入:学生姓名、请假原因、请假时间、老师批准选项等输出:请假条:某某同学因某某原因所以请假,请假时间为:xxx,希望老师批准请老师选择:同意(agree) or 不同意(disagree )老师已同意、不同意某某学生的请假选择错误!请老师重新选择决定3.4 考勤记录模块功能描述:系统具备考勤管理系统、考勤修改系统、后台管理系统这三大主要功能。其中在考勤管理系统中任课老师通过该系统对学生的考勤信息进行录入、修改、统计,在线管理学生出勤信息;学生在线查看自己所有全年的出勤信息。该模块的功能是学生考勤信息统计的实现、查看及管理,涉及学生和老师用户中的所有用户输入:老师录入学生需要修改的考勤信息,其中包括学号、信吗、专业班级及考勤情况输出:学生个人考勤信息及修改后的学生考勤信息四、详细设计本系统是基于数据库的学生考勤信息管理系统,实现了连接数据库,增加、删除、查询、修改学生信息的功能。通过Java语言设计一个学生考勤管理系统,包括学生查询信息、老师管理查看信息以及学生请假老师审批的设计。4.1 学生信息(Student)类类名:Student继承父类:无实现接口:无概述:学生在线查看自己所有的出勤信息;对密码进行修改等属性及说明:public String number; //定义一个学号public String major = “computer”;// 专业初始化public String class1 = “1804”;//班级初始化public String name = “xxx”;//姓名初始化private String password;//定义一个密码public String att_s = “暂无考勤信息”;//考勤信息初始化方法及说明:public void set_password(String password);//修改密码public void check_show(String password);//输出学生信息4.2 请假(Leave)类类名:Leave继承父类:无实现接口:无概述:学生提交的请假申请需要老师的审批,只有批准之后学生请假信息方可录入学生状态查询属性及说明:String name = “小栋”, time =“3,4节课”, reason = “感冒发烧,要打点滴”;//初始化姓名、时间、原因String chooice = “agree”;//初始化请假单的状态方法及说明:public void showStudent();//学生填写请假单public void showTeacher();//老师对请假单的操作public void LeaveStates();//学生查看请假单的状态4.3 老师信息(Teacher)类类名:Teacher继承父类:Student实现接口:无概述:老师对学生的考勤信息进行录入、修改、统计,在线管理学生出勤信息属性及说明:private String number1; //账号private String password1;// 密码public Teacher();//默认的构造函数public Teacher(String number,String name,String major,String class1,String att_s)//带参数的构造函数方法及说明:public void get_pass(String number,String password);//储存登录密码public void set_pass(String password);//修改密码public void check_in();//考勤录入public int check_set(String num);//考勤修改public void check_s();//考勤统计4.4 测试(Main)类类名:Main继承父类:无实现接口:无概述:对学生查询信息、老师管理查看信息以及学生请假老师审批的设计在主菜单中的实现属性及说明:String number;//登录账号(老师的职工号;学生的学号)String password;//登录密码Teacher get = new Teacher();//构建Teacher类的对象(储存老师的账号和密码)Student got = new Student();//构建Student类的对象Leave stu = new Leave();//构建Leave类的对象方法及说明:get.get_pass(number, password);//使用账号和密码登录get.set_pass("…");//修改密码stu.showTeacher();//老师审批请假条for(int c = 3; check[c].check_in();//用循环多次录入学生考勤五、系统实现学生考勤管理系统的主要任务是用计算机对学生、出勤状况等信息进行日常的管理。如查询、修改、增加、删除以及存储等,迅速准确地完成各种信息的统计计算和汇总工作,针对系统服务对象的具体要求,设计了学生考勤管理系统。该系统除了能实现信息的录入,删除,插入,更新,打印等基本功能之外,还能够根据用户的需要进行操作。完整的源码和详细的文档,上传到了 WRITE-BUG技术共享平台 上,需要的请自取:https://www.write-bug.com/article/3310.html
2023年12月07日
0 阅读
0 评论
0 点赞
2023-12-07
学到了(java报表开发工具有哪些)java开源的报表工具,Java开发报表怎么做?这2类提高效率的工具,你得试试,java报表开发技术深入解析,
日常工作中可能经常会涉及到用java开发报表,需求比较多的就是表格类的报表导出,单元格合并,图表的展现。具体怎么实现,分表格和图表两类来说。1、表格类通常采用的方式是“Java+POI+Excel模板”来制作简单的报表,生成Excel。其实Java中实现Excel根据模板导出数据的方法有很多,一般简单的可以通过操作pol进行。还可以使用一些工具很轻松的实现模板导出,这些工具现在还在维护,而且做得比较好的国内的有easypoi,国外的就是jxls了。如果是要用java开发报表模块和功能,其实可以着重利用jxls框架。我用jxls也有半年时间了,半年前因项目原因需要导出大量的excel文件,所以找到了jxls,基本可以完全满足所有的项目需要。不使用easypoi的原因是那时候测试时候效果不是很好,项目中有很多复杂的报表(大量单元格合并和单元格样式),easypoi处理合并单元格时候容易出现残损的情况。而且pol、jxl代码工作量大,编码效率很低且不方便维护。Jxls的话相对简单轻量,使用特定的标记在excel模板文件中来定义输出格式和布局。jxls是通过预制excel模板,然后通过jxls响应API将我们应用程序的数据结合模板格式输出到相应的excel文件中,从而形成报表。报表的其他需求还有很多,比如前端查询,相关的组件很多,原理无非就是选择你所关注的信息(数据列),选择时间等(查询条件)生成数据集,然后在servlet中将数据集转成报表组件所需要的格式,传送到前台渲染。2、图表类涉及到报表的图表开发,就是饼图、柱状图那些,可以用echarts还有highchart。这里要注意,如果是做web端的图表,不要使用java层的组件,使用js层的组件,因为java层的组件生成的是图片,而js是生成的web代码,如果有交互性的功能和动态功能,java层的组件是难以实现的,同时在java层构造图片也是比较严重消耗服务器性能的。推荐使用js层图表组件库,常用的有echarts和国外的知名组件highchart,因为是js组件库,服务端只用推送数据到客户端,有js来绘制图层,因此不需要写文件下载的模块。这里总结一些报表开发常用的开源组件库吧:Java office、pdf 操作组件库Apache POIJXLiTextOpenOfficePDFBoxjquery.table2excel.js图表前端EChartsHighchartsD3后面我就不用java开发报表了,因为报表需求量大,以往的大量报表还要维护,然后还有各种复杂的表格形式难以捉摸容易出bug,所以后面就直接用专业的报表工具。像报表导出,图表制作,开发少说2天,如果用报表工具基本上分分钟的事。哎,能有现成工具真的不要花时间和人力去开发应用来解决问题。报表工具github是哪个有开源的,之前我们用过jaspereport一阵,好处就不多说了,网上一搜一大把。但是打印报表、复杂的数据计算有点鸡肋,加之我们要和很多应用系统做集成,报表工具要成为一个数据中台的角色,来集中开发个业务的报表,后面还是采购了FineReport。我也算是亲身经历过从“开发——开源——商用报表工具”的人了。Java开发报表工具——FineReport如果有报表开发需求,没有开发能力,但有预算,采购工具是常用的手段,而且一步到位。工具的成本不比人力低?我们以前一个报表开发团队:4个程序员+6个excel做表。报表项目落地后,直接减半,当然工作量也更大了。FineReport的话,简单介绍一下吧。功能比较丰富,除了基础的数据展现、填报功能外,还支持定时推送,多级上报,打印导出,移动端,大屏展现等各种场景,俨然是个系统了。学习成本低,只要学会简单的sql就可以开发,我当年java开发报表的技能早还给百度了。开发速度快,可视化SQL取数,报表页面设计类似Excel、参数查询可批量查询并导出报表。(此处已添加小程序,请到今日头条客户端查看)填报功能是用的很多的,因为业务上要采集很多数据,开发填报模板后数据直接入库,而是每天邮箱里躺着几十份Excel文件。以前一张报表我们排需求再制作基本要一周,用FineReport的话,只要配置好数据,1、2个小时。在做项目的时候,可以把一些共性需求的报表做在一个模板里,利用参数查询,批量导出。这种维护的成本也是很低的。如果要做开发,FineReport也是有接口的,可以根据需求调用相应的接口,用java开发集成定制,或者用js,但和市面上大部分ERP、OA、CRM系统都有了直接的集成。最后,附一张我最近在做的大屏项目作品吧。
2023年12月07日
0 阅读
0 评论
0 点赞
2023-12-07
新鲜出炉(java程序员必备的基础知识之标识符是什么)java程序中的标识符,java程序员必备的基础知识之标识符,java标识符命名规则,
要想让别人看懂你的代码,熟悉标识符命名规则的同时,一定要遵守java标识符命名规范,同时还要记住决不能用java的关键词作为标识符java的关键词一共有51个,大家也不用刻意去背,随着学习的深入自然就掌握了。那我们重点说一下标识符的命名规则和标识符的命名规范。java程序员必备的基础知识之标识符先来了解一下什么是标识符以及标识符都可以标识什么?标识符:在java源程序中,标识符其实就是程序员根据自己的喜好来决定代表一定含义的单词。可以用标识符的单词主要包括:接口名、变量名、方法名、常量名、类名等等当然哪些单词可以用作标识符也不能由着性子乱来,一定要遵守java标识符的命名规则,那么java标识符有哪些命名规则呢?第一、标识符只能由数字、字母、下划线、美元符号组成,不能含有其他符号,比如:@#%&等等都不能出现在标识符里面。第二、标识符不能以数字开头,比如:8sognshu,这就是错误的标识符第三、java关键字和保留字不能用作标识符,比如:public static class void等等,还有保留字,比如:go等。以上这些都不能用作标识符,不需要刻意记住,随着学习的深入会慢慢掌握。第四、标识符是严格区分大小写,比如songshu和SongSu,是完全不同的。第五、标识符理论上是没有长度限制的。以上五点要严格准守,没有为什么,java研发人员就是这样规定的。java程序员必备的基础知识之标识符除了要严格遵守以上五点之外,java标识符的命名规范大家也要掌握,否则在编写程序的时候会被笑话是外行或者是没有经验,咱不能露怯是吧。下面来聊聊命名规范都有哪些呢?首先是见名知意,看到单词就知道你要表达什么,其次就是遵守驼峰命名方式,如果两个单词才能表达的话,那么第二个单词务必大写。还有就是类名、接口名首字母要大写,变量名、方法名首字母要小写。常量命名所有字母都要用大写,单词与单词之间用“_”分隔。以上这些命名规范是常识,大家都是这么写的,所以大家务必多学习,写多了,看多了自然也就学会了,不需要死记硬背。
2023年12月07日
0 阅读
0 评论
0 点赞
2023-12-07
快来看(java常用开发平台工具)java开发工具包有哪些,java 常用的开发工具是什么?,java for os x是什么,
俗话说,工欲善其事,必先利其器。工匠想要使他的工作做好,一定要先让工具锋利。对于我们做程序员的来说也是一样的,想要提高开发效率,也需要选择好自己的开发工具,下面我们就来详细盘点一下Java开发一般都会用到哪些开发工具。一.开发编程工具1.Eclipse 官网地址Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。2.MyEclipse 官网地址MyEclipse,是在Eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java、Java EE以及移动应用的开发。在最新版本的MyEclipse中,配合CodeMix使用支持也十分广泛,尤其是对各种开源产品和主流开发框架的支持相当不错。已支持PHP、Python、Vue、Angular、React、Java、Java EE等语言和框架开发。3.IntelliJ IDEA 官网地址IDEA 全称 IntelliJ IDEA,是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。它的旗舰版还支持HTML,CSS,PHP,MySQL,Python等。免费版只支持Java,Kotlin等少数语言。我后来转Android后用的是 Android Studio工具,其实这个工具就是Google在idea的基础上二次开发出来的,所以两者非常像,只是侧重不同。上面这几个工具我全部都用过,2011年刚入门培训的时候就是用的Eclipse,后来做Java web项目就改为用MyEclipse,后来转Android 用过一段时间Idea,说一下这几个工具的主要区别:MyEclipse是收费的,eclipse是免费的。Eclipse自带的插件很少,如果写web项目,需要自己配置很多东西,MyEclipse集成了很多的插件,一般Java的企业应用开发都会使用MyEclipse。idea比myeclipse 更加智能,自带更智能的代码提示,代码检查。MyEclipse 以前用的时候有时候经常会卡死,Idea更加稳定,而且我感觉Idea界面看起来更舒服。(个人感受)我个人更推荐开发同学直接用idea,感觉idea集合了eclipse和MyEclipse的功能和优点,然后又在此基础上做了升级,尤其是代码智能提示,自动生成一些相关的类文件的确方便了很多。java开发工具还有NetBeans 、Visual Studio Code等其他工具,但是那些我没用过,相关介绍大家可以自行从网上搜索相关资料。二.接口调试工具作为一名开发人员,完成开发工作后,肯定要自己进行测试,这可能还会用到接口测试的一些工具。1.Postman 官网地址Postman是一款功能非常棒的Chrome扩展,提供功能强大的API&HTTP请求调试。它可以发送几乎所有类型的HTTP请求,并可以附带任何数量的参数和请求头(headers)。2.Apipost 官网地址ApiPost是一个支持模拟POST、GET、PUT等常见HTTP请求,支持团队协作,并可以直接生成并导出接口文档的API文档、调试、Mock、测试一体化协作平台。3.ApiFox 官网地址API 文档、API 调试、API Mock、API 自动化测试,一体化协作平台。平台化的产品不多说。4.Charles 官网地址Charles 是一个 HTTP 代理 / HTTP 监视器 /反向代理,它使开发人员能够查看他们的机器和 Internet 之间的所有 HTTP 和 SSL / HTTPS 流量。这包括请求、响应和 HTTP 标头(其中包含 cookie 和缓存信息)。charles更多的用在监视接口调用情况,说直白点就是抓包工具,类似的工具还有 Fiddler 和Wireshark。三.测试工具1.jmeter 官网地址Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。jmeter能够进行接口测试和性能测试,可是对于作单纯的接口测试jmeter操做起来没有postman、apipost使用起来方便。jmeter重点在于压力测试,稳定性测试和负载测试。针对于接口和程序的稳定性设计的一款以软件性能为主,接口测试为辅的接口测试工具。2.JTest 官网地址JTest是Parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。3.JUnit 官网地址JUnit是一个为Java编程语言设计的单元测试框架。 JUnit为测试驱动开发框架的发展发挥了重要作用。它是现在被统称为xUnit的单元测试框架大家庭的组成成员之一,源于SUnit。在编译时,JUnit可以连接作为JAR,用于编写可重复的测试。4.Arquillian官网地址Arquillian是JVM一个高度创新性和可扩展的测试平台,支持Java开发人员轻松创建自动化集合的,功能性的和验收的测试。Arquillian允许在运行时间执行测试。Arquillian可以用来管理单个或多个容器的生命周期,捆扎测试用例,从属类和资源。它还能够部署归档到容器中,在容器中执行测试、捕获结果,并创建报告。Arquillian集成了常见的测试框架,如JUnit 4、TestNG 5,并允许使用现有的IDE发布测试,并且由于其模块化的设计使得能够运行Ant和Maven测试插件。四.远程连接工具国内程序员大部分都是在windows环境开发,但是开发完毕后,免不了需要部署到服务器(Liunx);特别是Java开发的程序,几乎都是部署在Linux系统,如何把程序部署到远程的Linux服务器呢?这时候远程连接工具就派上用场了。1.XshellXshell是一个功能强大的终端模拟器,支持SSH、SFTP、telnet,rlogin和串行。人们可以使用它在Windows界面下用来访问远端不同系统下的服务器,从而达到远程控制终端的目的。2.SecureCRTSecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件。3.FileZillaFileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能。可控性、有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP客户端工具,而FileZilla Server则是一个小巧并且可靠的支持FTP&SFTP的FTP服务器软件。FileZilla是一种快速、可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色、直接的接口。4.PuttyPuTTY是一个Telnet/SSH/rlogin/纯TCP以及串行连线软件。较早的版本仅支援Windows平台,在最近的版本中开始支援各类Unix平台,并打算移植至Mac OS X上。除了官方版本外,有许多非官方的团体或个人将PuTTY移植到其他平台上,像是以Symbian为基础的移动电话。五.数据库视图工具因为我以前做后台的时候主要用的是MySql,所以这部分主要列举MySql数据库图形化工具,如果工作用Oracle或者SqlServer的同学自行从网上找相关资料,当然下面介绍的工具有些也支持oracle和SqlServer。1.Navicat 官网地址Navicat是一套快速、可靠的数据库管理工具,Navicat 是以直觉化的图形用户界面而建的,可以兼容多种数据库,支持多种操作系统。2.MySQL Workbench 官网地址MySQL Workbench是一个统一的可视化开发和管理平台,该平台提供了许多高级工具,可支持数据库建模和设计、查询开发和测试、服务器配置和监视、用户和安全管理、备份和恢复自动化、审计数据检查以及向导驱动的数据库迁移。 MySQL Workbench是MySQL AB发布的可视化的数据库设计软件,它的前身是 FabForce 公司的 DDesigner 4。 MySQL Workbench 为数据库管理员、程序开发者和系统规划师提供可视化设计、模型建立、以及数据库管理功能。它包含了用于创建复杂的数据建模ER模型,正向和逆向数据库工程,也可以用于执行通常需要花费大量时间和需要的难以变更和管理的文档任务。MySQL工作台可在Windows,Linux和Mac上使用。3.SQLyog 官网地址SQLyog 是一个易于使用的、快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库。SQLyog是业界著名的Webyog公司出品的一款简洁高效、功能强大的图形化MySQL数据库管理工具。使用SQLyog可以快速直观地让您从世界的任何角落通过网络来维护远端的MySQL数据库。4.DataGripDataGrip,是大名鼎鼎的JetBrains公司出品的,就是那个出品Intellij IDEA的公司。DataGrip是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql、创建表、创建索引以及导出数据等。下载地址:https://www.jetbrains.com.cn/datagrip/六.其他工具1.文本编辑工具EditPlus在程序员的日常工作中,编辑器的使用是不可缺少的,一个好用方便的文本编辑器会在一定程度上提高工作效率。EditPlus属于轻量级的编辑器,就小编而言,用EditPlus多些。不敢说EditPlus更好,但部分回复对EditPlus存在的说法做一些纠正。editplus提供了与Internet的无缝连接,可以在EditPlus的工作范围中开启Intelnet访问窗口。提供了多工作窗口,无需转换到桌面便可在工作范围中开启好几个文档。editplus默认支持HTML.CSS.PHP.ASP.Perl.C/C++.java.JavaScript和VBScript等语法突出显示,通过定制语法文档,可以扩展到别的程序语言。2.文本编辑工具Notepad++Notepad就是记事本,它用于文本编辑,在文字编辑方面与Windows写字板功能相当。所见即所得功能、语法高亮、字词自动完成功能,支持同时编辑多重文档,支持自定义语言。对于HTML网页编程代码,可直接选择在不同的浏览器中打开查看,以方便进行调试。自动检测文件类型,根据关键字显示节点,节点可自由折叠/打开,可显示缩进引导线,使代码富有层次感。可打开双窗口,在分窗口中又可打开多个子窗口,允许快捷切换全屏显示模式,支持鼠标滚轮改变文档显示比例。可显示选中文本的字节数,并非普通编辑器所显示的字数。提供了一些实用工具,如邻行互换位置、宏功能等。类似的文本编辑类的工具有很多,我现在开发做的少了,平时开会主要用一些线上的平台如幕布、有道云笔记之类的。3.画图类的工具这部分主要用于接收到需求做系统设计或者方案用,这类工具主要是为了理清楚思路;如Visual paradigm、OmniGraffle、ProcessOn。Visual paradigm:Visual Paradigm for UML (VP-UML)是一款UML建模和CASE工具,产品具有建模版、标准版等功能。OmniGraffle:OmniGraffle是由The Omni Group制作的一款绘图软件,其只能于运行在Mac OS X和iPad平台之上。OmniGraffle可以用来绘制图表,流程图,组织结构图以及插图,也可以用来组织头脑中思考的信息,组织头脑风暴的结果,绘制心智图,作为样式管理器,或设计网页或PDF文档的原型。ProcessOn:支持绘制思维导图、流程图、UML、网络拓扑图、组织结构图、原型图、时间轴等等我自己平时用的最多的其实是Xmind,这个看大家自己习惯吧,目的就是理清楚思路。4.项目管理协作工具项目管理协作工具也是我们开发过程中经常会用到的。这方面的产品也有很多:Slack、Asana、Teambition、Worktile、Towe、禅道等这部分就不一一赘述了,很早之前转载过一篇文章专门介绍过这个,大家感兴趣直接看这篇文章项目管理协作工具即可。5.在线开发辅助工具• BASE64编解码工具:https://base64.supfree.net/• MD5编码工具:https://www.zxgj.cn/g/md5• AES/DES加解密:http://www.fly63.com/tool/cipher/• JWT解码工具:http://jwt.calebb.net/• ASCII编解码工具:https://www.matools.com/code-convert-ascii• Unicode编解码工具:https://www.zxgj.cn/g/unicode• UTF-8编解码工具:https://www.zxgj.cn/g/utf8• 字符串编解码工具:https://www.zxgj.cn/g/enstring• URL编解码工具:http://tool.chinaz.com/tools/urlencode.aspx?jdfwkey=lbixz1• 在线ASCII码对照表:http://www.fly63.com/tool/ascii/• 通用进制转换工具:https://www.zxgj.cn/g/jinzhi• 在线浮点数十进制转换:http://www.binaryconvert.com/• RGB颜色转换:https://www.zxgj.cn/g/yansezhi• 时间戳转换工具:https://www.zxgj.cn/g/unix• 计量单位换算工具:http://www.fly63.com/tool/unitable/• 在线JSON解析:http://www.json.cn/• 在线JS代码格式化工具:https://prettier.io/playground/• SQL压缩/格式化工具:https://www.zxgj.cn/g/sqlformat• JSON和XML在线转换:https://www.zxgj.cn/g/jsonxml• JSON/YAML在线转换:http://www.fly63.com/tool/jsonyaml/6.华为云平台目前很多公司都在用低代码开发平台开发应用了,摆脱了大量的编码工作,让程序员将精力投身到业务当中来。所谓低代码开发,即无需编码或只需少量代码就可以快速生成应用程序。也就是说,企业的应用开发通过“拖拉拽”的方式即可完成。这其中比较典型的是华为云的DevCloud,推荐给大家。· 高效易用的低代码aPaaS平台-应用魔方AppCube:https://www.huaweicloud.com/product/appcube.html· 集华为研发实践、前沿研发理念、先进研发工具为一体的软件开发平台-软件开发平台 DevCloud:https://www.huaweicloud.com/devcloud/总结其实开发过程中用过的各种各样的工具还有很多,只是一时间无法全部都枚举出来,后续想到其他的好用工具会持续补充到文章中,文档中涉及到的工具找不到的可以评论区留言或者私信我,希望本文对大家有所帮助。以上内容分享自华为云社区《【云驻共创】 JAVA常用的开发工具有哪些?》,作者:再见孙悟空_。点击关注,第一时间了解华为云新鲜技术~
2023年12月07日
0 阅读
0 评论
0 点赞
2023-12-07
学会了吗(java从零基础到入门学什么)java零基础入门教程,Java 从零开始(39)Java 数据库编程,java数据库编程实例,
Java 数据库编程本小节我们将学习如何使用 Java 语言结合数据库进行编程。注意,学习本小节需要你有一定的 SQL 基础,了解 MySQL 数据库的 基础 CRUD 操作,如果你还不了解 SQL ,推荐先去学习一个非常不错的 wiki 教程,只需掌握前几节的 SQL 初级知识即可。本小节我们将选择开源免费的 MySQL 5.7 作为数据库,可以去官网下载并安装 MySQL,如果你不知如何下载安装,推荐按照这篇文章 来做。通过本小节的学习,你将了解到什么是 JDBC,如何连接数据库,如何关闭数据库,JDBC 的新增、查询、更新和删除接口,如何执行批量等内容。1. JDBC 概述1.1 什么是 JDBCJDBC 就是 Java DataBase Connectivity 的缩写,它是 Java 的标准库,定义了客户端访问数据库的 API。市面上的数据库有很多种类,连接不同的数据库需要加载不同的数据库驱动。数据库驱动是由厂商提供的,需要我们引入。标准库编写了一套访问数据库的代码,因此不需要标准库代码的改动,只需加载不同的驱动,就可以访问不同的数据库。1.2 JDBC 的作用在 JDBC 出现之前,数据库驱动程序由不同的数据库厂商提供,程序员想要操作不同的数据库,就不得不学习各类不同驱动的用法,驱动的学习成本和代码的维护成本都非常高。Sun 公司发现了这个问题,因此定义了一套标准的访问数据库的 API(即 JDBC),不同厂商按照这个 API 提供的统一接口,实现驱动,这保证了数据库操作的统一性。程序员也不需要再去学习不同厂商提供的五花八门的 API,只需要学习 JDBC 标准 API 即可。代码维护的成本也大大降低。2. 连接数据库2.1 建库建表打开 MySQL 客户端,执行如下 sql 语句:-- 创建数据库并使用CREATE DATABASE jdbcdemo;USE jdbcdemo;-- 创建数据表CREATE TABLE `user` (`id` int(11) PRIMARY KEY AUTO_INCREMENT,`username` varchar(20) NOT NULL comment "用户名",`nickname` varchar(20) NOT NULL comment "昵称",`password` CHAR(32) NOT NULL comment "密码");-- 插入一些数据insert into `user` values(null, "Colorful", "Colorful3", "123456");insert into `user` values(null, "imooc", "小慕", "123456");insert into `user` values(null, "Lillian", "小李", "123456");执行截图如下:查询 user 表所有记录,结果如下:2.2 引入驱动去 maven 中央仓库 找到 mysql-connector-java 驱动。如果你熟悉 Maven,可直接引入 maven 依赖:<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency>如果你还不熟悉 Maven,请跟着我来做如下步骤:到 maven 中央仓库 下载 jar 包,鼠标左键单击 jar:在工程目录下新建一个 lib 包,并将刚刚下载好的 jar 包复制到其中:在 jar 包上点击右键,选择 Add as Library:如果有弹窗,单击确定即可。此时就可以在你的项目中引入驱动里的类了。2.3 实例我们下面通过实例代码来演示 JDBC 的简单使用,以下实例代码有这样几个步骤:加载数据库驱动;建立连接;创建 Statement 对象,用于向数据库发送 SQL 语句;获取 ResultSet 对象,取出数据,此对象代表结果集;释放资源,断开与数据库的连接。具体实例如下:package com.imooc.jdbc;import com.mysql.jdbc.Driver;import java.sql.*;public class JDBCDemo1 {public static void main(String[] args) throws SQLException {// 1. 加载数据库驱动 DriverManager.registerDriver(new Driver());// 2. 建立连接 final String url = "jdbc:mysql://localhost:3306/jdbcdemo"; // 数据库 url final String user = "root"; // 数据库用户名 final String password = "123456"; // 数据库密码 Connection connection = DriverManager.getConnection(url, user, password);// 3. 创建 Statement 对象,用于向数据库发送 SQL 语句 String sql = "SELECT * FROM `user`";Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(sql);// 4. 获取 ResultSet 对象,取出数据,此对象代表结果集 while (resultSet.next()) {int id = resultSet.getInt("id");String username = resultSet.getString("username");String nickname = resultSet.getString("nickname");String pwd = resultSet.getString("password");System.out.println("id=" + id + "; username=" + username + "; nickname=" + nickname + "; password=" + pwd + \r);}// 5. 释放资源,断开与数据库的连接(调用 close() 方法) // 5.1 释放 ResultSet resultSet.close();// 5.2 释放 Statement statement.close();// 5.3 释放 Connection connection.close();}}运行结果:id=1; username=Colorful; nickname=Colorful3; password=123456id=2; username=imooc; nickname=小慕;password=123456id=3; username=Lillian; nickname=小李;password=123456看了实例代码,你可能有些晕,这写类都是干嘛的呀?别担心,我们下面就来一一讲解。4. JDBC 几个类的详解在上面的实例程序中,我们用到了几个 JDBC 的类:DriverManager、Collection、Statement 和 ResultSet,下面我们将详细介绍这几个类。4.1 DriverManagerDriverManager 是驱动管理类,此类用于注册驱动和获得连接。在实际开发中,我们不是像实例这样注册驱动的,我们编写这样地代码会导致驱动注册两次:// 1. 加载数据库驱动DriverManager.registerDriver(new Driver());通过查看 com.mysql.jdbc.Driver 源码,我们发现在静态代码块处已经注册过了驱动:图片描述那么如何改写呢,我们可以使用反射机制来注册驱动:Class.forName("com.mysql.jdbc.Driver");加载了 Driver 类,其静态代码块就会执行,因此也就注册了驱动。除了获得驱动,我们还可以调用 getConnection(url, user, password) 方法来获得连接,其中 url 这个参数不是很好理解:String url = "jdbc:mysql://localhost:3306/jdbcdemo";其中 jdbc 是协议,mysql 是子协议,localhost 是主机名,3306 是端口号,jdbcdemo 是数据库名。/ 这里的协议是固定地写法,连接不同类型地数据库需要不同地协议。4.2 ConnectionConnection 是连接对象,它可以创建执行 SQL 语句的对象,还可以进行事务的管理。下面列举了 Connection 类的常用实例方法:Statement createStatement():创建执行 SQL 语句对象,又 SQL 注入风险;PrepareStatement prepareStatement(String sql):预编译 SQL 语句,解决 SQL 注入的漏洞;CallableStatement prepareCall(String sql):执行 SQL 中存储过程;setAutoCommit(boolean autoCommit):设置事务是否自动提交;commit():事务提交;rollback():事务回滚。4.3 StatementStatement 是执行 SQL 语句的对象,下面列举了 Statement 类的常用实例方法:boolean execute(String sql):执行 SQL 语句,如果返回的第一个结果为 ResultSet 对象,则返回 true,如果其为更新计数或者不存在任何结果,则返回 false。该方法不常用;ResultSet executeQuery(String sql):执行 SQL 中的 select 语句;int executeUpdate(String sql):执行 SQL 中的 insert、update、delete 语句,返回影响的行数。Statement 还可以执行批量操作,关于批量操作,我们将在下面学习。4.4 ResultSetResultSet 是结果集对象,它是 select 语句查询的结果的封装。下面列举了 ResultSet 类的常用实例方法:boolean next():将光标从当前位置向前移一行,判断是否有下一行记录;getString(String columnLable):以 Java 语言中 String 的形式获取此 ResultSet 对象的当前行中指定的值;getInt(String columnLable):以 Java 语言中 int 的形式获取此 ResultSet 对象的当前行中指定的值;getXXX():对于不同类型的数据,可以使用 getXXX() 来获取数据(例如 getString(),getInt()),另外还有一个通用的 getObject() 方法,用于获取所有 Object 类型的数据。4.5 JDBC 资源的释放JDBC 程序运行完成后,一定要记得释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是 ResultSet、Statement 和 Connection 对象。特别是 Connection 对象,它是非常稀有的资源,用完后必须马上释放,如果此对象不能及时、正确的关闭,极易导致系统的宕机。Connection 对象的使用原则是尽量晚创建,尽量早释放。5. CRUD5.1 新增数据在执行新增数据的代码前,user 表中有如下数据:mysql> select * from user;+----+--------------+--------------+----------+| id | username | nickname | password |+----+--------------+--------------+----------+| 1 | Colorful | Colorful3 | 123456 || 2 | imooc | 小慕 | 123456 || 3 | Lillian | 小李 | 123456 |+----+--------------+--------------+----------+3 rows in set (0.00 sec)新增数据的实例代码如下:package com.imooc.jdbc;import java.sql.*;public class JDBCDemo2 {/** * 插入语句* @return 受影响的行数 */public static int insert() {final String url = "jdbc:mysql://localhost:3306/jdbcdemo"; // 数据库 url final String user = "root"; // 数据库用户名 final String password = "123456"; // 数据库密码Connection connection = null;Statement statement = null;int result = 0;try {// 1. 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver");// 2. 建立连接 connection = DriverManager.getConnection(url, user, password);// 3. 创建 Statement 对象,用于向数据库发送 SQL 语句 String sql = "INSERT INTO `user` VALUES(null, \"testUsername\", \"testNickname\", \"123456\")";statement = connection.createStatement();result = statement.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();} finally {// 4. 释放资源,断开与数据库的连接(调用 close() 方法) if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}statement = null;}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}// 此处手动设置为 null,有益于垃圾回收机制更早地回收对象 connection = null;}}return result;}public static void main(String[] args) {int rows = JDBCDemo2.insert();System.out.println("受影响的行数为:" + rows);}}运行结果:受影响的行数为:1此时,查询数据库中的记录,可以发现多了 1 条:mysql> select * from user;+----+--------------+--------------+----------+| id | username | nickname | password |+----+--------------+--------------+----------+| 1 | Colorful | Colorful3 | 123456 || 2 | imooc | 小慕 | 123456 || 3 | Lillian | 小李 | 123456 || 4 | testUsername | testNickname | 123456 |+----+--------------+--------------+----------+4 rows in set (0.00 sec)5.2 读取数据读取数据的示例如下:package com.imooc.jdbc;import java.sql.*;public class JDBCDemo3 {/** * 根据 id 查询用户 * @param id 用户的 id */public static void selectUserById(int id) {final String url = "jdbc:mysql://localhost:3306/jdbcdemo"; // 数据库 url final String user = "root"; // 数据库用户名 final String password = "123456"; // 数据库密码 Connection connection = null;Statement statement = null;ResultSet result = null;try {// 1. 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver");// 2. 建立连接 connection = DriverManager.getConnection(url, user, password);// 3. 创建 Statement 对象,用于向数据库发送 SQL 语句 String sql = "SELECT * FROM `user` WHERE id = " + id;statement = connection.createStatement();// 4. 获取 ResultSet 对象,取出数据 result = statement.executeQuery(sql);while (result.next()) {String nickname = result.getString("nickname");String username = result.getString("username");String pwd = result.getString("password");System.out.println("id=" + id + "; username=" + username + "; nickname=" + nickname + "; password=" + pwd + \r);}} catch (Exception e) {e.printStackTrace();} finally {// 5. 释放资源,断开与数据库的连接(调用 close() 方法) if (result != null) {try {result.close();} catch (SQLException e) {e.printStackTrace();}result = null;}if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}statement = null;}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}// 此处手动设置为 null,有益于垃圾回收机制更早地回收对象 connection = null;}}}public static void main(String[] args) throws SQLException {JDBCDemo3.selectUserById(4);}}运行结果:id=3; username=Lillian; nickname=小李;password=1234565.3 更新数据在执行更新数据的代码前,user 表中有如下数据:mysql> select * from user;+----+--------------+--------------+----------+| id | username | nickname | password |+----+--------------+--------------+----------+| 1 | Colorful | Colorful3 | 123456 || 2 | imooc | 小慕 | 123456 || 3 | Lillian | 小李 | 123456 || 4 | testUsername | testNickname | 123456 |+----+--------------+--------------+----------+4 rows in set (0.00 sec)更新数据的实例代码如下:package com.imooc.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;public class JDBCDemo4 {/** * 更新 * @return 受影响的行数 */public static int updateById(int id) {final String url = "jdbc:mysql://localhost:3306/jdbcdemo"; // 数据库 url final String user = "root"; // 数据库用户名 final String password = "123456"; // 数据库密码 Connection connection = null;Statement statement = null;int result = 0;try {// 1. 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver");// 2. 建立连接 connection = DriverManager.getConnection(url, user, password);// 3. 创建 Statement 对象,用于向数据库发送 SQL 语句 String sql = "UPDATE `user` SET `nickname` = 更新后的 nickname WHERE id = " + id;statement = connection.createStatement();result = statement.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();} finally {// 4. 释放资源,断开与数据库的连接(调用 close() 方法) if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}statement = null;}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}// 此处手动设置为 null,有益于垃圾回收机制更早地回收对象 connection = null;}}return result;}public static void main(String[] args) {int rows = JDBCDemo4.updateById(4);System.out.println("受影响的行数为:" + rows);}}运行结果:受影响的行数为:1更新数据代码执行完成后,可以观察到 id 为 4 的记录 nickname 字段发生了改变:mysql> select * from user;+----+--------------+----------------------+----------+| id | username | nickname | password |+----+--------------+----------------------+----------+| 1 | Colorful | Colorful3 | 123456 || 2 | imooc | 小慕 | 123456 || 3 | Lillian | 小李 | 123456 || 4 | testUsername | 更新后的 nickname | 123456 |+----+--------------+----------------------+----------+4 rows in set (0.00 sec)5.4 删除数据在执行删除数据的代码前,user 表中有如下数据:mysql> select * from user;+----+--------------+----------------------+----------+| id | username | nickname | password |+----+--------------+----------------------+----------+| 1 | Colorful | Colorful3 | 123456 || 2 | imooc | 小慕 | 123456 || 3 | Lillian | 小李 | 123456 || 4 | testUsername | 更新后的 nickname | 123456 |+----+--------------+----------------------+----------+4 rows in set (0.00 sec)删除数据的实例代码如下:package com.imooc.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;public class JDBCDemo5 {/** * 删除 * @return 受影响的行数 */public static int deleteById(int id) {final String url = "jdbc:mysql://locahost:3306/jdbcdemo"; // 数据库 url final String user = "root"; // 数据库用户名 final String password = "123456"; // 数据库密码Connection connection = null;Statement statement = null;int result = 0;try {// 1. 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver");// 2. 建立连接 connection = DriverManager.getConnection(url, user, password);// 3. 创建 Statement 对象,用于向数据库发送 SQL 语句 String sql = "DELETE FROM `user` WHERE id = " + id;statement = connection.createStatement();result = statement.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();} finally {// 4. 释放资源,断开与数据库的连接(调用 close() 方法) if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}statement = null;}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}// 此处手动设置为 null,有益于垃圾回收机制更早地回收对象 connection = null;}}return result;}public static void main(String[] args) {int rows = JDBCDemo5.deleteById(4);System.out.println("受影响的行数为:" + rows);}}运行结果:受影响的行数为:1在执行删除数据的代码后,可观察到 id 为 4 的记录被成功删除,数据库只剩下了 3 行记录:mysql> select * from user;+----+--------------+----------------------+----------+| id | username | nickname | password |+----+--------------+----------------------+----------+| 1 | Colorful | Colorful3 | 123456 || 2 | imooc | 小慕 | 123456 || 3 | Lillian | 小李 | 123456 |+----+--------------+----------------------+----------+3 rows in set (0.00 sec)6. 批量操作当我们需要向 user 表插入多条数据的时候,可以循环调用我们在上面 JDBCDemo2 实例代码中封装的 insert() 方法,但这样的效率是非常低的。Statement 对象有如下常用的用于批量操作的方法:void addBatch(String sql):将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中;int[] executeBatch():将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组;void clearBatch():清空此 Statement 对象的当前 SQL 命令列表。7. 小结通过本小节的学习,我们了解了 JDBC 定义了客户端访问数据库的 API,不同厂商通过实现统一的 JDBC 接口,降低了程序员的学习成本和维护成本。DriverManager 类用于注册驱动和获得连接;Connection 是连接对象,它可以创建执行 SQL 语句的对象,还可以进行事务的管理;Statement 是执行 SQL 语句的对象、ResultSet 是结果集对象,它是 select 语句查询的结果的封装。为了防止 SQL 注入,推荐使用 PrepareStatement 对象来预编译 SQL 语句,对于内容相同,参数不同的 SQL,推荐使用 JDBC 的 batch 操作,可大大提高执行效率。微信公众号老徐说本文使用 WPL/s 发布 @GitHub
2023年12月07日
0 阅读
0 评论
0 点赞
1
2
...
343