分类

类型:
不限 游戏开发 计算机程序开发 Android开发 网站开发 笔记总结 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
原创:
不限
年份:
不限 2018 2019 2020 2021

技术文章列表

  • 基于SSM框架的B/S微博系统的设计与实现

    第一章 绪 论时至今日,网络对于现代人来说,早已成为人类科技发展进步的桥梁,而通过网络衍生出的一系列产品也不断的冲击着人们的日常生活,截至2016年年底,我国网名数量达到7亿,有超多一半多人在使用网络,而它天涯咫尺的作用,不但消除了人与人地域上的距离,更是拉近了心灵的距离,沟通与互动变的异常频繁与重要。
    随着互联网新时代的来临,微博借着互联网的桥梁,逐渐进入网名的视野中,没有博客的长篇大论,也不需要严谨的逻辑层次,这使得网络中一大批的原创文章被生产发掘,短短几句话便可以在网络中激起千层浪,普通人也可能在一夜之间成为拥有数千万粉丝的“网红”。微博的便捷、原创、和草根性使它成为中国网民茶余饭后的网上生活。
    早在2006年3月,Obvious推出了Twitter服务,这个世界上最早同时也是最著名的微博系统,而在那是,微博也仅仅只是为了给好友发送手机短信,在中国,饭否网的上线标志中国微博的开端,之后腾讯滔滔、叽歪、嘀咕等微博的开荒者终究也都没能站在最后。
    2010年,我国的微博得到迅速发展,这一年,无论微博的用户还是影响力都达到前所未有的高度,以新浪门户为首的腾讯、新浪、搜狐等微博展现出全新的活力。到了2013年6月,中国微博用户规模高达3.31亿人,在微博中流动的信息有超过2亿多条。
    2010年11月,新浪微博推出群组功能,这个功能不但可以与好友实时联系,又可以随时发布最新信息,2012年添加新功能“悄悄关注”,在用户关注后不通知被关注用户,也不显示给被关注用户,2013年,微博推出包括iPhone和Android的移动客户端,新增“密友”功能,同年10月份新浪微博“粉丝服务平台”上线,粉丝服务平台帮助认证用户为订阅自己的用户提供精彩内容和互动服务,自此微博由“营销”向“营销+服务”转型!而新浪微博依旧延续这自己的名人效应,一个普通账号,在没有粉丝关注的情况下,发布的微博却很难被他人看到,如果需要在微博中求助,没有“名人大V”的帮助,很难被别人所注意到。想要在微博中寻求帮助,就需要微博提供更多的服务。而本系统通过使用积分悬赏功能使得用户可以通过积分悬赏自己的问题,来让更多的用户回答自己的问题,得到更多人的帮助。
    第二章 相关技术介绍2.1 架构概述B/S架构(Browser/Server,浏览器/服务器模式):是一种通过将浏览器作为客户端的网络结构模式,利用已经逐步成熟的web浏览器技术,结合浏览器的多种功能,使用浏览器来作为早先C/S(Client/Serve)架构下复杂的客户端,使用C/S架构使得用户的客户端得到统一,将软件系统的核心功能集中在服务器端,系统的升级和维护更加简单,开发人员只需要管理服务器就可以做到对如软件系统的更新和维护,B/S架构所带来的众多优点使得它成为将来信息化发展的主流方向。
    MVC模式:即模型(Model),视图(View),控制器(Controller)是一种软件开发的设计模式,Model主要负责分离出来的业务逻辑的数据交互,View主要负责数据的提交和展示,Controller主要负责获取请求和请求的转发。
    SSM框架(SpringMVC+Spring+Mybatis):由这三个开源框架组成的web项目的框架,是标准的MVC模式,spring MVC负责请求的转发和视图管理,spring实现业务对象管理和事务控制,mybatis作为持久化引擎,相对于早先流行的SSH(Struts+Spring+Hibernate)框架来说,SSM作为轻量级框架更适合开发中小型项目。
    2.2 关键技术简介前端技术
    JSP(Java Server Pages):嵌入了java代码的html页面,本质是一个servlet,它实现了在htmld的语法中扩展java代码,使用<% %>格式。
    JavaScript:是一种弱类型的脚本语言,由ECMAScript描述JavaScript的基本对象和语法,文档对象模型(DOM),浏览器对象模型(BOM)三部分组成。
    Ajax(Asynchronous Javascript And XML):异步的JavaScript和XML,实现前后台之间的异步交互,在不需要重新加载整个页面的前提下对页面上的部分内容做局部刷新。

    后台技术java:一种面向对象的编程语言,主要特性包括有

    简单性:抛弃了C++中复杂的语法和指针多继承等特征,开发人员不需要关注底层优化,只需要关注业务逻辑就行
    面向对象性,对程序员而言,只需要注意对应的数据和处理数据的方法,不用严格按照过程的方式来编写代码,因为java语言是面对对象的,因此也拥有面向对象的三大特征,继承、封装和多态
    跨平台性,java语言的跨平台性也就是JVM(java虚拟机)的跨平台性。Java文件编译后不会直接生成机器直接运行的二进制文件,而是编译成class文件,JVM会将编译的class文件根据不同操作系统下的JVM来生成对应系统的二进制文件,只需要编译一次,就可以在不同的平台上运行

    SpringMVC:是Spring框架提供的一个模块,通过实现MVC模式来地将数据、业务与展示进行分离,简化了Web开发。和其他MVC框架一样都是请求驱动,控制转发,它的核心Servlet是DispatcherServlet,即前端控制器,用来分发请求到控制器,它和Spring框架完全整合。这也使得SpringMVC成为目前非常流行的MVC框架。
    Spring:一款轻量级java开发框架,Spring框架有着分层的体系结构,因此可以使用Spring中 独立的任意部分。而它的架构依旧是内在稳定的,Spring提供了J2EE应用各层解决方案,贯穿于三层架构的每一层,但Spring依旧可以很好的兼容其他框架,本项目主要用到了Spring中IOC(控制反转)和AOP(面向切面编程)模块。
    Mybatis:是一个简化Java持久化层的轻量级开源框架。并且支持注解的Mapper,Mybatis消除了绝大部分的JDBC代码,使得java对象持久化到数据库的过程变的更加容易,相对于其他的java持久化框架,Mybatis的优点在于,消除了大量的JDBC冗余代码、简单易学、可见的Sql语句、提供了于Spring的整合,引入更好的性能。
    2.3 开发工具Tomcat服务器:是一个Web应用服务器,它是轻量且开源的,是中小型Web项目和开发调试和学习的首选。
    Oracle数据库(Oracle Database):是由Oracle公司开发的一款关系型数据库,是商业运用第一的关系型数据库,系统使用方便,功能强大,可移植性强。适用于各种大中小环境,在大数据时代,作为分布式数据库,它实现了分布式处理的功能,具有完整的数据管理功能、完备的关系型数据库、分布式处理功能。
    Eclipse开发工具:一个基于java开源的可扩展开发平台,它不但包括java集成开发环境,还包括插件开发环境,如SVN、CVS等团队开发插件。
    2.4 本章小结本章主要介绍了开发项目用到的一些主要技术,项目所使用的架构和设计模式,项目中所使用到的主要框架技术,项目在浏览器端展示用到的前端技术和展示方式,后台代码使用的开发语言,使用的服务器技术,数据持久层所使用的数据库等,在本章最后又介绍了开发使用到的开发工具。
    第三章 系统需求分析3.1 可行性分析3.1.1技术可行性在已有技术方面,为了统一客户端,消除因版本升级和维护带来的复杂性,因此采用成熟的B/S架构在项目的实现上完全可行,在开发语言和框架方面,java和j2ee体系的强大,可以让开发人员精心的构建web项目,以及一系列的开源框架,都为项目的可行性提供了强大的依据,在服务器方面,使用开源服务器Tomcat,足以支持该小型项目的正常使用,而不断发展的前端技术和前端框架可以制作精美的前台页面,提高用户的体验和交互,这在项目的页面展示技术上完全可行,强大的关系型数据库为项目数据的持久化提供强有力的后援。综上所述,日趋成熟化的java和j2ee体系、完全开源的java框架和服务器、功能强大的关系型数据库、运用Web前端技术提供用户交互页面,所以该项目在技术方面完全可行。
    3.1.2 经济可行性在互联网发展到信息时代的今天,单一获取信息的方式已经不能满足人们,人们每天接触的信息越来越多,而获取信息的形式也越来越多,但大多数获取信息的方式,留给用户交互的方式并不多,大都数情况下,人们只能被动获取,而很难找到自己的喜好和需求来获取信息,而本微博项目可以让人们获取实时热点信息和他们所关注的信息,实时与微博信息交互。而使用大量成熟技术与开源框架下,也使得小项目的开发更加简单,经济,高效,因微博而兴起的微博效应也能带来一定的经济效益。
    3.1.3 操作可行性微博系统使用B/S架构,用户不需要下载客户端,只需要用户有浏览器,就可以在浏览器上登陆微博系统,微博系统的界面颜值高,用户交互性高,用户操作简单方便,只需要了解基本的计算机操作就能使用,用户体验性高。因此在系统操作上完全可行。
    3.2 需求分析3.2.1 系统总体需求该微博系统主要由前台用户模块和后台管理模块组成,当用户进入首页时可以选择登陆或不登陆,登陆时可以使用已有账号登陆或注册新账号。用户未登陆时,在首页显示最近更新的热门微博,而登陆后的用户可以在首页看到 自己关注用户最近更新的微博。
    未登陆用户只能搜索查看微博信息和访问用户主页,登陆用户可以登陆系统后修改自己的基本信息例如签名、性别等,在验证用户信息后还可以修改密码和密保信息。以及修改用户头像和密码,编辑自己的个人主页,对微博进行点赞、评论、收藏等功能,还可以关注/取消关注用户,拉黑用户、私聊用户等操作。
    后台管理员可以查看系统所有的数据,包括用户、微博、评论、海螺、回答的总量,最近一个的数据库,最近一周的数据量。具体所具有的功能包括管理不良微博信息与不良账号,对微博、微博评论、海螺、回答等信息的删除和恢复功能,对不良账号的封禁等操作。
    微博查找模块:用户可以输入关键字来查找相对应的微博或查找用户。
    微博发布模块:用户点击发布,在内容中添加自己想要发送的内容,可以选择表情,也可以插入图片,但对输入字符数有着限制,同时还可以插入一张图片。
    微博评论模块:用户可以查看微博的评论,发布微博评论等。
    神奇海螺模块:用户可以发布一个神奇海螺,海螺主要用来记载用户提出的各种问题,由其他用户来查看并回答问题,当回复者的答案被提问者采纳后,回答者可以增加自己的海螺积分,不同的海螺积分有着不同的海螺称号。
    积分模块:用户每天登陆,发微博,做任务等方式可以增加自己的积分,不同的积分拥有不同的称号,神奇海螺模块的积分有着不同的称号,称号显示在用户名称的后面。
    好友模块:用户可以查看系统中其他的用户,找到自己喜爱的用户然后关注他们,关注后可以在好友模块中查看自己关注的用户,以及好友最近发布的微博等信息,也可以私信好友,发送私信信息给好友。
    3.2.2 用例图需求1. 当用户进入系统时候,可以选择登陆或注册用户,如果忘记了密码还可以通过密保问题来重置密码。

    2. 当用户登陆后,可以管理用户的个人基本信息,修改用户基础信息,修改用户密保信息。修改用户头像等功能。

    3. 用户微博管理系统,当用户登陆进去系统时,可以在首页发布微博,通过关键字搜索微博内容中关键字的微博信息。产看微博,包括查看个人微博、好友微博、推荐微博。

    4. 评论管理,评论管理依赖于微博模块,用户可以查看微博的评论,对微博信息发布评论,以及删除自己的评论。

    5. 海螺管理,用户登陆后可以在海螺模块发布海螺问题,发布问题时可以选择悬赏的积分数目,同时减少自己的积分数,用户可以参加回答他人的海螺问题,当回答的答案被采纳时,就可以获得用户悬赏的积分数。

    6. 好友管理,当用户登陆时可以关注系统推荐好友,也可以自己搜索用户,查看用户的主页面,添加关注或取消关注用户,还可以给用户发送私人信息,或者拉黑用户。

    7. 消息通知,当用户的关注,微博评论,点赞,收藏时调用消息通知。

    8. 管理员:管理员登陆系统,可以管理微博用户,对不良用户进行封禁和注销账户的操作,也可以恢复用户的状态,同时也可以对微博信息进行管理,如删除微博,恢复被管理员删除的微博信息等,对微博评论的删除和恢复等操作。

    第四章 系统功能设计4.1 系统类分析4.1.1 实体类实体类主要用来传递数据,主要包括User、Friend、PointAction、PointRecord、Weibo、WeiboCollect、WeiboComm、WeiboLike、WeiboTrans等,用户类中包括用户的基本信息,微博类中包括微博的基本信息同时包含实体用户类,好友类包括好友编号,好友创建时间与关注双方的用户类等,私信类包含私信双方的用户类与私信的基本属性,微博收藏类包含收藏的微博类与用户id等收藏属性,微博评论类包含微博类和用户类以及评论内容等属性,微博转发类包含用户类和微博类以及转发时间等属性,微博点赞类包含微博类和用户类以及点赞时间等属性。实体类之间的类关联关系如图所示。

    4.1.2 控制器类在controller层包含MainController、WeiboController、FrendController、AdminController四个JAVA类,在SpringMVC框架中主要用来接收浏览发送给服务器的请求和数据处理并控制请求的转发,将从Service层中获取的数据响应给浏览器端。MainController主要用发来接收来自用户相关页面中提交的表单或链接请求,并将请求的参数传递到Controller中对应的方法中,携带数据响应给浏览器,在浏览器端显示数据,具体属性和方法如图所示。

    WeiboController主要用发来接收来自微博相关页面中提交的表单或链接请求,并将请求的参数传递到Controller中对应的方法中,并获取到业务处理层中返回的数据,携带数据响应给浏览器,在浏览器端显示数据,具体属性和方法如图4所示。

    FriendController主要用发来接收来自好友相关页面中提交的表单或链接请求,并将请求的参数传递到Controller中对应的方法中,并获取到业务处理层层中返回的数据,携带数据响应给浏览器,在浏览器端显示数据,具体属性和方法如图所示。

    AdminController主要用发来接收来自管理员相关页面中提交的表单或链接请求,并将请求的参数传递到Controller中对应的方法中,并获取到业务处理层层中返回的数据,携带数据响应给浏览器,在浏览器端显示数据,具体属性和方法如图所示。

    4.1.3 业务逻辑类在Service层中主要包含四个Service接口和他们的实现类,包括IUserService用来处理用户业务例如用户注册、登陆、修改个人信息等,如图4.6所示。IWeiboService用来处理微博相关的业务例如查找微博,发布微博,删除微博以及对微博的相关操作例如点赞、评论等功能的业务实现,如图4.7所示。IFriendService用来处理和用户好友相关的业务例如点赞、取消点赞、私信、拉黑等功能的业务实现,如图4.8所示。IAdmoinService用来处理和管理员相关的业务例如管理员登陆、图表展示、用户管理、微博管理、海螺管理功能的业务实现,如图4.8所示。

    图4.6用户业务处理类图

    图4.7微博业务处理类图

    图4.8微博控制器类图
    4.1.4 数据库交互类由于系统采用了MyBatis持久化框架,开发人员不需要关注和数据库之间具体的JDBC代码,而只需要处理业务逻辑,因此只需要在Dao层接口中声明方法而不需要写接口的实现类来实现方法,则是通过配置对应的配置文件,在配置文件中编写对应接口方法中的SQL语句和数据库交互。
    4.2 关键业务设计4.2.1 登陆系统
    图4.9系统登录顺序图
    用户进入主页后,可以在左边选择注册用户,或者在右边登陆系统,在注册模块,用户输入用户邮箱,密码,昵称等信息,当用户输入邮箱后会通过Ajax将用户输入的邮箱传到后台,查找用户邮箱是否已经被注册,如果被注册则在页面提示用户该邮箱已被注册,在输入基本信息点击注册后,保存用户注册信息。
    登陆功能:当用户输入邮箱地址和密码后,如果点击下次自动登陆密码在点击登陆后,判断用户的当前登陆时间和上次登陆时间是否为同一天,如果不是同一天则为用户增加登陆的 积分,然后跳转至微博首页。
    4.2.1 用户信息系统
    图4.10用户修改信息顺序图
    用户基本信息:在系统的首页中点击个人账号设置后,跳转到修改用户基本信息页面,用户可以修改这些基本信息,并将修改后的信息保存在数据库中。
    修改密码:在用户个人资料页面点击修改密码,跳转修改密码页面,用户可以输入用户的当前密码,系统判断密码是否正确,如果密码不正确,显示当面密码错误,如果输入密码正确,用户则可以输入新密码,点击修改后将修改后的密码更新到数据库中。
    修改用户头像:点击用户个人资料中修改头像,跳转至修改头像页面,用户选择头像文件,点击上传,将用户头像保存在服务器上,判断用户之前头像是为系统默认头像,如果不是就删除用户之前的头像图片,点击修改后将修改后的头像地址保存在数据库中。
    修改密保:用户先要根据之前设置的密保问题来填写答案,如果密保答案错误,提示用户密保答案错误,如果密保答案正确,用户可以输入新的密保问题和密保答案,点击修改保存用户新的密保问题和答案。
    4.2.2微博模块
    图4.11系统登录顺序图
    发布微博:用户可以在首页发布微博,在微博信息中可以插入表情,也可以选择插入一张图片,当用户点击发布后,浏览器发送请求将前台页面表单中微博信息和图片信息传入后台控制器,将图片信息保存在服务器中,在数据库中只保存图片路径,最后将微博信息保存在数据库中。
    搜索微博:用户可以在首页的搜索框中输入微博中提到的内容来搜索,系统在数据库中通过迷糊查询查询相关的微博信息。在页面中将搜索到的页面展示出来,并且将关键字标红显示。
    微博操作:用户可以查看个人微博、好友微博、收藏微博等信息,对微博的操作有点赞,转发,收藏,评论,删除等。
    4.2.3 好友模块关注功能:当用户登陆系统后可以在页面右侧的推荐用户中选择需要关注的用户,或者是通过页面中的搜索功能来搜索用户,对搜索到的用户进行关注。关注用户后个人关注+1,同时被关注用户粉丝数+1。
    取消关注:和关注功能类型,在导航栏中点击我的好友,在我的好友首页中查看我的关注好友,就能查看到我所关注的所有好友和好友数以及他们的个人信息,通过点击对应的取消关注就可以取消关注该用户,取消关注用户后个人关注数-1,同时被关注用户粉丝数-1。
    拉黑用户:即修改好友表中对应的记录状态,被拉黑用户所发布的私信和微博信息不会被拉黑用户所看到。
    私信:可以在页面的推荐用户上面查看当前登陆用户的未查看私信数,未读私信的数目通过数据库中对所有接收者为当前登陆用户的所有私信信息,且信息状态为未阅读的私信,将得到的数值展示在前台页面中显示。
    发送私信:用户先选择要发送的用户,输入需要发送的私信信息,可以在私信中插入表情,点击发送后会将私信信息发送给对应用户。同时增加提示该用户的未读私信数。
    搜索用户:在搜索用户页面中,用户可以输入用户昵称的关键字来模糊查询相关用户,并将查询到的用户展示在页面中,同时将用户输入的关键字标红显示。
    用户主页面:在页面中,点击任意一个用户的名称或头像都会跳转至对应用户的个人主页,用户的个人主页显示用户的个人信息和用户最近发布的微博,按照时间倒序排列,用户也可以对微博的点赞、转发、评论、收藏做操作。
    4.2.4 海螺模块发布:用户通过点击导航栏中的神奇海螺进入海螺主页,在海螺页面的上面是发布海螺的问题框,下面的可以插入的表情按钮和问题的悬赏积分数,中间的导航栏可以选择查看最新发布、已解决、待解决、我的海螺不同的筛选条件。
    查看海螺问题:用户点击任意海螺问题,系统跳转到展示海螺的具体信息的页面,上方展示发布用户的用户名、用户称号、发布日期、海螺问题、悬赏积分、问题的状态等,在中间显示问题的所有回复信息,回复人的用户名、称号、回答内容、回复日期,是否被采纳等。
    回答海螺问题:在海螺问题详细详细信息页面的底部可以回答海螺问题,在输入框中输入回复的答案,插入表情信息等,点击回复后将回复信息保存在数据库中。
    采纳问题答案:在海螺问题首页,用户通过点击我的海螺问题可以跳转至用户自己所发布的海螺问题页面,在自己所发布的海螺问题页面中可以选择自己认为最正确的答案,点击采纳后修改海螺状态,被采纳的答案变为采纳答案,增加采纳者的海螺积分。
    4.2.5 后台管理员模块管理员登陆:管理员可以通过在登陆页面中点击管理员登陆,跳转至管理员登陆页面。当管理员输入账号信息和密码信息后,如果用户名和密码正确就跳转到管理员首页。如果错误则给出提示。
    管理员首页:在管理员首页中上方显示导航栏,在页面内容方面,通过四张图表来显示微博、用户、评、海螺、评论、回答等的总数以及当月数,在下方的柱状图中则显示距离今天最近的7天的数目。
    用户管理首页:在页面上方显示导航栏,页面内容中显示所有用户的编号、邮箱、昵称、注册日期、上次登陆日期以及用户的状态,由于考虑到用户数量多以以及为了方便查找,因此在页面中一次显示10条用户数据,同时添加用户搜索功能,用户能够在输入用户昵称的关键字后来搜索用户,并且支持迷糊查询。 搜索用户:在用户管理页面输入用户昵称中的关键字来搜索用户,系统会将获取到的用户信息中昵 称为输入关键字的那部分显示为红色。
    用户封禁:管理员可以通过点击用户管理页面操作一栏中的封禁按钮来对违规用户的封禁,管理员可以输入封禁的天数,那么在这个日期之前,用户是不能正常登陆的,管理员也可以通过点击解封来提前解除封禁用户的操作。
    微博管理首页:管理员点击导航栏中的微博管理,系统会跳转至用户微博管理页面,显示系统中所用是微博信息,管理员也可以通过输入微博内容中的关键字来搜索微博,同时可以删除有不良信息的微博,或是恢复以被删除的微博。
    微博搜索:管理员可以通过输入微博内容中的关键字来搜索在微博中存在该关键字的微博,搜索到的微博内容中的关键字会使用红色标注出来。
    微博删除:在微博管理页面中,管理员可以根据微博的内容来判断微博是否违法等信息,如果微博信息中包含不良信息,管理员可以通过操作栏中的删除按钮来删除微博或者可以对已经删除的为微博做恢复操作。
    海螺管理首页:管理员点击导航栏中的海螺管理可以跳转至海螺管理页面,在页面的上方为导航栏,页面内容则显示所有的海螺信息、海螺搜索框、以及下方的分页框,海螺信息包括编号、发布人名称、海螺的内容、发布日期、海螺状态以及可以执行的操作。
    海螺搜索:在海螺管理首页中,考虑到海螺数量多不好查找的问题,因此设置了搜索功能,管理员可以能够在海螺搜索框中输入海螺内容中的关键字来搜索海螺问题,在展示搜索到的结果时会将搜索关键字使用红色标注出来,方便查看。
    4.3 数据库设计4.3.1 概述微博系统数据库表主要包括:

    1. 用户表:用来保存用户的个人信息,例如编号、昵称、姓名、密码。邮箱等信息,以用户编号作为主键,如表4-1
    2. 微博关注表:用来保存用户的关注用户信息,以关注ID作为主键,如表4-2所示
    3. 微博表:用来保存微博信息,例如微博发布时间,微博内容,微博点赞,转发,收藏数等,以微博编号作为主键,如表4-3所示
    4. 微博收藏表:用来保存用户收藏的微博信息,如微博编号,收藏时间等,以收藏编号作为主键,如表4-4所示
    5. 评论表:保存微博的评论消息,例如评论人编号、评论日期、评论内容等,以评论编号作为主键,如表4-5所示
    6. 积分表:用来保存用户获取积分的方式,例如通过每天的登陆发布微博等获取积分,以积分编号作为主键, 如表4-6所示
    7. 点赞表:用来保存微博的点赞信息,主要包括点赞人编号,点赞编号,点赞微博编号等信息。以点赞编号作为主键,如表4-7所示
    8. 积分流水表:用来保存用户获取积分的信息,主要包括积分编号、用户编号、获取日期等信息,以积分编号作为主键,如表4-8所示
    9. 转发表:用来保存用户转发的信息,主要有转发编号、转发人、微博编号等信息,以转发编号作为主键,如表4-9所示

    4.3.2 概念设计一个用户可以发布多条微博,因此用户表和微博表之间存在一对多的关系如图4.12所示。

    一条微博可以对应多个点赞、转发、收藏和评论,因此微博表和收藏、点赞、转发、收藏表之间存在一对多的对应关系,如图4.13所示。

    一个用户可以发布多个海螺,每个海螺问题可以对应多条评论。如图4.14所示。

    4.3.3 数据库表
    用户表:数据库表名USER_TAB,引用序列名SEQ_USER。


    关注表:数据库表FRIEND_TAB,引用序列名SEQ_FRIEND。


    微博表:数据库表名WEIBO_TAB,引用索引名SEQ_WEIBO。


    收藏表:数据库表名COLLECT_TAB,引用索引名SEQ_COLLECT。


    评论表:数据库表名COMM_TAB,引用索引名SEQ_COMM。


    积分表:数据库表名INTEGRAL_TAB,引用索引名SEQ_INTEGRAL。


    点赞表:数据库表名LIKE_TAB,引用索引名SEQ_LIKE。


    积分流水表:数据库表名RECORD_TAB,引用索引名SEQ_RECORD。


    转发表:数据库表名TRANS_TAB,引用索引名SEQ_TRANS。

    第五章 系统功能实现5.1 登陆系统在系统登陆注册页面当用户输入邮箱后会通过Ajax将用户输入的邮箱传到后台控制器,调用Service层中对应的方法,是Service方法中调用Dao层接口查找用户邮箱是否已经被注册,如果被注册则通过前台javaScript显示在页面提示用户该邮箱已被注册,在输入基本信息点击注册后,将会把用户输入的注册信息通过浏览器发送请求到后台控制器中,控制器控制请求的转发页面和将用户注册信息传给Service,在Service中初始化用户的一些基本信息,例如默认头像、默认状态、初始化用户积分等操作,组装用户数据源,调用Dao层方法保存用户注册信息如图5.1所示。核心代码如下:

    登陆功能:如果点击下次自动登陆密码在点击登陆后,先将用户名和密码信息传递到Service层做业务处理,再调用Dao层接口判断邮箱地址和密码信息是否正确,如果正确并且点击了下次登陆,就将邮箱名和密码保存在浏览器Cookie中,将登陆用户保存在Session中,在处理用户登陆的Service中判断用户的当前登陆时间和上次登陆时间是否为同一天,如果不是同一天则为用户增加登陆的积分,修改用户数据库中的积分数,然后跳转至微博首页,如图5.2所示。核心代码如下:



    5.2 用户信息系统用户基本信息:如图5.3所示当用户点击修改后浏览器会提交form表单,发送请求携带用户基本信息到SpringMVC的控制器中接收请求,并把form表单中的数据组装成User对象,作为参数传入Service层中对应的方法进行处理,调用Dao层接口修改用户的基本信息,并修改当前服务器中Session中的User对象信息。核心代码如下:


    修改密码:在用户个人资料页面点击修改密码,将会跳转至如图5-4所示的修改密码页面,用户可以输入用户的当前密码,前台页面通过Ajax发送异步请求,后台控制器接收请求,从数据库中获取用户当前密码是否正确,如果密码不正确,在前台页面中通过javaScript动态提示给用户当面密码错误,如果输入密码正确,用户则可以输入新密码,确认新密码,点击确认修改后浏览器提交form表单,将用户新密码传给后台Service层中对应的方法,在Service的方法中调用Dao层接口更改数据库中的用户密码,更改服务器Session中的用户信息。核心代码如下:


    修改用户头像:点击用户个人资料中修改头像,将会跳转至如图5.5所示的修改头像页面,用户选择头像文件,点击上传,form表单将图片传到后台控制器中,将用户头像保存在服务器上,判断用户之前头像是为系统默认头像,如果不是就删除用户之前的头像图片,并将用户新的头像地址保存在用户信息中,传入Service中调用Dao层接口修改数据库中用户的头像信息。核心代码如下:


    修改密保:当用户点击修改密保页面时浏览器跳转至修改密保页面如图5-6所示,用户先要根据之前设置的密保问题来填写答案,前台页面通过Ajax将用户输入的密保答案传入后台控制器,与数据库中用户的密保问题答案做判断,如果密保答案错误,在页面上通过javaScript展示用户密保答案错误,如果密保答案正确,用户可以输入新的密保问题和密保答案,点击修改提交form表单后,浏览器发送请求在后台数据库中修改用户的密保问题和答案。核心代码如下:


    5.3 微博模块发布微博:在用户主页如图5.7所示,用户可以发布微博,在微博信息中可以插入表情,也可以选择插入一张图片,在前台页面中,表情使用javaScript动态生成div标签并显示在页面上,当用户点击发布后,浏览器发送请求将前台页面表单中微博信息和图片信息传入后台控制器,将图片信息保存在服务器中,在数据库中只保存图片路径,从Session中获取当前登陆用户,组装微博数据源,将数据源传入Service中,调用Dao层接口将微博信息保存在数据库中。核心代码如下:


    搜索微博:如图5.8所示,在微博首页搜索框输入关键字点击搜索提交form表单,浏览器发送请求将关键字传到后台控制器中,在数据库中通过迷糊查询查询相关的微博信息。在Service层中具体方法中调用Dao层接口获得相关的微博信息,遍历集合,组装微博的基本信息和发布人对象,将微博中表情转换成对应的gif图片,调整微博时间格式为对应格式,修改微博内容中搜索关键字为红色显示,将修改好的数据返回到前台页面展示,如图5.9所示。核心代码如下:


    微博操作:点击微博的点赞,转发和收藏功能类型,通过Ajax将微博id提交请求到后台控制器,从Session中获取登陆用户的信息,传递参数到Service对应的方法中通过对微博不同的操作调用对应的Dao层接口将微博的点赞,转发和收藏信息保存在数据库中。点击评论后通过前台页面的点击事件跳转至JavaScript中通过Ajax发送异步请求到后台控制器中,将微博id传递到Service层中对应的方法中嗲用Dao层接口查找数据库中对应微博编号的评论信息,微博评论的分页通过对应的PageBean类控制,在数据库层通过SQL语句来控制分页要显示的条数,在控制器中传递json数据到前台页面展示。在评论信息的最后面可以发布用户自己的评论,可以添加表情,点击发表将form表单提交到后台控制器中,在后台代码中调用Dao层接口保存用户的评论信息。如图5.10所示。核心代码如下:


    个人微博:如图5.11所示:在页面上方导航栏可以点击进入用户个人主页查看我的微博,在页面中页面上方展示导航栏,下面显示用户的基本信息,中间显示用户所发布过的微博,点击微博插入的图片还可以通过JavaScript将图片放大,在页面的右侧展示系统为用户推荐的好友。点击我的微博按钮后发送的请求会被后台控制器接收,从服务器Session中获取当前登陆用户的用户id,传入Service层,在Service层中调用Dao层接口从数据库中获取当前登陆用户的微博信息组装成List集合,遍历List集合,更改微博数据源的日期格式,调用工具类将微博正文中的表情替换成对应的图片信息,在微博的分页中,使用了Oralce数据库中的伪列来获取对应区间的微博信息,实现数据库层的分页,将所有需要在页面上展示的数据传递给控制器,控制器再将数据封装在Response响应中传递到前台页面。核心代码如下:


    5.4 好友模块查看好友微博:通过点击页面导航栏中我的好友来跳转至好友微博页面,在后台控制器中先从Session中获得当前登陆用户的id值,传递给Service,在Service中调用Dao层方法先在数据库的好友表中查找对应用户的所有好友信息,然后再在数据库微博表中查看这些好友对应的微博信息按照微博发布时间倒序排列,将所有查找到的微博信息和发布用户信息封装成List集合,遍历List集合修改微博日期各式,微博表情字符转换为对应图片名称,将加工过后的集合传递给控制器,控制器将所有的组装好的数据响应到前台页面中,在前台页面中通过C标签遍历List展示微博数据如图5.12所示。核心代码如下:

    关注功能:当用户登陆系统后可以在页面右侧的推荐用户中选择需要关注的用户,点击关注后前台页面通过Ajax技术发送异步请求将被关注用户的用户id发送到后台控制器中,在控制器中获取Session中的登陆用户信息,将登陆用户的id和被关注用户的id传给Service层中对应的方法,在Service层对应的方法中做处理,组装好友信息数据源,调用Dao层接口保存用户的关注信息,同时更新用户的关注数,更新被关注用户的粉丝数,然后在前台页面中通过javaScript将页面文本信息关注修改为已关注。核心代码如下:

    取消关注:和关注功能类型,在导航栏中点击我的好友,在中间点击关注,就能查看到我所关注的所有好友和好友数以及他们的个人信息,如图5.13所示,点击取消关注,通过Ajax将好友id传递到后台控制器中,在控制器中获取请求中的用户信息,将好友id和用户id传入Service层中对应的方法,调用Dao层接口将对应用户id和好友id的好友信息删除掉,同时更改用户的关注数和被关注用户的粉丝数。然后返回响应在前台页面刷新好友列表。

    拉黑用户:和取消关注用户类似,只是在Dao层接口中,不是删除已有的用户记录而是逻辑删除,即修改好友表中对应的记录状态,被拉黑用户所发布的私信和微博信息不会被拉黑用户所看到。核心代码如下:


    私信:可以在页面的推荐用户上面查看当前登陆用户的未查看私信数,如图5.14所示,未读私信的数目通过数据库中对所有接收者为当前登陆用户的所有私信信息,且信息状态为未阅读的私信,将得到的数值传递给前台页面,前台页面中所有展示的数值通过EL表达式从服务器发送回来的响应中获取。点击未读私信或者通过图5.13中显示的好友列表中的私信按钮,跳转至用户私信页面。核心代码如下:


    查看私信:如图5.15所示,用户通过点击私信关注好友时,通过后台控制器跳转至我的私信用户页面,页面左侧显示和该用户最近的私信信息,页面右侧显示所有有过私信的用户列表,点击列表中的用户就可以直接私信这个用户,在私信中允许插入表情。在后台代码中,将要发送私信的用户id和从Session中获取的登陆用户id传递到Service层中对应的方法,调用Dao层接口在数据库中查找与该用户相关的所有私信记录同时修改和该用户的所有私信状态为以阅读,将获取的记录组装到集合中,遍历集合调用工具类修改私信的日期格式和文本中的表情格式,同时从数据库中获取和当前登陆用户有过私信记录的所有用户,将组装好的集合返回给控制器,控制器将数据响应给前台页面中,遍历集合中的数据,展示在前台JSP页面中。核心代码如下:


    发送私信:用户先选择要发送的用户,输入需要发送的私信信息,可以在私信中插入表情,点击发送后会提交form表单,浏览器发送请求到后台控制器中,控制器获取发送用户的id和接收用户的id,调用Service层中的方法,组装数据源为私信信息,设置私信信息为未阅读状态,在Service层中对应的方法中调用Dao层接口将私信信息保存在数据库中。核心代码如下:

    搜索用户:在搜索用户页面中,用户可以输入用户昵称的关键字来模糊查询相关用户,当用户输入要查询的用户昵称,浏览器发送请求携带关键字等信息跳转至控制器中特定的方法,在控制器方法内部调用Service中的方法处理逻辑,业务层调用Dao层接口中的查找方法查找用户昵称中包含有关键字的用户,将从数据库获得的对应用户组装成一个集合,遍历集合将用户昵称中包含的关键字改成红色,控制器返回响应跳转到搜索结果页面,遍历集合展示所有查找到的用户信息。如图5.16所示。核心代码如下:


    用户主页面:在页面中,点击任意一个用户的名称或头像都会跳转至对应用户的个人主页,用户的个人主页显示用户的个人信息和用户最近发布的微博,按照时间倒序排列,用户也可以对微博的点赞、转发、评论、收藏做操作。在后天代码中,当用户点击其他用户的头像或名称时,浏览器发送携带用户id的请求到后台控制器中。控制器调用Service中对应的方法,在Service方法中调用Dao层接口从数据库中查看用户的基本信息和用户的微博信息,将所有的数据存放在集合中。返回到控制器中,控制器携带数据返回到前台页面中做展示,如图5.17所示。核心代码如下:


    5.5 海螺模块发布:当用户进入海螺主页时,浏览器页面发送请求到后台控制器中,调用业务层中特定的方法,Service中调用Dao层接口在数据库中查找有关不同筛选条件的海螺问题,并将查找到的问题封装在集合中,通过控制器发送服务器响应,跳转到海螺首页,并循环展示所有的海螺问题。如果用户需要发布问题,在填写了问题描述和所要悬赏的积分数后,点击发布,浏览器提交表单数据到后台控制器中,在Service层中首先判断用户的海螺积分是否大于悬赏积分,如果小于悬赏积分就返回浏览器页面提示用户积分不足。如果积分足够就调用Dao层接口把用户的海螺问题保存在数据库中,同时减少用户的海螺积分修改用户基本信息。核心代码如下:


    查看海螺问题:用户点击海螺首页具体的问题时,浏览器发送请求给后台控制器中调用Service层对应的方法,在Service层中调用Dao层接口通过海螺问题的编号来查看海螺的具体信息,通过发布问题的用户id在数据库中查找对应的发布人信息,服务器返回响应到浏览器中,展示海螺的具体信息,上方展示发布用户的用户名、用户称号、发布日期、海螺问题、悬赏积分、问题的状态等,在中间显示问题的所有回复信息,回复人的用户名、称号、回答内容、回复日期,是否被采纳等,如图5.19所示。核心代码如下:


    回答海螺问题:在海螺问题详细详细信息页面的底部可以回答海螺问题,在输入框中输入回复的答案,插入表情信息,点击回复提交表单,浏览器请求携带表单数据到后台控制器中,被控制器中具体的方法接收,获取Session中的用户编号,组装回复信息的数据源,传递参数到Service中,在Service中调用Dao层接口保存海螺的回复信息,如图5.20所示。核心代码如下:


    采纳问题答案:在海螺问题首页,用户通过点击我的海螺问题可以跳转至用户自己所发布的海螺问题页面,在自己所发布的海螺问题页面中可以选择自己认为最正确的答案,被采纳的答案变为采纳答案,增加采纳者的海螺积分,如图5.21所示,在后台代码中,当用户点击采纳后,浏览器请求携带海螺问题id和问题回复信息被后台控制器中具体的方法接收,在控制器中调用Service层,业务层中调用Dao层接口修改数据库中海螺问题的状态为已解决,修改评论表中被采纳用户的评论状态为被采纳,刷新前台海螺问题页面。核心代码如下:


    5.6 后台管理员模块管理员登陆:管理员可以通过在登陆页面中点击管理员登陆,跳转至管理员登陆页面如图5.22所示,管理员登陆后,页面发送请求到后台控制器中,后台Controller层接收请求,将用户名和密码作为参数调用业务层中的方法,在Service层中调用Dao层接口和数据库中管理员账号表中查询,如果存在就返回管理员类,如果不存在,则抛出异常,异常层层上抛,在控制器层中接收,并将错误信息保存在方法的返回值中,在页面提示,如果用户名和密码正确,就跳转到Controller中管理员首页的处理方法中,在管理员首页的处理方法中获取需要显示的数据并展示。核心代码如下:


    管理员首页:登陆后,系统会跳转到管理员首页,在首页中上方显示导航栏,在页面内容方面,通过四张图表来显示微博、用户、评、海螺、评论、回答等的总数以及当月数,在下方的柱状图中则显示距离今天最近的7天的数目。后台首先在Controller层中跳转至管理员首页对应的处理方法中,调用Service层中对应的方法获取首页展示数据,并将获取到的数据组装到Map集合中,在服务层中调用Dao层中的方法来获取首页需要展示的用户、微博、评论、回答等数据保存在Map集合中,在控制层中获取到返回值数据并保存在服务器响应中,返回给前台页面使用EL表达式展示数据,如图5.23所示。核心代码如下:


    用户管理首页:后台代码通过调用Service层中对应的方法,Service方法里面则调用Dao层接口和数据库交互,获取数据库中所有的用户信息封装成List集合,返回给Controller层将用户List集合响应给浏览器,在页面中通过c标签遍历循环显示用户信息,页面的分页使用自定义分页类PageBean来保存分页信息,在数据库层做分页一次获取10条数据。核心代码如下:


    搜索用户:在用户管理页面输入用户昵称中的关键字来搜索用户,系统会将获取到的用户信息中昵称为输入关键字的那部分显示为红色。在后台代码中,点击搜索会将管理员输入的用户昵称关键字传给后台控制器中,在控制器中调用Service层中对应的搜索用户的方法,在Service层中调用Dao层接口在数据库中通过迷糊查询来获取用户。并将获取到的数据层层返回,在Controller中响应给前台页面,然后在页面中做展示,如图5.25所示。核心代码如下:


    用户封禁:管理员可以通过点击用户管理页面操作一栏中的封禁按钮来对违规用户的封禁,管理员可以输入封禁的天数,那么在这个日期之前,用户是不能正常登陆的,管理员也可以通过点击解封来提前解除封禁用户的操作,具体页面如图5.26所示。在后台代码中则是在Service层中调用Dao层接口,更改用户状态和封禁日期,解除封禁和封禁用户类似,因此不做具体说明。核心代码如下:


    微博管理首页:管理员点击导航栏中的微博管理,系统会跳转至用户微博管理页面,显示系统中所用是微博信息,管理员也可以通过输入微博内容中的关键字来搜索微博,同时可以删除有不良信息的微博,或是恢复以被删除的微博,微博管理页面如图5.27所示,在后台代码中,当用户点击导航栏中微博管理时,浏览器会发送相应的请求到SpringMVC框架的Controller中对用的更能处理方法中,在控制器中调用Service层中显示所有微博的方法中,在Service层中再调用Dao层方法获取所有的微博信息,在分页方面没有采用在前端页面中做分页的方法,而是在数据库中通过Oracle的伪列来做分页,一次获取10条数据,最后在Controller中将获取到的微博信息响应给浏览器,浏览器中通过c标签遍历显示微博信息。核心代码如下:


    微博搜索:管理员可以通过输入微博内容中的关键字来搜索在微博中存在该关键字的微博,搜索到的微博内容中的关键字会使用红色标注出来,具体页面如图5.28所示,在后台代码中,控制器中特定的方法接收浏览发送的搜索微博请求,调用Service层中对应的方法,将关键字作为参数传给Dao层接口中,在Dao层接口中查找数据库微博表中微博内容包含该关键字的微博信息,在数据库中则是通过模糊查询来查找对应微博。然后将查找到微博信息封装到List集合中,层层返回到Controller层中对应的方法,在方法中将数据响应给浏览器,浏览器接收响应在页面中通过c标签展示数据。核心代码如下:


    微博删除:在微博管理页面中,管理员可以根据微博的内容来判断微博是否违法等信息,如果微博信息中包含不良信息,管理员可以通过操作栏中的删除按钮来删除微博或者可以对已经删除的为微博做恢复操作,当用户点击删除时,页面会携带着微博编号等参数发送请求给服务器,请求会被控制器中对应的方法所接收,将微博编号作为参数嗲用Service中对应的方法,在方法中调用Dao层接口在修改数据库中对应微博编号的微博状态为已删除,恢复微博和删除类似,只是修改数据库中对应微博信息状态为正常即可。核心代码如下:

    海螺管理首页:管理员点击导航栏中的海螺管理可以跳转至海螺管理页面,如图5.29所示,在页面的上方为导航栏,页面内容则显示所有的海螺信息、海螺搜索框、以及下方的分页框,海螺信息包括编号、发布人名称、海螺的内容、发布日期、海螺状态以及可以执行的操作,在后台代码方面,当用户点击导航栏中的海螺管理时,浏览器发送请求,请求在控制器中被对应的方法接收,Service中调用Dao层接口在数据库海螺表中查找所有的海螺信息,保存在List集合中,遍历List集合组装发布人用户信息,修改日期格式等,最后将组装号的List集合返回到Controller中,响应给浏览器跳转海螺管理首页,通过使用c标签遍历显示查找到的海螺信息,因为系统中使用的分页方法一致,因此在这里不再赘述。核心代码如下:


    海螺搜索:在海螺管理首页中,考虑到海螺数量多不好查找的问题,因此设置了搜索功能,管理员可以通过在海螺搜索框中输入海螺内容中的关键字来搜索海螺问题,在展示搜索到的结果时会将搜索关键字使用红色标注出来,方便查看。具体页面如图5.30所示。在后台代码中,当用户输入关键字点击搜索时,浏览器发送请求到控制器中指定方法接收,在Controller中调用Service层中对应的方法处理业务逻辑,然后在Service层中调用Dao层接口通过模糊查询在数据库海螺表中查找对应的海螺信息,最后在Controller中将查找到的海螺信息响应给浏览器,在页面中通过c标签遍历展示数据。因为系统使用一样的分页方法,因此不做赘述。核心代码如下:


    第六章 总 结时光荏苒,岁月如梭,转眼之间为期半年的毕业设计以及论文的编写终于落下帷幕,回顾毕业设计的每一个阶段都使我受益匪浅,在毕设初期,经过了长达一周的深思熟虑之后我决定将B/S微博系统作为我这次毕业设计和论文的选题,因为平时对微博的接触以及近几年微博的火热程度,使我对微博系统的具体功能和优缺点都有了一个全体的把控,这也使得在之后系统功能设计时能够更加的得心应手,在毕业设计中期时进入代码编写阶段时,我选择了J2EE体系开发Web项目的B/S微博,使用面向对象语言JAVA作为开发语言,使用个人熟练掌握的SSM框架来搭建系统,SSM框架强大的功能减少了大量的冗余代码,使得系统代码的编写更加轻松,提高了系统的开发效率,然而开发一个系统并不是那么简单就能完成,在代码的编写阶段,问题接连出现,但在指导老师的指导下以及自己通过网上查阅资料,最终解决了这些问题,提高了自己代码的编写能力,同时也提高了自我学习能力,这对以后的生活学习和工作中都有着非同寻常的意义,在项目编写完成后的测试阶段,之前在编写阶段没有被发现的系统缺陷逐渐跃出水面,在每一次修复这些问题的时候,我都能感觉到自己的能力在慢慢提高,一个没有缺陷的系统是不存在的,经过对测试用例中的测试方案一一测试,然后修复掉一个又一个的缺陷后,微博系统中大多数可见性高的BUG都被修复了,但是在之后的使用中还会不断的完善系统让它变的更加成熟,而不单单只是作为一份毕设设计而存在。
    在这次毕业设计系统的开发中也让我看到了自身的一些问题,例如前端技术的不熟练导致在前台页面的修改和开发中浪费了大量的时间,微博系统中关键性的用户交互不够美观,用户体验性差,以及在系统类设计时没能正确的把控全局,设计出合理的接口,只能在后期代码编写阶段中不断的去完善。
    总而言之,在对微博系统的开发中,我学习到了很多以前没有注意到和忽略到的东西,也使我认识到了自身的一些缺陷,让我在以后的生活和工作中都能更好的认识自己,提高自己的能力,然后服务于社会,做一个对社会发展有帮助的人。
    参考文献[1] 贾文潇,邓俊杰. 基于Java的Web开发技术浅析[J]. 电子测试,2016
    [2] 李传扬. 微博分析系统的设计与实现[D]. 北京邮电大学 2015
    [3] 刘运臣. 网站设计与建设[M]. 清华大学出版社, 2008
    [4] 秦雅华. 基于WEB2.0的微博网站的设计与实现[D]. 北京工业大学 2012
    [5] 陈玲,夏汛. 利用Mybatis的动态SQL实现物理分页[J]. 数字技术与应用. 2011(11)
    [6] 萨师煊,王珊. 数据库系统概论(第三版)[M].北京:高等教育出版社,1998
    [7] 基于Java的数据库访问技术研究[J]. 科技资讯. 2009(04)
    [8] 张峰. 基于Ajax技术与J2EE框架的Web应用研究与实现[D]. 中国地质大学 2008
    [9] 基于Java多线程技术的网络编程[J]. 电脑编程技巧与维护. 2009(22)
    [10] 李威. 一种小型实用即时网络聊天通讯系统的设计[J]. 长江大学学报(自然科学版). 2011(12)
    [11] 钟睿祺. 基于微博嵌入小伙伴阅读网的分析与设计[D]. 华南理工大学 2011
    [12] 王少锋编著.面向对象技术UML教程[M]. 清华大学出版社, 2004
    [13] 徐春绵. 关于网站开发相关问题的探究[J]. 通讯世界. 2015(09)
    [14] 张宇,王映辉,张翔南. 基于Spring的MVC框架设计与实现[J]. 计算机工程. 2010(04)
    [15] 胡以谰,张立平. J2EE开发模式的选择[J]. 计算机系统应用. 2002(08)
    [16] 王丽爱. 《Java程序设计》课程网站的设计与实现[J]. 电脑知识与技术. 2016(27)
    [17] 荣艳冬. 关于Mybatis持久层框架的应用研究[J]. 信息安全与技术. 2015(12)
    10 留言 2019-12-20 17:48:45 奖励50点积分
  • ~“WRITE-BUG校园开源社区”交流群 ~

    为方便各位小伙伴的交流学习,平台创建了一个校园开源社区微信交流群
    群内的成员均是国内各大高校计算机相关专业的大学生(清华、人大、北邮… 硕士、博士都有哦!),快来扫码加入吧 ~(PS:本群组建的目的是方便各大高校计算机专业学生对课内专业技术交流和讨论!欢迎愿意交流、学习的同学加入,“伸手党”请自觉屏蔽!)

    若人数达到上限,不能直接扫码加群,可先加客服小姐姐微信,再拉您进群哦~
    (PS:客服小姐姐微信二维码如下↓,请备注:“WRITE-BUG技术共享平台”,否则不予通过哦)
    13 留言 2021-04-23 08:30:38
  • 弱监督下的语义前景修复

    Semantic Foreground Inpainting from Weak Supervision摘要语义场景理解是自动驾驶车辆和移动机器人的一项重要任务。在我们的工作中,我们的目标是估计一个语义分割图,其中前景对象被删除和语义修复背景类,从一个单一的RGB图像。该语义前景修复任务由单阶段卷积神经网络(CNN)执行,该神经网络包含我们新颖的最大池作为修复(MPI)模块,该模块是在弱监督下训练的,即它不需要对要修复的前景区域进行手动背景注释。我们的方法本质上比以前的两阶段最先进的方法更有效,并且在城市风景上修复的前景区域方面比它高出3%的IoU。当在看不见的KITTI数据集上测试时,性能裕度增加到6% IoU。
    系统概述我们的网络能够分割出前景对象(二进制或可选的多类),同时用背景类(道路、人行道和其他刚性世界)修复这些前景对象后面的语义场景。

    网络概述执行语义前景修复任务的网络的上部源自最先进的语义分割网络,即具有ResNet (-18,-50等)的PSPNet 骨干。请注意,主干分为两部分,中间插入了一个最大池修复模块。下部是一个轻量级网络(带有上采样模块的ResNet-18的前两个块),它分割出二进制前景对象,这是MPI模块并行需要的。请注意,这个轻量级网络可以选择性地使用网络上部主分支的功能(由蓝色虚线表示),这导致了更高效的模型,并被称为我们的模型-更快。训练期间应用了两个损失。

    基线概述由两个阶段组成。

    循环中单次迭代的可视化示例。二进制前景蒙版和前景区域被涂黑的背景特征由规范的最大池操作同时处理,内核大小为3,步长为1,填充为1。然后,可以通过比较旧的和新的前景遮罩之间的差异来跟踪更新的特征,这被称为特征补丁。在最终迭代之后,累积每次迭代的补丁,并将其用于最终修复的特征图。
    0 留言 2021-08-03 09:41:30 奖励35点积分
  • 基于fabric.js库创建的vue版本fabric组件

    vue-fabric
    安装npm install vue-fabric --save依赖下载customiseControls.min.js.和 fabric.min.js.到本地 static/js/文件下
    本地项目 index.html 引入
    <script type="text/javascript" src="./static/js/fabric.min.js"></script><script type="text/javascript" src="./static/js/customiseControls.min.js"></script>Import在main.js中import 'vue-fabric/dist/vue-fabric.min.css';import { Fabric } from 'vue-fabric';Vue.use(Fabric);使用
    <vue-fabric ref="canvas" :width="width" :height="height"></vue-fabric>UsageProps


    Name
    Type
    Default
    Description




    id
    String
    “canvas”
    id


    width
    Number
    0
    canvas width


    height
    Number
    0
    canvas height



    函数
    方法调用this.\$refs.canvas.方法名(params)

    createImage(url,options) 绘制图片


    params
    Type
    Description




    url
    String
    image url


    options
    Object
    id(唯一标识该元素,以下每个方法 options 参数都带 id),width,height,left,top,registeObjectEvent (Boolean 是否注册对象事件),evented 是否可被点击选中,selectable 是否禁止被选中…其它属性



    createImageByImg(img,options) 绘制图片


    params
    Type
    Description




    img
    Image对象
    new Image对象


    options
    Object
    id(唯一标识该元素,以下每个方法 options 参数都带 id),width,height,left,top,registeObjectEvent (Boolean 是否注册对象事件),evented 是否可被点击选中,selectable 是否禁止被选中…其它属性



    createTextbox(text,options) 绘制文本


    params
    Type
    Description




    text
    String
    text content


    options
    Object
    width,left,top,fill(颜色),fontSize,id,fontFamily,strokeWidth,stroke,textAlign,textBackgroundColor,lineHeight,fontWeight,…其它属性



    createItext(text,options) 绘制可编辑文本(可换行显示文本)


    params
    Type
    Description




    text
    String
    text content


    options
    Object
    width,left,top,fill(颜色),fontSize,id,editable(是否可编辑),fontFamily,fontSize,strokeWidth,stroke,textAlign,textBackgroundColor,lineHeight,fontWeight,…其它属性



    createRect(options) 绘制矩形


    options
    Type
    Description




    left
    Number
    left


    top
    Number
    top


    width
    Number
    Rect width


    height
    Number
    Rect height


    fillColor
    String
    Rect fillColor


    id
    String
    唯一标识 id


    其它属性兼容
    all
    兼容原生其它属性



    freeDrawConfig(options) 开启/关闭自由绘制(画笔)


    options
    Type
    Description




    isDrawingMode
    Boolean
    是否开启自由绘制 true/false


    color
    String
    绘制线颜色


    drawWidth
    Number
    绘制线宽



    eraseDrawConfig(options) 开启自由绘制橡皮擦(只对当前绘制画布有效)


    options
    Type
    Description




    color
    String
    选填,擦除颜色默认白色


    drawWidth
    Number
    橡皮擦线宽



    createLine(options) 绘制直线


    options
    Type
    Description




    x,y,x1,y1
    Number
    line points,直线两点坐标


    fillColor
    String
    fillColor 填充颜色


    strokeColor
    String
    strokeColor 绘制颜色


    其它属性兼容
    all
    兼容原生其它属性



    drawDottedline(options) 绘制虚线


    options
    Type
    Description




    x,y,x1,y1
    Number
    line points,直线两点坐标


    color
    String
    绘制线颜色


    drawWidth
    Number
    绘制线宽


    offset
    Number
    默认 6,每隔 offset 个像素空 empty 个像素


    empty
    Number
    默认 3,每隔 offset 个像素空 empty 个像素


    其它属性兼容
    all
    兼容原生其它属性



    drawArrowLine(options) 绘制箭头直线


    options
    Type
    Description




    x,y,x1,y1
    Number
    line points,直线两点坐标


    color
    String
    绘制线颜色


    drawWidth
    Number
    绘制线宽


    fillColor
    Number
    默认透明,填充颜色


    theta
    Number
    默认 35,箭头角度大小


    headlen
    Number
    默认 35,箭头角度大小


    其它属性兼容
    all
    兼容原生其它属性



    createTriangle(options) 绘制三角形


    options
    Type
    Description




    x,y,x1,y1,x2,y2
    Number
    三角形 3 点坐标位置


    left,top
    Number
    position 位置


    color
    String
    绘制线颜色


    fillColor
    String
    fillColor 填充颜色


    drawWidth
    Number
    绘制线宽


    其它属性兼容
    all
    兼容原生其它属性



    createEqualTriangle(options) 绘制等边三角形


    options
    Type
    Description




    left,top
    Number
    position 位置


    fill
    String
    fillColor 填充颜色


    width
    Number
    三角形底边宽度


    height
    Number
    三角形高


    其它属性兼容
    all
    兼容原生其它属性



    drawByPath(pathArray,options) 根据轨迹绘制图形


    params
    Type
    Description




    pathArray
    Array
    轨迹所在点数组,按顺序正时针或逆时针,如三角形 [[50, 50], [120, 120], [80, 160]]


    options
    Object
    left,top,strokeColor,strokeWidth,fillColor,…其它属性



    createCircle(options) 绘制圆


    options
    Type
    Description




    left,top
    Number
    position 位置


    fill
    String
    fillColor 填充颜色


    radius
    Number
    圆形半径


    其它属性兼容
    all
    兼容原生其它属性



    createEllipse(options) 绘制椭圆


    options
    Type
    Description




    rx,ry
    Number
    rx , ry 椭圆两个长轴尺寸和短轴尺寸


    left,top
    Number
    position 位置


    fillColor
    String
    fillColor 填充颜色


    strokeColor
    String
    strokeColor 绘制线颜色


    angle
    Number
    angle 倾斜角度


    其它属性兼容
    all
    兼容原生其它属性



    setRotate(angle) 旋转选中元素


    params
    Type
    Description




    angle
    Number
    旋转角度



    setSelection(flag) 设置画布是否可以框选


    params
    Type
    Description




    flag
    Boolean
    画布是否可以框选



    setBackgroundImage(options) 设置画布背景图片


    options
    Type
    Description




    imgUrl
    String
    背景图片 Url


    angle
    Number
    旋转角度


    opacity
    Number
    背景图片透明度


    width
    Number
    默认为canvas宽度 背景图片宽度


    height
    Number
    默认为canvas高度 背景图片高度


    scaleX
    Number
    水平缩放


    scaleY
    Number
    垂直缩放


    crossOrigin
    String
    可为’anonymous’,加载跨域图片



    renderAll() 重新渲染画布setBackgroundColor(color) 设置画布背景颜色


    params
    Type
    Description




    color
    String
    背景颜色



    toggleMirror(options) 设置图片元素镜像翻转


    options
    Type
    Description




    flip
    String
    可选值 X,Y 默认值 X , 镜像翻转 X,Y



    setCornerIcons(options) 自定义操作元素图片


    options
    Type
    Description




    size
    Npmber
    图片大小 px


    borderColor
    String
    图片边框颜色


    cornerBackgroundColor
    String
    设置背景颜色


    cornerShape
    String
    形状,默认’rect’ ,可选’rect’, ‘circle’


    tl
    String
    top left 左上角元素图片地址(本地只能 static 下的图片)


    tr
    String
    top right 右上角元素图片地址(本地只能 static 下的图片)


    bl
    String
    bottom left 左下角元素图片地址(本地只能 static 下的图片)


    br
    String
    bottom right 右下角元素图片地址(本地只能 static 下的图片)


    ml
    String
    middle left 中间左边元素图片地址(本地只能 static 下的图片)


    mr
    String
    middle right 中间右边元素图片地址(本地只能 static 下的图片)


    mtr
    String
    middle top 顶部元素图片地址(本地只能 static 下的图片)



    toNextLayer() 设置当前选中画布到下一层toLastLayer() 设置当前选中画布到上一层toBottomLayer() 设置当前选中画布到底层toTopLayer() 设置当前选中画布到顶层discardActive() 取消选中getObjects() 获取当前画布上的所有元素对象clear() 清除当前画布上的所有元素对象toDataUrl() 返回当前画布的 base64 图片toJson() 返回当前画布的 json 对象loadFromJSON(json,cb) 从 json 对象中加载画布数据


    params
    Type
    Description




    json
    Object
    json 对象


    cb
    Function
    加载完成回调函数



    toSvg() 返回当前画布的 svg 图片removeCurrentObj() 删除当前选中对象getEditObj() 返回当前选中对象,并不在画布上显示,用于编辑当前元素setEditObj(obj) 设置添加对象到画布deactivateOne(obj) 取消选中对象(框选的时候选中多个对象使用)事件 <vue-fabric ref="canvas" @selection:created="selected" :width="width" :height="height"></vue-fabric>鼠标事件


    name
    Type
    Description




    mouse:down
    event
    mouse down


    mouse:up
    event
    mouse up


    mouse:move
    event
    mouse move


    mouse:dblclick
    event
    mouse dblclick


    mouse:over
    event
    mouse over


    mouse:out
    event
    mouse out



    其它事件


    name
    Type
    Description




    selection:created
    event
    选中 canvas 元素对象,单选和多选都会触发此事件


    selection:updated
    event
    selection updated


    selection:cleared
    event
    selection cleared


    before:selection:cleared
    event
    before selection cleared


    object:added
    event
    当有元素被添加进来时候触发


    object:removed
    event
    object removed


    object:modified
    event
    object modified


    object:rotating
    event
    object rotating


    object:scaling
    event
    object scaling


    object:moving
    event
    object moving



    Changelog2018.08.26
    v0.1.4 * 初始化组件库

    2018.09.20
    v0.1.8 * 新增 api 常用接口创建文档

    2019.01.19—-v0.1.9
    新增画板事件,鼠标事件、选中事件等新增绘制三角形新增绘制虚线新增画笔自由绘制新增绘制箭头新增取消选中方法
    2019.01.31—-v0.1.10
    修改绘制图片(createImage 方法)不能定位 top 的 BUG修改镜像翻转函数 toggleMirror ,新增参数 options ,X 翻转和 Y 翻转
    2019.05.09—-v0.1.20
    fix webpack-dev-server 版本导致的 npm run dev fail新增方法 drawByPath 根据轨迹绘制形状图形
    2020.03.02—-v0.1.26
    新增属性id 修复一个页面使用多个vue-fabric没有渲染成功的问题
    2020.04.15—-v0.1.27
    修复id = “canvas”的情况下会报错的问题
    2020.05.08—-v0.1.28
    修复更新Mirror只有图片生效的问题
    2020.07.07—-v0.1.29
    新增优化图片无法被选中属性设置 evented 和 selectable 感谢 @jessieyyy 新增取消单个选中的方法 deactivateOne(obj)修复image top 和 left 定位bug
    2020.07.21—-v0.1.37
    新增createImageByImg(img, options)方法 其中参数img是Image对象新增setSelection(flag) 设置画布是否可以框选
    0 留言 2021-08-02 08:49:07 奖励35点积分
  • 基于 vue、datav、Echart 框架的大数据可视化(大屏展示)模板

    一、项目描述
    一个基于 Vue、Datav、Echart 框架的 “ 数据大屏项目 “,通过 Vue 组件实现数据动态刷新渲染,内部图表可实现自由替换。部分图表使用 DataV 自带组件,可进行更改。
    项目需要全屏展示(按 F11)。
    项目部分区域使用了全局注册方式,增加了打包体积,在实际运用中请使用 按需引入。拉取项目之后,建议按照自己的功能区域重命名文件,现以简单的位置进行区分。项目环境:Vue-cli-3.0、DataV-2.7.3、Echarts-4.6.0(如果5.x版本有问题,请切换到4.x版本)、Webpack-4.0、Npm-6.13、Node-v12.16。请拉取 master 分支的代码,其余分支是开发分支。
    友情链接:

    Vue 官方文档DataV 官方文档echarts 实例,echarts API 文档
    项目展示
    二、主要文件介绍


    文件
    作用/功能




    main.js
    主目录文件,引入 Echart/DataV 等文件


    utils
    工具函数与 mixins 函数等


    views/ index.vue
    项目主结构


    views/其余文件
    界面各个区域组件(按照位置来命名)


    assets
    静态资源目录,放置 logo 与背景图片


    assets / style.scss
    通用 CSS 文件,全局项目快捷样式调节


    assets / index.scss
    Index 界面的 CSS 文件


    components/echart
    所有 echart 图表(按照位置来命名)


    common/…
    全局封装的 ECharts 和 flexible 插件代码(适配屏幕尺寸,可定制化修改)



    三、使用介绍启动项目需要提前安装好 nodejs 与 yarn,下载项目后在项目主目录下运行 yarn 拉取依赖包。安装完依赖包之后然后使用 vue-cli 或者直接使用命令npm run serve,就可以启动项目,启动项目后需要手动全屏(按 F11)。如果编译项目的时候提示没有 DataV 框架的依赖,输入 npm install @jiaminghi/data-view 或者 yarn add @jiaminghi/data-view 进行手动安装。
    封装组件渲染图表所有的 ECharts 图表都是基于 common/echart/index.vue 封装组件创建的,已经对数据和屏幕改动进行了监听,能够动态渲染图表数据和大小。在监听窗口小大的模块,使用了防抖函数来控制更新频率,节约浏览器性能。
    项目配置了默认的 ECharts 图表样式,文件地址:common/echart/theme.json。
    封装的渲染图表组件支持传入以下参数,可根据业务需求自行添加/删除。
    参数名称 | 类型 | 作用/功能 || —————————-| ————- | ———————————————|| id | String | 唯一 id,渲染图表的节点(非必填,使用了 $el)|| className | String | class样式名称(非必填) || options | Object | ECharts 配置(必填) || height | String | 图表高度(建议填) || width | String | 图表宽度(建议填) |
    动态渲染图表动态渲染图表案例为 components 目录下各个图表组件,index 文件负责数据获取和处理,chart 文件负责监听和数据渲染。
    chart 文件的主要逻辑为:
    <template> <div> <Echart :options="options" id="id" height="height" width="width" ></Echart> </div></template><script> // 引入封装组件import Echart from '@/common/echart'export default { // 定义配置数据 data(){ return { options: {}}}, // 声明组件 components: { Echart}, // 接收数据 props: { cdata: { type: Object, default: () => ({}) }, }, // 进行监听,也可以使用 computed 计算属性实现此功能 watch: { cdata: { handler (newData) { this.options ={ // 这里编写 ECharts 配置 } }, // 立即监听 immediate: true, // 深度监听 deep: true } }};</script>
    复用图表组件复用图表组件案例为中间部分的 任务通过率与任务达标率 模块,两个图表类似,区别在于颜色和主要渲染数据。只需要传入对应的唯一 id 和样式,然后在复用的组件 components/echart/center/centerChartRate 里进行接收并在对应位置赋值即可。
    如:在调用处 views/center.vue 里去定义好数据并传入组件
    //组件调用<span>今日任务通过率</span><centerChart :id="rate[0].id" :tips="rate[0].tips" :colorObj="rate[0].colorData" /><span>今日任务达标率</span><centerChart :id="rate[1].id" :tips="rate[1].tips" :colorObj="rate[1].colorData" />...import centerChart from "@/components/echart/center/centerChartRate";data() { return { rate: [ { id: "centerRate1", tips: 60, ... }, { id: "centerRate2", tips: 40, colorData: { ... } } ] }}
    更换边框边框是使用了 DataV 自带的组件,只需要去 views 目录下去寻找对应的位置去查找并替换就可以,具体的种类请去 DavaV 官网查看如:
    <dv-border-box-1></dv-border-box-1><dv-border-box-2></dv-border-box-2><dv-border-box-3></dv-border-box-3>
    更换图表直接进入 components/echart 下的文件修改成你要的 echarts 模样,可以去echarts 官方社区里面查看案例。
    Mixins 解决自适应适配功能使用 mixins 注入解决了界面大小变动图表自适应适配的功能,函数在 utils/resizeMixins.js 中,应用在 common/echart/index.vue 的封装渲染组件,主要是对 this.chart 进行了功能注入。
    屏幕适配本项目借助了 flexible 插件,通过改变 rem 的值来进行适配,原设计为 1920px,适配区间为:1366px ~ 2560px,本项目有根据实际情况进行源文件的更改,小屏幕(如:宽为 1366px)需要自己舍弃部分动态组件进行适配,如’动态文字变换组件’会影响布局,需要手动换成一般节点。
    // flexible文件位置: `common/flexible.js`,修改部分如下function refreshRem() { var width = docEl.getBoundingClientRect().width; // 最小1366px,最大适配2560px if (width / dpr < 1366) { width = 1366 * dpr; } else if (width / dpr > 2560) { width = 2560 * dpr; } // 原项目是1920px我设置成24等份,这样1rem就是80px var rem = width / 24; docEl.style.fontSize = rem + 'px'; flexible.rem = win.rem = rem;}
    请求数据现在的项目未使用前后端数据请求,建议使用 axios 进行数据请求,在 main.js 位置进行全局配置。

    axios 的 main.js 配置参考范例(因人而异)
    import axios from 'axios';//把方法放到vue的原型上,这样就可以全局使用了Vue.prototype.$http = axios.create({ //设置20秒超时时间 timeout: 20000, baseURL: 'http://172.0.0.1:80080', //这里写后端地址});
    四、更新情况
    增加了 Echart 组件复用的功能,如:中间任务达标率的两个百分比图使用的是同一个组件。修复了头部右侧的图案条不对称的问题。修复屏幕适配问题,更换了所有的尺寸单位,统一使用 rem。使用 Mixins 注入图表响应式代码。vue-awesome 改成按需引入的方式。封装渲染函数,抽离了数据使逻辑更加清晰。新增地图组件,并添加自动轮播功能
    五、其余这个项目是个人的作品,难免会有问题和 BUG,如果有问题请进行评论,我也会尽力去更新,自己也在前端学习的路上,欢迎交流,非常感谢!
    0 留言 2021-08-01 11:28:05 奖励38点积分
  • 基于vue与elementu-ui开发的聊天室组件库

    简介这是一款基于 vue.js 开发的聊天室组件库,在提供基础封装的同时,最大程度的增加扩展性。
    效果演示图:MChat组件效果图:
    IChat组件效果图:



    项目来由vue-mchat 是本人前端阶段性学习总结的项目,因为并非前端开发工程师所以还是有不少瑕疵。
    如何安装
    使用 npm 安装npm install vue-mchat
    使用在main.js中引入
    # npm 下载方式 // 进入css import 'MChat/lib/MChat.css' //引入组件 import MChat from 'MChat' // 使用vue加载组件 Vue.use(MChat) # 如何进行二次开发方案一:
    直接将 pacages 文件夹复制到你需要的项目,在 main.js 中引入 vue-mchat:
    import App from './App.vue'import MChat from '../packages/index'Vue.use(MChat)方案二:
    在 vue-mchat 的基础上进行开发,通过打包成js库引入:
    在 vue-mchat 目录下执行:
    npm run lib 可获得 lib 文件其中包含 MChat 的编译文件库,将 lib 整个复制到项目里,在 main.js 中引入:
    import '../lib/MChat.css'import MChat from '../lib/MChat.umd'Vue.use(MChat)
    0 留言 2021-07-31 09:05:10 奖励41点积分
  • 嵌入式系统的鲁棒单目视觉惯性深度补齐

    Robust Monocular Visual-Inertial Depth Completion for Embedded Systems摘要在该文章中,作者增强了其之前提出的最先进的视觉惯性里程计(VIO)系统 ——OpenVINS ,通过使用图像引导填充来自VIO的稀疏深度估计(深度补全),从而产生精准的稠密深度,并同时在嵌入式设备上实现完整的VIO+depth系统的实时性能。从VIO系统产生的具有不同稀疏度的噪声深度值不仅会损害预测稠密深度图的准确性,而且要比来自具有相同底层架构的纯图像深度网络的深度值差得多。作者在室外模拟和室内手持RGB-D两个数据集上研究了这种敏感性,并提出了简单而有效的解决方案来解决深度补全网络的这些缺点。文章还讨论了OpenVINS的关键变化,即需要为网络提供高质量的稀疏深度,同时仍然能够对嵌入式设备进行有效的状态估计。作者在不同的嵌入式设备上进行了全面的计算分析,以证明所提出的 VIO 深度补齐系统的效率和准确性。
    主要工作与贡献文章表明,VIO所产生具有可变稀疏性的嘈杂深度值,不仅会损害完整深度图的准确性,而且会使它们的预测远差于具有相同基础架构的纯图像深度网络。文章提出了新的解决方案来解决这些缺点并增强该网络架构,这些解决方案几乎可以推广到任何稀疏深度补全网络和数据集中,同时无需改变网络架构。作者通过利用模拟以及真实的VIO深度输入,在室外模拟MAV和室内手持 RGBD数据集上介绍和评估所提出的方法。需要为网络提供高质量的稀疏深度输入来对OpenVINS引入了一些关键更改,并在嵌入式设备(<10-15W)上实现高效的VIO深度补全。通过全面的时序实验,作者证明了其所提出的VIO深度补全系统可以实现此目标。
    算法流程初始化算法分为三部分:
    OpenVINS修改OpenVINS的核心是一个基于EKF的流形模块化的滑动窗口视觉惯性估计器。其采用了两种不同类型的特征:1)SLAM特征和2)MSCKF特征。文章首先对MSCKF特征的数量引入限制.其次,在每次特征更新后对所有可以进行三角化的主动跟踪特征执行重新三角化的过程。不仅大大缩小了计算时间,而且还可以得到更精确的稀疏深度。
    模拟分析与现有的RGBD数据集相比,文章的分析是在模拟的户外森林环境下进行的。以此提供一个具有挑战性的深度估计场景和完全密集的真实深度图。

    (a)来自VIO的RGBsD输入以及真实深度图。(b)仅通过联合每个像素绝对误差的热图来对RGB网络的预测(白色较大)。(c)经过无噪声训练的深度补全网络的预测效果比RGB网络还要差。(d)所提出的网络通过训练对极端变化的稀疏性水平和噪声深度值具有一定鲁棒性。
    0 留言 2021-07-28 17:33:20 奖励39点积分
  • 基于中心点的 3D 目标检测和跟踪

    Learning Depth from Monocular Videos using Direct Methods摘要通常三维对象以点云中的 3D 边界框表示。这种表示模仿了图像的 2D 边界框检测。边界框表示在图像领域经过了充分的研究,但给三维任务带来了额外的挑战。三维世界中的物体不遵循任何特定轴对齐的方向,基于框的检测器难以枚举所有方向或将轴对齐的边界框拟合到旋转对象。在本文中,我们建议将 三维物体以点的形式表示、检测和跟踪。我们的框架 CenterPoint 首先使用关键点检测器检测对象的中心,然后回归其他属性,包括 3D 大小、3D 方向和速度。在第二阶段,它使用对象上的附加点特征来细化这些估计。在 CenterPoint 中,三维物体的跟踪简化为贪心算法:最近点匹配。由此产生的检测和跟踪算法简单且高效。CenterPoint 在 nuScenes 基准测试中实现了最优的 3D 检测和跟踪性能,单个模型的 NDS 为 65.5,AMOTA 为 63.8。在Waymo 开放数据集上,CenterPoint 大大优于所有以前的单一模型方法,并在所有仅使用激光雷达的提交中排名第一。
    主要贡献
    提出以中心点的形式表示、检测和跟踪三维物体。相比于传统边界框表示更利于表征三维物体的偏航角。提出基于中心点和速度预测的三维追踪方法:最近点匹配,简单且高效,大大提高了三维追踪的速度和准确度。基于点的特征表示也使第二阶段的检测细化模块更加简单和高效。
    方法概述基于中心点的检测相较于传统基于锚点的三维物体检测,基于中心点的三维物体检测(上图右)可以更加简洁地描述非0°,90°,180°,270°旋转的物体。
    具体来说,CenterPoint 基于骨干网络(VoxelNet或PointPillars)学习的特征表示预测

    k个中心点热图,对应于k个检测类别。热图中的每一个局部峰值代表一个物体的中心点。同时回归物体的二维位置偏移、三维物体尺寸、偏航角以及速度。

    上图显示CenterPoint首先使用3D骨干网络提取地图视角的特征表示。在第一个阶段预测上述物体中心点位置和基于中心点的二维位置偏移、物体尺寸、偏航角以及速度等信息。第二个阶段则根据第一阶段预测的3维边界框信息综合前后左右四个点的信息精细化第一阶段的预测。
    基于速度预测的物体追踪区别于Waymo-Open数据集的基准方法,ObjectPoint物体追踪方面并没有使用三维卡曼滤波方法。而是直接由神经网络回归物体的速度,用以预测该物体在下一帧中的中心点位置。推理时可直接在下一帧中贪心地寻找最近的中心点预测作为匹配。这样的方法不仅比基准线方法更简单有效,且仅仅在物体检测管线上增加了极少的额外运算量。
    0 留言 2021-07-27 10:46:25 奖励35点积分
  • HR-NAS:搜索高效的带有轻量化Transformer的高分辨率神经网络框架

    HR-NAS: Searching Efficient High-Resolution Neural Architectures with Lightweight Transformers摘要高分辨率表示(HR)对分割,检测和姿态估计等dense prediction类任务至关重要。在之前的专注于图像分类的神经结构搜索(NAS)方法中,通常忽略学习HR表示。我们这项工作提出了一种新的NAS方法,称为HR-NAS,它能在保持高分辨率表示的同时,通过有效地编码多尺度的上下文信息,找到适合不同任务的高效且准确的网络。在HR-NAS中我们同时更新NAS的搜索空间和搜索策略。为了更好地编码HR-NAS的搜索空间中的多尺度图像上下文,我们首先仔细设计一个轻量级Transformer,轻量级Transformer的计算复杂性可根据不同的目标函数和计算预算动态地改变。受HRNET启发,为了维持学习网络的高分辨率表示,HR-NAS采用多分支架构,该架构可提供多个特征分辨率的卷积编码。最后,我们提出了一个有效的细粒度搜索策略来训练HR-NAS,这可以有效地探索了搜索空间,并找到给定各种任务和计算资源的最佳架构。HR-NAS能够实现包括三个dense prediction类任务和一个图像分类任务在内性能和FLOP之间的SOTA,并且仅仅使用少量的计算预算。例如,HR-NAS对比专门被设计用于语义细分的sSqueezeNAS[63],提高45.9%的效率。代码可在https://github.com/dingmyu/hr-nas 获得。
    算法流程在分类(Imagenet)、分割(CityScapes),姿势估计(COCO)和3D检测(Kitti)四个计算机视觉任务中,比较所提出的方法和现有的SOTA方法之间的效率(如FLOPs)和表现(如Acc,mIoU和AP)。每个方法由圆形表示,该圆形的大小表示参数的数量。黑色五角星表示具有高性能和低FLOPs的最佳模型。在所有的四个benchmarks中,我们提出的方法在类似的FLOPs下都实现了卓越的性能。

    轻量级Transformer的体系结构,其中包含projector,编码器encoder和解码器decoder。它可以被即插即用来使用,以增强图像特征的全局关联。

    (a)我们的多分支搜索空间,由并联模块和融合模块交替组成。图中的“1/4,1/8,……”表示下采样比。(b)并联模块和融合模块的图例。红色、黑色和蓝色箭头分别代表了reduction搜索模块,normal搜索模块和带有下采样的normal搜索模块。立方体表示特征图。在该示例中,融合模块通过reduction搜索模块从先前的最低分辨率分支生成额外的分支。(c)我们提出的搜索blocks中,既包含具有不同内核大小C1,C2,C3的卷积,也包含轻量级的Transformer Τ。

    在四个不同任务上搜索的较小架构(如HR-NAS-A)的可视化。青色、红色、黄色、绿色和灰色扇区的区域分别表示3x3、5x5、7x7卷积通道的数量、transformer queries的数量和移除的channels/queries的数量。请注意,如果移除搜索块的所有queries和卷积通道,则搜索块将退化为残差路径。为简单起见,我们只可视化并行模块中的搜索块。我们可以看到我们的方法能够为不同的任务找到不同的架构,表明它可以自动适应各种任务。

    我们super网络架构的可视化。min 和 mout 表示融合模块中分支的输入和输出数。nc 和 nw 分别表示并行模块中的搜索块数和通道数。箭头代表搜索块,立方体代表特征图。立方体下方的数字代表通道数。
    0 留言 2021-07-26 14:01:44 奖励39点积分
  • 基于深度学习的三维场景几何约束相机定位

    3D Scene Geometry-Aware Constraint for Camera Localization with Deep Learning摘要摄像机定位是自动驾驶车辆和移动机器人全局定位的基础和关键组成部分,可用于进一步的环境感知、路径规划和运动控制。近年来,基于卷积神经网络的端到端方法被大量研究,以实现甚至超越基于三维几何的传统方法。在这项工作中,我们提出了一个紧凑的网络绝对相机位姿回归。从这些传统的方法中得到启发,利用所有可用的信息,包括运动、深度和图像内容,引入了三维场景几何感知约束。通过定义像素级光度损失和相机结构相似性损失,我们将这个约束作为正则化术语添加到我们提出的网络中。为了衡量我们的方法,我们用我们提出的方法和最新的技术在具有挑战性的不同场景,包括室内和室外环境中进行了测试。实验结果表明,该方法在预测精度和收敛效率方面都有显著提高。
    算法我们提出的3D场景几何感知约束下的摄像机定位的自监督深度学习的示意图表示。

    Microsoft 7-Scene上的摄像头定位结果。从左到右,四个测试序列分别是头-01序列、火-04序列、南瓜-01序列、楼梯-01序列。这三个结果从上到下分别来自PoseNet[2]、MapNet[24]和我们的方法(绿色表示ground truth,红色表示prediction)。

    牛津机器人汽车数据集原始彩色图像和深度图由激光雷达捕获。环路路由子集,总长度为1120m。
    1 留言 2021-07-15 07:55:10 奖励42点积分
  • 基于生成递归神经网络和蒙特卡罗树搜索的动态环境路径规划

    Path Planning in Dynamic Environments using Generative RNNs and Monte Carlo Tree Search摘要在动态环境中,如人群或交通,机器人路径规划的最先进的方法依赖于为智能体手工制作的运动模型。这些模型通常不能反映真实世界场景中智能体的交互。为了克服这一局限性,本文提出了一种在蒙特卡罗树搜索(MCTS)中使用生成递归神经网络的集成路径规划框架。这种方法使用社会反应的学习模型来预测整个行动空间规划期间的人群动态。这扩展了我们最近使用生成递归神经网络来学习计划的机器人动作和人群可能的反应之间的关系的工作。结果表明,所提出的框架可以显著提高交互过程中的运动预测精度,允许更有效的路径规划。在仿真中,所提出的方法的性能与现有的在人群中避免碰撞的方法进行了比较,展示了控制附近个体未来状态的能力。还进行了初步的真实世界测试,以验证方法的有效性。
    系统概述说明了在基于树搜索的规划器中学习的社会反应模型的使用。训练后(蓝色),编码器对给定观察序列的最终隐藏状态与最新观察Xt一起用作计划器的根状态(红色)。解码器然后可以在单个步骤中用于模拟给定动作A和节点状态S的MDP的状态转换。

    不同机器人视角△t预测精度的比较,和当不使用机器人输入时(△t =None)。ADE和FDE显示为所有代理(红色),并仅限于机器人附近的代理(蓝色、青色、青色)。对于ORCA和VCI,可以看到△t和精度之间的相关性,尽管不适合ARATH,除非距离有限。

    算法
    0 留言 2021-07-17 10:23:29 奖励38点积分
  • 2013第四届蓝桥杯 C/C++本科A组 排它平方数(C语言)

    题目标题: 排它平方数小明正看着 203879 这个数字发呆。
    原来,203879 * 203879 = 41566646641
    这有什么神奇呢?仔细观察,203879 是个 6 位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
    具有这样特点的6位数还有一个,请你找出它!

    再归纳一下筛选要求:

    6位正整数
    每个数位上的数字不同
    其平方数的每个数位不含原数字的任何组成数位

    答案是一个 6 位的正整数。

    注意:只提交另一6位数,题中已经给出的这个不要提交
    注意:不要书写其它的内容(比如:说明性的文字)

    #include <stdio.h>int f(long long i,int a[]){ int b; while(i) { b=i%10; if(a[b]==0) a[b]++; else return 0; i/=10; } return 1;}int f1(long long x,int a[]){ int b; while(x) { b=x%10; if(a[b]!=0) return 0; x/=10; } return 1;}int main(){ int a[10]; for(long long i=123456;i<=978654;i++) { for(int i=0;i<10;i++) a[i]=0; if(f(i,a)) { long long x=i*i; if(f1(x,a)) printf("%d\n",i); } } return 0;}
    输出结果:
    203879639172
    0 留言 2021-07-12 14:03:55 奖励36点积分
  • Java:多线程入门

    进程与线程
    进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1—n个线程。(进程是资源分配的最小单位)
    线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
    线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止

    Java线程有六个状态:NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)、TIMED_WAITING(指定时间等待)、TERMINATED(终止)
    Java线程是不区分 Ready(就绪)和 Running(运行)的,它们都是 Runnable 状态。
    多进程是指操作系统能同时运行多个任务(程序),同一程序中有多个顺序流在执行。
    在java中要想实现多线程,有两种手段,一种是继承Thread类,另外一种是实现Runable接口。(其实准确来讲,应该有三种,还有一种是实现Callable接口,并与Future、线程池结合使用)
    一、创建与调用线程1.创建类继承 Thread 类,重写 run 方法
    public class MyThread extends Thread { /** * run 方法就是线性要执行的任务方法 */ @Override public void run() { // 这个的代码,就是一条新的执行路径 // 这个执行路径的触发方式,不是调用 run 方法,而是通过 thread 对象的 start() 来启动任务 for (int i = 0; i < 10; i++) { System.out.println("分支任务执行"+i); } }}public class Test { /** * 多线程技术 */ public static void main(String[] args) { MyThread m = new MyThread(); m.start(); for (int i = 0; i < 10; i++) { System.out.println("主任务执行"+i); } }}
    运行结果每次都会不一样,这是两个线程相互抢占,使用抢占式分配的结果,故后续相同功能的代码运行结果省略:
    主任务执行0主任务执行1分支任务执行0主任务执行2分支任务执行1主任务执行3分支任务执行2分支任务执行3主任务执行4主任务执行5主任务执行6分支任务执行4主任务执行7分支任务执行5主任务执行8分支任务执行6主任务执行9分支任务执行7分支任务执行8分支任务执行92.使用匿名内部类创建线程
    public static void main(String[] args) { new Thread(){ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("分支任务执行"+i); } } }.start(); for (int i = 0; i < 10; i++) { System.out.println("主任务执行"+i); }}
    3.创建类继承 Runnable 接口,重写 run 方法
    public class MyRunnable implements Runnable { @Override public void run() { // 线程的任务 for (int i = 0; i < 10; i++) { System.out.println("分支任务执行"+i); } }}public class Test { /** * 多线程技术 */ public static void main(String[] args) { // 实现 Runnable // 1. 创建一个任务对象 MyRunnable r = new MyRunnable(); // 2. 创建一个线程,并为其分配一个任务 Thread t = new Thread(r); // 3. 执行这个线程 t.start(); for (int i = 0; i < 10; i++) { System.out.println("主任务执行"+i); } }}
    4.使用匿名内部类实现 Runnable
    public static void main(String[] args) { Thread t = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("分支任务执行"+i); } } }); t.start(); for (int i = 0; i < 10; i++) { System.out.println("主任务执行"+i); }}
    5.使用 Lambda 表达式,这是一个面向函数的编写方式,其中:

    注:括号代表重写的方法,方法名可省略,括号内部可传参数类型,大括号中是重写的方法内容,大括号外可传参数的值

    public static void main(String[] args) { Thread t = new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("分支任务执行"+i); } }); t.start(); for (int i = 0; i < 10; i++) { System.out.println("主任务执行"+i); }}
    另外:实现 Runnable 与继承 Thread 相比有如下优势

    通过创建任务,然后给线程分配的方式来实现多线程,更适合多个线程同时执行相同任务的情况
    可以避免单继承所带来的局限性,实现 Runnable 可以继承其他的类增强实用性
    任务与线程本身是分离的分离的,提高了程序的健壮性
    线程池技术只接受 Runnable 类型的任务,而不接受 Thread 类型的线程

    二、操作线程的常用方法1.设置和获取线程名称
    public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); new Thread(new MainRunnable(),"分支任务").start();}static class MainRunnable implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()); }}
    运行结果如下,若不传进程名称只传目标类,则会生成默认名称:Thread-0,后续创建的进程名称依次加一: Thread-1、Thread-2……
    main分支任务2.线程休眠 sleep,在任何线程中均能使用,能使当前正在执行的线程休眠(暂时停止执行)指定的时间,常用传入参数为毫秒
    public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 10; i++) { System.out.println(i); Thread.sleep(1000); }}
    3.线程的中断 interrupt,需要注意的是,这个方法只是给进程添加了一个标记,这个标记能被 InterruptedException 捕捉进入 catch 部分的代码,可在此处进行结束进程、释放资源等操作
    public static void main(String[] args) throws InterruptedException { Thread t = new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { // 1. e.printStackTrace(); // 2. System.out.println("发现了中断标记"); // 3. System.out.println("发现了中断标记,令进程死亡"); return; } } }); t.start(); for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName()+":"+i); Thread.sleep(1000); } t.interrupt();}
    0 留言 2021-07-12 08:56:48 奖励36点积分
  • 基于Java实现的五子棋小游戏

    摘 要子棋的起源
    五子棋,是一种两人对弈的纯策略型棋类游戏,亦称“串珠”、“连五子”是中国民间非常熟知的一个古老棋种。相传,它起源于四千多年前的尧帝时期,比围棋的历史还要悠久。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。
    五子棋发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜﹔不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
    传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为 19X19,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的 5 个或 5 个以上同色棋子连成不间断的一排者为胜。因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。
    子棋的基本常识
    与任何一种竞技棋一样,五子棋的每一局棋也分为三个阶段:开局,中局和残局。五子棋的开始阶段称为开局,或称布局。其开局阶段是十分短暂的,大约在七着与十几着之间。在这一阶段的争夺中,双方的布局,应对将对以后的胜负起着极为关键的作用。在开局阶段取得的形势好坏,主动与被动,先手与后手的优劣程度,往往直接影响中局的战斗。因此积极处理好开局和开局向中局的过渡十分重要。
    五子棋是从一至五,逐渐布子,发展连系,同时运用限制和反限制的智慧,在连子的过程中为自己的棋子争得相对的主动权和优势,逐步扩展优势,或者从劣势转化为优势,击溃对方的防线,最后连五取胜或抓禁手取胜或迫使对方投子认负。
    关键词:五子棋,游戏设计,Java 语言,人工智能
    一、系统分析1.1 可行性分析如果问题缺少可行的解决办法,那么开发此游戏系统所花费的任何时间、资源经费都是一种浪费。通过对“番茄炒鸡蛋”版的五子棋人机对战游戏系统进行可行性分析,验证本系统发的任何问题都含有可行的解决办法,系统的具体开发都是建立在可行性分析的基础上的。
    1.1.1 技术可行性计算机硬件和软件技术的飞速发展,为游戏系统的开发提供了设备条件。当前在网络上有许多的五子棋软件可供借鉴参考,而且我自己也熟练掌握了 Java 语言在 eclipse 环境下的基本应用,因此本游戏在技术上是完全可行的。
    1.1.2 操作可行性本游戏适用于 Windows 操作系统上,需要在 eclipse 环境下,添加 Easyx 图形库进行运行测试。该游戏使用 Java 语言编写,具有很强的移植性,使其可以运行很方便,用户运行程序时只需要通过点击鼠标和辅助以键盘操作,根据提示执行相应的操作即可。
    1.2 需求分析
    实现网络五子棋对弈功能
    实现悔棋,认输,求和等功能
    实现多人同时游戏功能。一方可以创建比赛,另一方加入比赛进行游戏
    实现输赢之后切换先后手的功能

    用况描述:



    用况编号:001




    用况名:用户登录


    用况描述:用户根据自己的用户名和密码,登录到游戏


    参与者:玩家,管理员


    基本路径:;玩家登录游戏;输入用户名和密码;玩家提交输入信息;系统对用户的账号和密码进行有效性检查;系统记录并显示当前登录用户;玩家进行权限范围内的操作;系统允许进行系统权限内的相关操作






    用况编号:002




    用况名:五子棋


    用况描述:网络五子棋对战


    参与者:玩家


    前置条件:五子棋系统正常运行


    基本路线:;1.用户已登录;2.玩家创建比赛,进行对战;3.黑白子交替落子;4.一方连成五子即获得胜利;5.开始新的对局






    用况编号:003




    用况名:悔棋


    用况描述:玩家在下棋过程中选择悔棋


    参与者:玩家


    前置条件:下棋中


    基本路线:;双方玩家已进行游戏;一方玩家选择是否悔棋;另一方玩家同意或拒绝对方悔棋要求。;悔棋成功。退回到上一步或拒绝请求继续走子。






    用况编号:004




    用况名:求和


    用况描述:玩家在下棋过程中选择求和


    参与者:玩家


    前置条件:下棋中


    基本路线:;双方玩家已进行游戏;一方玩家选择是否求和;另一方玩家同意或拒绝对方求和要求。;求和成功回退上一步或拒绝请求继续走子。






    用况编号:005




    用况名:认输


    用况描述:玩家在下棋过程中选择认输


    参与者:玩家


    前置条件:下棋中


    基本路线:双方玩家已进行游戏;一方玩家选择是否认输;另一方玩家收到认输请求,获得胜利




    抽象出三个具体的边界类:
    客户端:

    用户主界面:用户登录游戏后的第一个界面,实现向其他功能界面的跳转
    游戏界面:关键界面,实现网络五子棋的功能
    说明界面:辅助界面,向玩家介绍有关游戏的相关情况及操作说明
    聊天界面:可与好友聊天

    服务器端:

    服务器界面:可以显示一些有关链接到本服务器上的客户端的一些信息
    实体类:

    棋子信息类:用于记录已下过棋子的信息
    服务器控制按钮类:其上只记录一些有关的功能按键。不参与具体操作,可进行自由修改

    控制类:

    客户端线程类:实现客户端与服务器之间通信
    棋子线程类:实现网络棋盘的绘制等有关棋盘的功能
    服务器线程类:实现服务器和客户端之间的通信信号处理

    类的属性及方法:



    登录类





    属性
    描述


    ID
    用户账号


    passward
    用户账号密码


    方法
    描述


    Check()
    检验用户账号和密码是否正确






    主页面





    属性
    描述


    chessButton
    跳转到象棋界面的按钮


    chatButton
    跳转到聊天界面的按钮


    exitButton
    退出程序的按钮


    方法
    描述


    ChangeView
    判断所点击的按钮转移到相对应的界面






    游戏说明





    属性
    描述


    gameInformation
    游戏说明文字


    backButton
    返回到主页面的按钮


    方法
    描述


    Back()
    返回到主页面的方法






    聊天





    属性
    描述


    friendID
    好友账号


    chatString
    聊天文本


    chatButton
    发送按钮


    方法
    描述


    Connect()
    连接到相应的账号进行聊天






    客户端类





    属性
    描述


    clientSocket
    客户端套接口


    inputStream
    数据输入流


    outputStream
    数据输出流


    chessClientName
    用户名


    host
    主机地址


    port
    主机端口


    isOnchess
    判断是否在下棋


    isGameConnected
    判断是否在进行游戏


    isCreator
    判断是否为游戏创建者


    isParticipant
    判断是否为游戏加入者


    userchessPad
    用户下棋控制区


    UserLIstPad
    用户列表区


    userControlPad
    用户控制区


    firpad
    下棋区


    方法
    描述


    client ()
    构建界面的构造方法


    connectToServer()
    连接服务器方法


    actionPerformed()
    客户端事件处理方法






    客户端线程





    属性
    描述


    firClient
    子线程


    方法
    描述


    ClientThread()
    构造方法


    dealWithMsg()
    处理服务器发送来的信息并进行处理


    run()
    运行子线程






    用户下棋控制区





    属性
    描述


    regretButton
    悔棋按钮


    giveupButton
    认输按钮


    PeaceButton
    求和按钮


    方法
    描述


    ChessPad()
    构造方法






    用户控制区





    属性
    描述


    ipInputted
    服务器 IP 输入


    connectButton
    连接服务器按钮


    createButton
    创建游戏按钮


    joinButton
    加入游戏按钮


    cancelButton
    取消游戏按钮


    exitButton
    退出游戏按钮


    方法
    描述


    UserControlPad()
    构造方法






    用户列表区





    属性
    描述


    userList
    用户列表区域


    方法
    描述


    UserListPad()
    构造方法






    棋盘类





    属性
    描述


    isMouseEnabled
    悔棋按钮


    isWinned
    认输按钮


    isGaming
    求和按钮


    chessX_POS
    棋子的 X 轴坐标


    chessY_POS
    棋子的 Y 轴坐标


    chessColor
    棋子的颜色


    chessBlackCount
    白棋数量


    chessWhiteCount
    黑棋数量


    chessSocket
    棋子套接口


    inputData
    数据输入流


    outputData
    数据输出流


    方法
    描述


    Pad()
    构造方法


    Connect Server()
    连接到主机


    SetVicStatus()
    设置胜利棋盘状态


    setLocation()
    取得指定棋子位置


    checkVicStatus()
    判断一方获胜状态


    Paint()
    画棋盘


    PaintFirPoint()
    画棋子


    paintNetFirPoint()
    画网络棋盘






    棋子类





    属性
    描述


    padBelonged
    棋子所属棋盘


    方法
    描述


    Paint()
    绘制棋子






    棋子线程





    属性
    描述


    curpad
    子线程


    方法
    描述


    dealWithMsg ()
    处理服务器发来信息


    SendMessage()
    向服务器发送消息



    类图:

    类图说明:



    类名
    描述
    与其他类的关系




    登录
    输入用户名和密码登录
    连接主面板


    主面板
    实现跳转到客户端,游戏说明,聊天等界面的中转界面
    跳转到游戏说明,客户端,聊天


    游戏说明
    向用户介绍游戏步骤
    连接到主页面


    聊天
    实现不同用户之间聊天
    连接到主页面


    客户端类
    实现网络五子棋对战功能
    使用用户下棋控制区,用户控制区,用户列表区,棋盘类,棋子类


    客户端线程
    实现客户端和服务器端的信息传递和相应处理
    由客户端生成


    用户下棋控制区
    声明悔棋,求和,认输按钮
    由客户端调用


    用户控制区
    声明创建游戏,加入游戏,放弃游戏,退出程序等按键
    由客户端调用


    用户列表区
    显示连接到服务器的用户
    由客户端调用


    棋子类
    声明有关棋子的信息
    由客户端调用


    棋盘线程类
    处理有关传给棋盘的信息
    由棋盘类生成


    棋盘类
    声明棋盘有关信息
    由客户端调用



    服务器端类图:



    登录类





    属性
    描述


    ID
    用户账号


    passward
    用户账号密码


    方法
    描述


    Check()
    检验用户账号和密码是否正确






    服务器类





    属性
    描述


    clearMsgButton
    清空列表按钮


    serverStatusButton
    显示服务器状态按钮


    closeServerButton
    关闭服务器按钮


    serverSocket
    服务器端套接字


    clientDataHash
    将客户端套接口和输出流绑定


    clientNameHash
    将客户端套接口和客户名绑定


    chessPeerHash
    将游戏创建者和游戏加入者绑定


    方法
    描述


    Server()
    构造方法


    createServer()
    创建服务器方法


    actionPerformed
    服务器响应事件方法






    服务器线程类





    属性
    描述


    ClientSocket
    服务器子线程


    方法
    描述


    sendGamePermsg()
    给客户端发送消息


    DealMessage()
    对用户端传来信息做出反应




    类图说明:



    类名
    描述
    与其他类的关系




    登录
    登录界面
    登录到服务器


    服务器类
    服务器面板相关控件
    调用服务器线程


    服务器线程
    实现服务器和客户端之间信息传递
    由服务器线程调用



    1.2.1 数据流分析结构化分析方法就是面向数据流自顶向下逐步求精进行需求分析的方法。通过可行性研究可以得到该系统的顶层数据流图。按照数据流图的层级划分,数据流图可以分为顶层数据流图,一层数据流图和二层数据流图。这里主要画出这三层数据流图。
    玩家进入游戏界面之后根据执行相应的操作。首先是在在开始界面,玩家点击开始即可进入游戏界面,进入游戏界面后玩家需要进行连接 ip 服务器,之后玩家下棋再通过判断周围空的位置选择出落子的最优位置,进行下棋,获胜的一方分数就会自动先加 1 分。
    1.2.2 系统功能需求计分功能
    计分功能主要是实现计算玩家和电脑分数的功能,在玩家和电脑进行对战时,双方每落一子对应的加 10 分。
    判断输赢功能
    判断输赢即玩家和电脑在游戏过程中累计得到的分数哪一方更高,最先连成五棋者,分数会比对方高 1 分,即高分者胜出。
    输出分数功能
    与计分功能不同的是,计分模块实现的是记录每落一子累计得所有分数,而输出函数功能是用来将玩家和电脑累计得所有分数在游戏界面上的对应位置显示出来。
    二、2 系统设计2.1 系统总体设计思想
    玩家游戏顺序:

    玩家首先登录到用户端主界面
    可通过用户端主界面进行网络对战
    通过用户端主界面进行查看游戏说明
    进入网络对战界面后开始对战,可以进行认输,悔棋,和棋等操作
    客户端对用户要求进行处理
    玩家退出登录

    实现过程:
    使用 Java 语言进行编程。通过 gui 编程对边界类进行设计。添加响应事件处理。
    其中 client 为用户端总体服务包。
    其中 Main.java 为用户登录主界面,用户可通过该界面实现跳转到任意其他功能界面。Inform.java 为游戏说明界面。用户可以在此查阅有关该五子棋的操作说明。FIRClient.java 为用户下棋界面。通过调用 gui 包下三个界面以及 pad 包下的 FIRPad.java 类创建用户下棋界面。同时实现按键响应事件的功能。Chat.java 为用户聊天界面。可以在此与自己好友聊天并约一起下五子棋。ChatThread.java 为聊天线程,将聊天信息传递给服务器后再传递给好友,实现信息传递功能。FIRSocket.java 实现套接字功能,将用户的棋盘信息通过套接字传递给服务器,将整个传递的过程抽象化。
    FIRClientThread.java 主要用来和服务器端相连并处理服务器传来的信号事件并向服务器端发出一些信息以实现和服务器端的交互功能。
    Gui 为用户服务器功能控制面板。其中 UserchessPad.java 类为用户下棋功能控制区。在此面板上有实现悔棋,认输,求和功能的按键。UserControlPad.java 类为用户控制区。在此面板上有输入服务器 ip 地址的文本框,连接服务器按钮。创建游戏按键,加入游戏按键,放弃游戏按键和结束程序按键。用来实现客户端和服务器端连接的功能。UserListPad.java 类为用户目录类。在该区域显示连接至服务器的客户。
    Pad 包实现了下棋的有关功能。其中 Pad.java 类绘制了棋盘和棋子。并实现了判断获胜条件的函数。实现了悔棋功能的相关函数。PointBlack.java 类为黑棋类,记录了黑棋下棋的信息。PointWhite.java 类为白棋类,记录了白棋的有关信息。Thread.java 实现了处理从服务器端收到信息的处理过程。Chess 类记录了所有棋子的相关信息,方便悔棋时重绘棋盘。
    Server 包为服务器端。其中 Sever.java 为服务器端界面,其上实现了有关服务器的信息和连接至服务器的客户端的一些信息。SeverThread.java 为服务器线程类。实现了处理从客户端收到的信息和想向客户端发送信息的功能。ServerMsgPanel.java 为服务器功能类。实现了服务器的一些按键。
    2.2 系统模块设计本系统分为玩家和玩家两个角色,这两个角色有公用的功能模块也有着各自独立的功能模块。
    2.2.1 系统功能分析玩家和玩家角色的共用模块分为界面设计模块,棋盘布置模块,计分功能以及判断输赢功能。玩家角色有选择最优落子位置功能模块。具体内容如下:
    界面设计模块
    玩家运行游戏时首先见到的就是界面设计显示,进入游戏界时先选择电脑和玩家谁先下棋,之后按照正常的下棋规则进行人机对战。
    棋盘布置模块
    通过代码实现棋盘的绘制,可以自行控制棋盘的大小。
    计分功能模块
    计分功能模块主要是实现计算玩家和电脑分数的功能,在玩家和电脑进行对战时,双方每落一子对应的加 10 分。
    判断输赢功能模块
    电脑和玩家哪一方首先实现五子连接,方向不限,即表示胜利,即当前游戏结束,会提示相应的胜利或失败的文字提示,点击任意键还可以进行下一次游戏。
    选择电脑下棋功能模块:
    进入游戏界面后玩家根据提示框选择是否先让电脑先下棋,选择是则电脑会在棋盘上的任意一个位置落下一子,之后玩家可以跟据自己的想法在任何位置下棋。
    2.2.2 系统功能模块结构图通过上述该系统的模块划分和功能分析,作出系统总体结构图,如图 2.1 所示:

    具体编程过程由 Java 语言编写。总计四个包,十五个类。由于个人能力有限,只实现了部分功能。

    有关类的说明:



    类名
    描述
    与其他类的关系




    Client.java
    创建用户端下棋主界面
    使用 Chess.java 和 ChessPad.java 和 UserControlPad.java 和 UserListPad.java 创建界面,创建 ClientThread.java 处理用户端和服务器之间的信息。


    ClientThread.java
    向服务器端发送信息并接受服务器端传来的信息并向其他功能类使用相关操作
    由 Client.java 类产生。


    Inform.java
    向用户介绍游戏步骤
    由用户端主界面 Main.java 生成


    Main.java
    此为用户端登录主界面,实现向下棋端 Client,游戏说明 Inform 的跳转功能。
    生成 Client.java 和 Inform.java


    ChessPad.java
    实现下棋过程中的功能按键
    由 Client.java 调用


    UserControlPad.java
    实现玩家为下五子棋所作的功能界面。包括链接到服务器,创建游戏,加入游戏,放弃游戏,退出程序等功能按键。
    由 Client.java 调用


    UserListPad.java
    声明悔棋,求和,认输按钮
    由客户端调用


    Chess.java
    记录有关下棋过程中已经下过的棋子的信息,供悔棋过程中重绘界面做准备
    由 Pad.java 调用。


    ChessThread.java
    处理来自服务器端生成另一方下棋等功能的类
    由 Pad.java 生成。


    Pad.java
    实现下五子棋的绘画界面
    由 Client.java 调用生成下五子棋的部分。


    PointBlack.java
    声明有关白子的属性
    由棋盘类生成


    PointWhite.java
    声明有关黑子的属性
    由客户端调用


    Server.java
    声明有关服务器界面的相关信息并设置按钮响应事件
    调用 ServerMsgPanel.java 类和 ServerThread.java 类


    ServerMsgPanel.java
    设置一些有关服务器的功能按键
    由 Server.java 调用


    ServerThread.java
    接受并处理一些由客户端发来的信息
    由 Server.java 调用




    2.2.3 系统流程图五子棋人机对战的流程设计使用的是树状结构,系统流程图如图 2.3 所示:

    三、3 系统实现3.1 玩家下棋功能的实现那么玩家下棋。之后每次轮到玩家下棋都是使用着一个函数。玩家下完一棋之后,电脑会立刻寻找周围最高分位置,实现落子。
    效果截图:

    程序流程图:

    程序代码如下:

    3.2 判断下棋位置功能的实现五子棋人机对战只要就是电脑人工智能方面的实现,当玩家下完一棋轮到电脑的时候,电脑需要计算出周围所有空位置的分数,找到最高分的那个位置下棋,有子的地方上下左右以及左斜右斜方向上都要计算,这样既可以做到防守,有可以做到进攻。每当玩家快要实现五子的时候电脑就会抢占他的位置,同样电脑会主动寻找最有利于他胜利的位置,如下图所示电脑对玩家时刻做到了“防守”,同时也做到了 “进攻”。
    这里用到的函数是估值函数,这是对于下子的重要性评分,可以从四个方向来考虑当前棋局的情况,分别为:水平,垂直,左斜,右斜。实际上需要考虑在这四个方向上某一方所形成的子的布局情况,对于在还没有子的地方落子以后的当前局面的评分,主要是为了说明在这个地方下子的重要性程度,在此设定了一个简单规则来表示当前局面电脑方和玩家方的分数。
    最后,根据当前最后一个落子的情况来判断胜负。需要从四个位置判断,以该子为出发点的水平,竖直和两条分别为 45 度角和 135 度角的线,目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是的话,就表示胜负已分。
    效果截图:

    程序代码如下:



    3.3 判断输赢功能的实现双方的输赢是根据最后一个落子的情况来判断胜负。要结合选择最优落子位置的代码功能实现。要从四个位置判断,以当前棋子为出发点的水平,竖直和两条分别为 45 度角和 135 度角的线,目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是的话,就表示胜负已分。
    判断输赢功能功能截图:

    程序代码如下:

    3.4 计分功能的实现计分是在实现玩家和电脑落子的语句后添加语句实现分数加 10。首先是在代码开始定义全局变量,定义一个成绩结构体,定义两个整数变量用来表示玩家和电脑的各自分数,在 main 函数中进行初始化,初始值为 0,当玩家选择电脑先下棋时,在 decide1()函数中实现语句 count+10;同样在玩家下棋的函数代码部分也编写同样的语句,实现分数加 10。在电脑和玩家下棋的函数中还要调用输出分数函数 printscore(),保证分数可以实时根据玩家和电脑落子个数进行分数更新。
    运行结果:

    黑棋

    白棋

    四、4 测试系统测试的目的是为了确定系统是否满足用户的各种需求,找出预期目标与实际结果之间的差别]。
    4.1 测试方法和测试计划确定测试方法和测试计划是实现测试的第一步,明确了测试方法以及计划,对之后的测试进度就会有所帮助。
    4.1.1 测试方法本系统实现的是五子棋人机对战的功能,测试方法采用的是黑盒和白盒相结合的方法,先使用黑盒测试查看系统的效果,有无差错或者不符合要求的内容,如果有差错,则在采用白盒测试,研读代码中的错误并进行修改。采用黑盒测试主要进行的是系统的功能性测试,健壮性测试。
    4.1.2 测试计划登录界面:

    游戏说明界面:

    游戏面板:

    一方获胜:


    先后弹出弹窗显示胜利信息,待确认后开始新的一局对局。败方先行。
    悔棋功能:
    一方下完后,发现另一方四子连珠,此时可以悔棋,回到前两步。
    悔棋前棋局:

    一方悔棋:
    另一方弹出悔棋请求框

    若拒绝:
    请求悔棋方弹出确认框收到对方拒绝回应

    若同意,回退到上一步:
    前后对比:


    求和功能:
    一方求和:
    求和大致流程与悔棋一致,若最后求和成功。双方显示“恭喜您获得胜利”后开始下一局。

    认输功能:
    一方认输,另一方直接获胜。开始新的一局。

    服务器端窗口:

    4.2 测试过程和结果分析游戏流程

    先打开服务器端
    打开两个用户端,点击网络对战后,弹出对战页面窗口
    输入服务端 ip 地址,点击连接服务器按钮,连接到服务器
    一方玩家创建游戏,一方玩家加入游戏
    开始互相走子
    若一方玩家走子失误,则可以点击悔棋按钮进行悔棋
    若一方玩家发现已经失败,可以点击认输按钮直接进行下一局
    若双方走子你来我往,互不相让,可以点击求和按钮,若对方同意,可直接双方获胜,开启下一局
    一方因为出现临时事故,可以直接点击放弃按钮,结束游戏。此时对方直接获胜

    有一些遗憾的地方:
    观战功能:观战功能尚未实现。
    悔棋功能:
    在进行该功能实现的过程中进行了客户端和服务器端的信息传递,但始终无法实现回退到上一步的界面设计功能。试了很多方法最后都失败了。最后利用了页面的重绘机制。利用一个结构体数组将所走步数存起来。然后在按下悔棋按钮后将最后一步归 0,回退到上一步的界面,将界面重绘一遍。借此实现悔棋的功能。但有时候悔棋仍会出现一些问题。
    页面优化问题:
    在要求功能实现之后着手进行页面优化工作。添加了游戏主界面和游戏说明界面的背景图片设计。游戏大厅的功能还没能够实现。
    结论与展望开发心得和结论本次面向对象实习,我做的课题是有关网络五子棋游戏的实现。前期主要体验了有关面向对象的分析过程。全面分析有关课题的用况,画出用况图,分析有关类,抽象出实习类和抽象类。前期的设想功能很多,但等到真正的编程过程中,真正实现的功能却更设想的有很大的差距。在使用 Java 语言进行编程的过程中。我的题目主要就是为了实现多个用户互相连接。实现网络功能,为此使用了 Java 的网络编程方法,套接字,多线程等功能。在整个编程过程中加深了我对于 Java 编程语言的理解和运用情况。总而言之,此次实习过程使得我较为全面的了解了有关面向对象编程的思路。基本实现了题目关于网络五子对战的要求。但是由于个人知识水平的局限性,整个程序在运行的过程中有时会出现一些小问题。在此过程中十分感谢实习老师和其他同学对我的帮助。总体来说,这次实习过程是较为成功的。接下来,我会继续努力。加强有关知识的了解和学习。希望可以做出一个更加完善的五子棋系统。
    不足之处及未来展望虽然本系统相较于一般用户来说基本上可以实现娱乐消遣,满足了他们的基本需求,但是由于时间有限,个人的经验缺乏,本系统仍然存在一些问题,还需要继续完善,实现更详细的功能,存在问题有如下:
    开始界面的设计:
    可以在进行美化以及加工,再添加两个按钮,一个是退出系统按钮,一个是游戏帮助按钮,当用户进入到游戏开始界面的时候,用户只需要点击退出游戏按钮,就可以直接退出游戏,添加按钮看起来更为的直观便用户使用。而添加游戏帮助按钮,是为了那些不熟悉游戏规则的人群所设计的,在规则界面的显示方面不够好,没有完全的将他展示出来,所有做的不够号。只有手动拉才可以将他拉开。
    0 留言 2021-07-11 10:27:19 奖励70点积分
  • 基于混合鸟瞰边缘的自动代客泊车语义视觉SLAM

    Hybrid Bird’s-Eye Edge Based Semantic Visual SLAM for Automated Valet Parking摘要基于视觉的定位和建图解决方案有望在自动代客泊车任务中采用。本文提出了一种在鸟瞰图像上利用混合边缘信息的语义SLAM框架。为了从合成的鸟瞰图图像和自由空间轮廓中提取有用的边缘以用于SLAM任务,设计了不同的分割方法,以消除视图合成中逆透视变换(IPM)所导致的嘈杂的眩光边缘和扭曲的对象边缘。由于只要自由空间分割模型需要训练,因此与以前的基于道路标记的方法相比,我们的方法可以大大减少标签负担。这些不正确和不完整的边缘分别通过局部地图中连续边缘的时间融合来进一步清理和恢复。语义边缘点云图和占据栅格图都可以同时实时构建。停车场中的实验表明,与以前的基于点特征的方法相比,所提出的框架可以实现更高的准确性和更强大的性能。
    主要工作与贡献
    提出了一种混合语义信息提取方法,该方法结合了经典的无监督边缘检测器和一组基于IPM的边缘分割方法。自由空间粗糙地分割,大大减少了标注数据的负担。使用IPM先验知识,可以过滤掉嘈杂和扭曲的边,例如眩光的边缘和扭曲物体轮廓。将自由空间内的鸟瞰边缘和自由空间的轮廓组合为混合边缘,再进行定位和建图。
    算法流程
    1.鸟瞰边缘提取A.原始边缘检测借助自由空间分割,可以去除地面上物体内部的边缘。但仍然包含大量来自眩光和被 IPM 扭曲的物体的干扰边缘。因此,这些边缘在发送到建图和里程计模块之前需要进一步处理。B.基于IPM边缘分割,介绍三种不同方法的分割
    基于射线分割法:虽然射线分割法能够简单、快速去除部分扭曲的边,但是缺陷也是明显的。第一,扭曲的边缘通常不是直的,预先设定angle bins的分界线,导致长的扭曲边容易被划分成两部分。第二,由于没有考虑边的结构,容易将小而密集的边错误地去除掉。第三,由于角度步长和阈值是耦合的,调整基于射线的分割参数也很困难。基于线段分割法:考虑到边的几何分布,本文试图检测线段分割方法,如图4(b)所示。通过线段检测器检测得到线段,计算相机焦点与每条线段之间的距离,并与距离阈值进行比较。非常靠近焦点的线段被标记为扭曲的边。优点:减少沿特定径向方向错误地去除密集边缘的可能性;检测参数和分割阈值划分明确。缺点:那些与不相连边的点容易错误的的认为是同一部分;距离相机较远的扭曲边,很难满足条件被去除。基于折线分割法:分割前,区分不同边的实例,然后在对每个边实例,使用Douglas-Peucker算法简化边缘并生成折线。线段与焦点连接线段的虚线形成一个夹角,一般扭曲边的线段与焦点连线形成的夹角都很小。优点:简化了线估计,限制折线成为边实例。缺点:与线段分割法相比,用两条线的方向向量的之间的夹角作为一个评估方式有点不明智,尤其是在远离相机的那些边。
    2.语义里程计和建图利用鸟瞰边缘和自由空间的的混合点云,建立语义 SLAM 系统。
    用于姿态估计的局部地图生成管道,包括(a)累积概率局部地图,(b)阈值局部地图和(c)提取的边缘(绿色是鸟瞰边缘,红色是自由空间边)加入到局部地图。利用鸟瞰边缘和自由空间的的混合点云,建立语义 SLAM 系统。
    A.局部地图的建立交替地在连续帧中累积提取的边缘并构建局部边缘图以获得更稳定的运动估计。图5显示的是局部地图的示例,不同帧的融合是概率性的。为了平稳地更新局部地图并填补小间隙,使用高斯滤波器对加入到局部的边进行一个筛选处理。增加滑动窗口融合机制,去除已经在局部地图中的被错误分割的边。B.位姿估计融合的局部边地图被阈值化并转换为世界坐标中的点云。为了估计当前车辆在局部地图中的姿态,首先通过车轮里程计的变换将当前帧中边点投影到局部地图上。通过最近邻搜索建立数据关联。最后,可以通过解决以下问题来估计局部地图车辆中的当前位姿:C.全局地图由于提取的自由空间边缘也可以被视为 2D LiDAR 测量,因此不仅可以同时构建语义点云图,还可以同时构建占用网格图。当局部地图之间检测到回环时,执行正常位姿图优化以校正漂移。
    0 留言 2021-07-13 12:38:59 奖励39点积分
显示 0 到 15 ,共 15 条
eject