董成光 楊保華
摘要:隨著軟件技術(shù)不斷地發(fā)展,人與人之間也出現(xiàn)了各種各樣的社交軟件,問(wèn)答社區(qū)就是其中一種,比如知乎網(wǎng)站,各大高校企業(yè),政府機(jī)構(gòu)都有自己相應(yīng)的內(nèi)部論壇來(lái)討論各自內(nèi)部的問(wèn)題。該文根據(jù)知乎的業(yè)務(wù)流程模式,運(yùn)行方式,架構(gòu)方式,完成一個(gè)基于javaweb架構(gòu)的模仿知乎的問(wèn)答社區(qū)即蛤乎的設(shè)計(jì)和實(shí)現(xiàn)。問(wèn)答社區(qū)運(yùn)行java和mysql和tomcat體系來(lái)開發(fā)和實(shí)現(xiàn),包括自動(dòng)發(fā)送郵件,驗(yàn)證用戶,登錄,自己個(gè)人主頁(yè)的提問(wèn)問(wèn)題,關(guān)注別人的問(wèn)題,用戶相互之間關(guān)注,消息推送第一時(shí)間獲取關(guān)注的問(wèn)題和用戶的信息,發(fā)現(xiàn)更多新知識(shí),查看當(dāng)月本周的最新最熱問(wèn)題等服務(wù)。在整個(gè)系統(tǒng)設(shè)計(jì)中充分利用了工廠設(shè)計(jì)模式,面向接口編程,動(dòng)態(tài)代理,自動(dòng)自如,緩存,tomcat集群,分布式鎖等,使系統(tǒng)更加具有耦合性,提高網(wǎng)站的運(yùn)行速度和高并發(fā)。
關(guān)鍵詞:?jiǎn)柎鹕鐓^(qū);javaweb;redis;ssm;蛤乎
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)14-0048-04
Abstract: With the rapid development of software technology, a variety of social software have appeared, the question-answer(Q&A;) community is one of them, such as the ZHUHU website. In order to discuss their internal problem, many units have their own internal forums, such as university enterprises and government agencies. According to the business process mode, operation mode and architecture mode of the ZHUHU website, a Q &A; community HAHU based a JavaWeb architecture is designed and implemented which is similar to ZHUHU website. Java and MySQL and Tomcat system are used in HAHU, including automatic mail, user login, authentication, questions in their own personal home, attention to the problems of others, between user attention, the message push the first time to obtain the attention and user information, more new knowledge, service of viewing the latest hot issues. In order to improve the running speed and high concurrency of the web site, the factory design pattern is used in the whole design of the system, including interface oriented programming, dynamic proxy, automatic freely, cache, Tomcat cluster, distributed lock etc.
Key words:Q&A; community; javaweb; redis; ssm; HAHU
問(wèn)答社區(qū)至互聯(lián)網(wǎng)發(fā)展以來(lái),出現(xiàn)了各個(gè)基于B/S架構(gòu)的問(wèn)答社區(qū)[1],目前問(wèn)答社區(qū)的時(shí)代已經(jīng)過(guò)去,好多人已經(jīng)漸漸忘記問(wèn)答社區(qū),信息爆炸時(shí)代,大量的無(wú)用信息充斥在我們周圍,然而人們又很難去辨別,如當(dāng)今比較出名的知乎網(wǎng)站,就是一問(wèn)答的形式出現(xiàn),在這里面集合許許多多的知識(shí)和有用的知識(shí),讓我們可以更快更好的學(xué)習(xí)知識(shí),分享知識(shí)。當(dāng)今國(guó)內(nèi)外知名論壇有很多,大大的吸引了很多的相關(guān)技術(shù)人才,為那些知識(shí)專門作答[2]。
本網(wǎng)站的開發(fā)意義在于為了更好組織之上和聚集各個(gè)散落的知識(shí)面向技術(shù)討論的人群開所發(fā)的問(wèn)答社區(qū),目的是提高人們積極參加各個(gè)問(wèn)題的討論,提高自身知識(shí)的深度和高度,積極向身邊的人分享自己的知識(shí),也為了自己更加熟悉技術(shù)的新技術(shù)和了解其架構(gòu)原理
問(wèn)答社區(qū)依附知乎網(wǎng)站為原型,基于javaweb技術(shù),mysql數(shù)據(jù)庫(kù)tomcat,阿里云,linux等最新技術(shù)和idea進(jìn)行開發(fā)[3]。
整個(gè)架構(gòu)采用mvvc設(shè)計(jì)模式進(jìn)行編寫,平臺(tái)開發(fā)采用idea+maven集成jar包來(lái)更好地進(jìn)行管理,使用java語(yǔ)言來(lái)實(shí)現(xiàn),采用三大流行開源框架spring,springmvc,mybatis,采用redis緩存,以mysql作為數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交互[4,5]。采用tomcat8+jdk1.8作為基礎(chǔ)開發(fā)過(guò)程中主要研究的有以下幾個(gè)方面:
1)綜合運(yùn)用計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)、管理信息系統(tǒng)思想和軟件工程方法,選擇實(shí)現(xiàn)系統(tǒng)的技術(shù)方案,并確定其開發(fā)環(huán)境;
2)環(huán)境的搭建,安裝jdk,搭建Maven倉(cāng)庫(kù),配置國(guó)內(nèi)倉(cāng)庫(kù),tomcat的安裝與配置,linux上redis的安裝和啟用服務(wù);
3)spring的基本配置和基本類庫(kù)使用,整合三大框架來(lái)實(shí)現(xiàn)系統(tǒng)的解耦性;
4)對(duì)數(shù)據(jù)庫(kù)表的設(shè)計(jì),字段關(guān)聯(lián)等;
5) ssm+redis的整合,數(shù)據(jù)庫(kù)的管理,代碼自動(dòng)生成,插件的運(yùn)用,服務(wù)啟動(dòng),打包部署等;
6)前后端分離技術(shù)會(huì)話管理,最主要的是需要管理會(huì)話狀態(tài),改變以前前后端分離就無(wú)法使用session會(huì)話的狀態(tài)。
1 問(wèn)答社區(qū)模塊設(shè)計(jì)
需求分析不僅是軟件定義時(shí)期的最后一個(gè)階段,而且是軟件開發(fā)期的第一個(gè)階段,也是關(guān)系到軟件開發(fā)成敗的關(guān)鍵步驟。只有通過(guò)需求分析才能把軟件功能和性能的總體概念描述為具體的軟件需求規(guī)格說(shuō)明,從而奠定軟件開發(fā)的基礎(chǔ)。研究的對(duì)象是軟件項(xiàng)目的用戶要求,必須全面理解用戶的各項(xiàng)要求,但又不能全盤接受所有的要求。為了達(dá)到這一目的,我們必須對(duì)其中模糊的要求進(jìn)行澄清,然后才能決定是否可以采納。準(zhǔn)確地表達(dá)被接受的用戶要求,也是需求分析的另一個(gè)重要方面,只有經(jīng)過(guò)確切描述的軟件需求才能成為軟件設(shè)計(jì)的基礎(chǔ)。
1.1開發(fā)平臺(tái)的搭建
先搭建jdk環(huán)境,先下載jdk1.8,配置系統(tǒng)環(huán)境,在cmd輸入java –version出現(xiàn)jdk1.8為配置成功,下載idea 配置jdk路徑,下載tomcat免安裝版本,下載Maven 配置國(guó)內(nèi)私服,啟動(dòng)idea 在pom.xml加入依賴jar包的版本。下載redis 在linux上 解壓并裝置 啟動(dòng)即可使用Mybatis-Generator自動(dòng)生成mapper和實(shí)體類pojo,配置redis數(shù)據(jù)源:配置spring容器 整合Mybatis數(shù)據(jù)源加載mapper文件。問(wèn)答社區(qū)采用mmvc三層架構(gòu)模式體系系統(tǒng)義務(wù)流程處理如圖1所示:
1.2 用戶登錄注冊(cè)功能設(shè)計(jì)
數(shù)據(jù)庫(kù)表設(shè)計(jì)為,用戶表:username,用戶名gender,性別simple_desc一句話介紹avatar_url頭像路徑居住地industry 所在行業(yè)career職業(yè)經(jīng)歷education教育經(jīng)歷full_desc個(gè)人簡(jiǎn)介,其他衍生屬性like_count 獲得點(diǎn)贊數(shù)collect_count,獲得收藏?cái)?shù)following_count,關(guān)注了多少人,follower_count關(guān)注者多少人,scan_count個(gè)人主頁(yè)瀏覽次數(shù)create_time,注冊(cè)時(shí)間。
用戶登錄注冊(cè)流程:
①注冊(cè)-》發(fā)送郵件-》查看郵件-》激活-》數(shù)據(jù)庫(kù)更改用戶激活狀態(tài)-》注冊(cè)完成;
②登錄-》輸入郵箱和密碼-》登錄成功-》redis保存會(huì)話session并設(shè)置過(guò)期時(shí)間,登錄流程示意圖如圖2所示:
1.3 我的收藏模塊設(shè)計(jì)
用戶可以自己創(chuàng)建自己的收藏夾 每個(gè)收藏夾里包含自己收藏的話題。數(shù)據(jù)庫(kù)表設(shè)計(jì)如下表1所示:
1.4我的提問(wèn)話題模塊設(shè)計(jì)
主要是讓用戶更加能夠主動(dòng)地參與話題討論,解決自己對(duì)某些領(lǐng)域,或者問(wèn)題不懂的地方展現(xiàn)給他加,這樣可以讓用戶更好的學(xué)到自己的知識(shí),增加與別人的溝通能力。
數(shù)據(jù)庫(kù)表設(shè)計(jì)表2如下:
1.5 用戶關(guān)注話題模塊設(shè)計(jì)
Redishash散列-》存入(user_id,valuse); 需求分析問(wèn)題可以分兩種情況來(lái)看:1、看自己的關(guān)注,粉絲列表2、看別人的關(guān)注,粉絲列表看自己的關(guān)注,粉絲列表。關(guān)注與被關(guān)注圖如圖3所示:
1.6 話題搜索模塊設(shè)計(jì)
ajax請(qǐng)求-》springmvc映射到對(duì)應(yīng)的實(shí)體類Controller-》Service服務(wù)類方法中-》Mapper接口
實(shí)體類:Tocpc
服務(wù)類:topService;
Dao類:topicMapper
在mysql全文中搜索話題使用%號(hào)占位符搜索所有可能的結(jié)果
字段設(shè)計(jì)如下表3所示:
1.7 最新最熱模塊設(shè)計(jì)
最新的熱門話題,首先需要做一些限制,如果一篇文章的瀏覽人數(shù)達(dá)到100,所以文章很有趣的文章,如果有500個(gè)主題,50個(gè)問(wèn)題的有趣的文章,為了產(chǎn)生時(shí)間根據(jù)主題發(fā)布時(shí)間和當(dāng)前時(shí)間尺度的話題進(jìn)行具體計(jì)算方法:通過(guò)不斷降低的話題贊美乘以一個(gè)常數(shù),然后添加發(fā)布時(shí)間,結(jié)構(gòu)是當(dāng)前主題積分常數(shù)為432(一天的秒數(shù)除以主題數(shù)200)主題的每一個(gè)好評(píng)對(duì)分?jǐn)?shù)432。
使用散列散列存儲(chǔ)主題的各個(gè)字段。通過(guò)使用兩個(gè)有序存儲(chǔ),首先命令I(lǐng)D的話題的成員集,釋放時(shí)間得分,第二名相同的有序集合ID,并且比分是二階組合得分,不僅可以根據(jù)發(fā)表文章的順序展示的主題,并根據(jù)主題展示高分。為了防止用戶重復(fù)同一主題,我們需要記錄一個(gè)用戶列表,收集已被表?yè)P(yáng)的用戶,并將ID設(shè)置為搜索條件。
2 問(wèn)答社區(qū)系統(tǒng)實(shí)現(xiàn)
2.1 平臺(tái)的搭建
問(wèn)答社區(qū)采用ssm+redis+maven架構(gòu)來(lái)實(shí)現(xiàn),spring作為容器,springmvc作為前端管理,mybatis作為orm數(shù)據(jù)庫(kù)訪問(wèn)層。Maven作為jar包版本管理。Pojo管理實(shí)體類。Mapper管理數(shù)據(jù)源接口實(shí)現(xiàn),mapper.xml原生動(dòng)態(tài)sql的編寫。使用Mybatis-generator自動(dòng)生成pojo和Mapper。在pom.xml中添加如下spring依賴的jar包,在pom.xml中添加如下mybatis依賴的jar包,在pom.xml中添加如下mysql,redis依賴的jar包,在pom.xml添加springmvc依賴的jar包。
Redis服務(wù)安裝如下:在linux服務(wù)器中,使用Xshell5和Xft5(Xshell是對(duì)服務(wù)器遠(yuǎn)程連接操作,Xftp是對(duì)服務(wù)器上文件進(jìn)行上傳和管理操作)吧下載的zip通過(guò)命令tar –zxvf 文件名稱解壓到指定的目錄 并編譯。Make install安裝 安裝成功后 啟動(dòng)服務(wù),并通過(guò)配置文件中的daemonize yes來(lái)進(jìn)行后臺(tái)服務(wù)掛起。啟動(dòng)reids客戶端 輸入命令后進(jìn)入 redis服務(wù)啟動(dòng)成功。在spring容器中配置redis服務(wù)如下:
spring容器需要整合前端控制器,這是是為了方便控制路徑訪問(wèn),方法映射,通過(guò)注解來(lái)完成。Spring作為一個(gè)管理bean生命周期的輕量級(jí)容器,可以整合數(shù)據(jù)源的orm框架,整合前端控制器框架。整合redis。
在web項(xiàng)目中,其實(shí)很重要的是web.xml文件的配置,web.xml用來(lái)初始化操作。比如說(shuō)歡迎頁(yè),攔截器,定義資源加載路徑,加載級(jí)別,編碼格式等。在web.xml容器中聲明springmvc.xml配置文件路徑,這樣在啟動(dòng)項(xiàng)目中會(huì)根據(jù)這個(gè)路徑去加載配置文件信息。
2.2 用戶管理模塊實(shí)現(xiàn)
以用戶管理模塊為例,其注冊(cè)與登錄主頁(yè)面如圖4所示:
注冊(cè)實(shí)現(xiàn):Ajax->UserControler()->對(duì)應(yīng)方法(/register)。
Pojo類:Response(包含了請(qǐng)求響應(yīng)狀態(tài),需要返回的信息,返回的時(shí)間).
Mapper:userMapper->userMapper.xml 插入用戶信息。
Resid:設(shè)置用戶默認(rèn)關(guān)注用戶。在Redis有序結(jié)合中添加當(dāng)前用戶id,關(guān)注的人,關(guān)注的用戶id.設(shè)置用戶被關(guān)注的人:被關(guān)注的人用戶Id,被關(guān)注字段,時(shí)間,用戶id.依次內(nèi)推,增加兩個(gè)關(guān)注用戶和被關(guān)注用戶。
輸入每個(gè)字段-》提交到/register接口方法中,設(shè)置用戶默認(rèn)關(guān)注用戶后 就注冊(cè)完成,系統(tǒng)會(huì)發(fā)送一封郵件進(jìn)行賬號(hào)激活,登錄成功界面如下圖5所示:
3 結(jié)束語(yǔ)
本文所研究的內(nèi)容來(lái)自模仿知乎問(wèn)答社區(qū),目的是通過(guò)問(wèn)答社區(qū)來(lái)收集知識(shí),分類知識(shí),供人們討論,學(xué)習(xí)知識(shí)的一個(gè)場(chǎng)所。
首先,在對(duì)問(wèn)答社區(qū)業(yè)務(wù)流程進(jìn)行分析,得到了關(guān)于基于ssm框架的問(wèn)答社區(qū)系統(tǒng)的總體框架。根據(jù)知乎的流程框架和大概的需求,設(shè)計(jì)并分析了相應(yīng)模;其次,選擇技術(shù)方案,通過(guò)spring @ResponseBody來(lái)實(shí)現(xiàn)resutful風(fēng)格的統(tǒng)一接口,利用redis完成會(huì)話統(tǒng)一管理和權(quán)限識(shí)別驗(yàn)證;最后,進(jìn)行了數(shù)據(jù)庫(kù)的設(shè)計(jì),完成了整個(gè)問(wèn)題社區(qū)系統(tǒng)蛤乎的設(shè)計(jì)。
參考文獻(xiàn):
[1] 謝新洲, 黃楊. 從平臺(tái)到社區(qū)——網(wǎng)絡(luò)社區(qū)問(wèn)答的演變研究[J]. 出版科學(xué), 2018(1):14-19.
[2] 劉周穎, 趙宇翔. 基于語(yǔ)音互動(dòng)的付費(fèi)知識(shí)問(wèn)答社區(qū)運(yùn)營(yíng)模式初探——以分答和值乎為例[J]. 圖書與情報(bào), 2017(4).
[3] 呂學(xué)婷. 基于Springmvc和Mybatis框架的門戶網(wǎng)站及其內(nèi)容管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 上海:東華理工大學(xué), 2016.
[4] 趙姝菊. 基于Java Web項(xiàng)目開發(fā)之JavaBean應(yīng)用探究[J]. 電腦知識(shí)與技術(shù), 2012,8(5):1094-1097.
[5] 趙成剛, 孫培芝. 基于SpringMVC和Mybatis開發(fā)框架的設(shè)計(jì)與實(shí)現(xiàn)[J]. 當(dāng)代教育實(shí)踐與教學(xué)研究:電子刊, 2017(9).