(附源碼)Springboot寵物領(lǐng)養(yǎng)系統(tǒng)畢業(yè)設(shè)計(jì)
如今,隨著人們生活水平不斷提高,人們的生活在物質(zhì)滿(mǎn)足的基礎(chǔ)上,更多的人將生活的重點(diǎn)放在追求精神享受的過(guò)程中。于此同時(shí),Internet鋪天蓋地的普及,使得這樣的人紛紛通過(guò)Internet的方式去尋找精神的滿(mǎn)足。然而領(lǐng)養(yǎng)寵物正是人們現(xiàn)在炙手可熱的一種精神寄托。對(duì)于寵物的熱愛(ài)讓他們的生活更加充滿(mǎn)愛(ài)心和向往。Internet和領(lǐng)養(yǎng)寵物的兩者結(jié)合,大大推動(dòng)了電子商務(wù)的發(fā)展,促進(jìn)了該行業(yè)的崛起。這正是寵物領(lǐng)養(yǎng)系統(tǒng)誕生的緣由。該系統(tǒng)不僅解決了地理隔離的問(wèn)題,同時(shí)也跟上了網(wǎng)絡(luò)快速發(fā)展的腳步,實(shí)現(xiàn)愛(ài)寵人士足不出戶(hù)的領(lǐng)養(yǎng)到心儀的愛(ài)寵。
寵物領(lǐng)養(yǎng)系統(tǒng)是基于瀏覽器與服務(wù)器架構(gòu)平臺(tái),采用跨平臺(tái)的JAVA語(yǔ)言開(kāi)發(fā),利用springboot框架進(jìn)行邏輯控制,MySQL數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù),最后Tomcat服務(wù)器完成發(fā)布,系統(tǒng)可在多個(gè)環(huán)境下運(yùn)行。
關(guān)鍵詞:寵物領(lǐng)養(yǎng),Springboot框架,MySQL數(shù)據(jù)庫(kù)
系統(tǒng)分析
可行性分析
法律可行性分析
開(kāi)發(fā)軟件有沒(méi)有觸犯法律,這涉及到軟件或者系統(tǒng)能不能發(fā)布的問(wèn)題。如果觸犯了法律,就必將會(huì)受到法律的制裁。常見(jiàn)法律問(wèn)題就是軟件抄襲問(wèn)題,若是抄襲別人軟件,將會(huì)受到嚴(yán)厲懲罰。
技術(shù)可行性分析
軟件產(chǎn)業(yè)經(jīng)過(guò)多年的發(fā)展,現(xiàn)在已經(jīng)達(dá)到了很大的規(guī)模,從事軟件開(kāi)發(fā)的專(zhuān)業(yè)人員不計(jì)其數(shù),軟件產(chǎn)業(yè)的重要性已經(jīng)上升到了影響和推動(dòng)國(guó)民經(jīng)濟(jì)發(fā)展的核心地位。本系統(tǒng)基于的架構(gòu),目前技術(shù)已經(jīng)非常的成熟,是不存在技術(shù)上面難以實(shí)現(xiàn)的麻煩。
經(jīng)濟(jì)可行性分析
開(kāi)發(fā)軟件所需的時(shí)間、人力和物力成本,開(kāi)發(fā)完成后的收益如何,從投資回報(bào)的角度軟件所需功能在現(xiàn)有經(jīng)濟(jì)條件能不能實(shí)現(xiàn)等進(jìn)行深入的考慮,都符合實(shí)際的要求。所以寵物領(lǐng)養(yǎng)系統(tǒng)具有經(jīng)濟(jì)可行性和實(shí)用性,可以節(jié)約管理成本
功能需求分析
寵物領(lǐng)養(yǎng)系統(tǒng)主要是為了更加地完善寵物領(lǐng)養(yǎng)的服務(wù)情況,對(duì)用戶(hù)的信息、寵物信息、寵物領(lǐng)養(yǎng)、寵物轉(zhuǎn)讓等提供了方便的機(jī)制。本系統(tǒng)有多類(lèi)使用者,分別是管理員和用戶(hù)注冊(cè)。以下是從這兩種用戶(hù)的角度分別介紹本系統(tǒng)所要實(shí)現(xiàn)的功能。
用戶(hù):
注冊(cè):首先檢查用戶(hù)名和郵箱是否存在,如不存在即可進(jìn)行注冊(cè),并將用戶(hù)輸入的密碼進(jìn)行MD5加密,注冊(cè)成功后提示注冊(cè)成功,并將用戶(hù)信息保存到數(shù)據(jù)庫(kù)中。
登錄:使用寵物領(lǐng)養(yǎng)系統(tǒng)前是需要用戶(hù)登錄個(gè)人賬號(hào)。
寵物秀:用戶(hù)登錄寵物領(lǐng)養(yǎng)系統(tǒng)首頁(yè)時(shí),可以瀏覽系統(tǒng)發(fā)布的寵物秀信息等。
寵物領(lǐng)養(yǎng):用戶(hù)可以進(jìn)行寵物信息瀏覽,選擇自己想要領(lǐng)養(yǎng)的寵物進(jìn)行領(lǐng)養(yǎng)申請(qǐng)。
管理員:
用戶(hù)管理:對(duì)用戶(hù)進(jìn)行管理,用戶(hù)的注冊(cè),包括用戶(hù)昵稱(chēng)、用戶(hù)名、用戶(hù)的寵物信息(寵物類(lèi)別、寵物性別、年齡等)用戶(hù)的賬號(hào)信息:
寵物秀管理:對(duì)寵物秀信息進(jìn)行發(fā)布管理。
寵物信息管理:對(duì)寵物信息進(jìn)行維護(hù)管理。
領(lǐng)養(yǎng)管理:對(duì)領(lǐng)養(yǎng)信息進(jìn)行維護(hù)管理。
寵物轉(zhuǎn)讓管理:對(duì)寵物轉(zhuǎn)信息進(jìn)行維護(hù)管理。
非功能需求分析
系統(tǒng)非功能需求有非常多,比如性能需求、可承載最大用戶(hù)數(shù)、穩(wěn)定性、易用性需求等。本系統(tǒng)分析時(shí)考慮到易用性需求,因?yàn)橄到y(tǒng)是給人使用的,所以必須充分從用戶(hù)的角度出發(fā),考慮用戶(hù)體驗(yàn),使系統(tǒng)易理解易上手易操作。
用例分析
1.普通用戶(hù)主要使用系統(tǒng)進(jìn)行寵物領(lǐng)養(yǎng)以及寵物轉(zhuǎn)讓?zhuān)聢D所示為普通用戶(hù)的用例? ? ? ? ? ? ? ?

圖3-1 普通用戶(hù)用例圖
2.管理員主要負(fù)責(zé)用戶(hù)管理、寵物信息管理、寵物領(lǐng)養(yǎng)管理、寵物轉(zhuǎn)讓管理,下圖所示描述管理員的用例圖。

圖3-2 管理員用例圖
業(yè)務(wù)流程分析
系統(tǒng)業(yè)務(wù)流程圖如下所示。

圖3-3 系統(tǒng)業(yè)務(wù)流程圖
業(yè)務(wù)流程圖(TFD)通過(guò)一些特定的符號(hào)描述業(yè)務(wù)的處理過(guò)程,它重點(diǎn)強(qiáng)調(diào)業(yè)務(wù)過(guò)程中每一項(xiàng)處理活動(dòng)和具體業(yè)務(wù)部門(mén)的關(guān)系,選擇部分模塊進(jìn)行具體描述。重點(diǎn)對(duì)本系統(tǒng)整體業(yè)務(wù)中最為主要的寵物交易及訂單業(yè)務(wù)進(jìn)行描述,用戶(hù)進(jìn)入寵物領(lǐng)養(yǎng)系統(tǒng)后進(jìn)行各種模塊信息的瀏覽,另外,管理人員進(jìn)入后端管理,以執(zhí)行寵物領(lǐng)養(yǎng)模塊的相關(guān)管理方法,并在解決后向客戶(hù)提供反饋機(jī)制。
數(shù)據(jù)流程分析
如下為系統(tǒng)的頂層數(shù)據(jù)流圖,外部實(shí)體有用戶(hù)和管理員,分別對(duì)系統(tǒng)輸入數(shù)據(jù),從而得到要輸出的數(shù)據(jù)。

圖3-4系統(tǒng)頂層數(shù)據(jù)流圖
如下圖所示為系統(tǒng)底層數(shù)據(jù)流圖。

圖3-5系統(tǒng)底層數(shù)據(jù)流圖
寵物領(lǐng)養(yǎng)系統(tǒng)底層數(shù)據(jù)流圖主要描述系統(tǒng)底層模塊的數(shù)據(jù)流、數(shù)據(jù)載體、數(shù)據(jù)處理、外部實(shí)體的具體交互。本系統(tǒng)就是管理員和普通用戶(hù)在用戶(hù)管理、寵物信息、寵物領(lǐng)養(yǎng)、寵物轉(zhuǎn)讓管理等模塊上的數(shù)據(jù)交互。
系統(tǒng)設(shè)計(jì)
系統(tǒng)架構(gòu)設(shè)計(jì)
本系統(tǒng)架構(gòu)設(shè)計(jì)主要分為可以3層,主要有Web層,業(yè)務(wù)層,Model層。其中web層還包括View層和Controller層,Model層包括元數(shù)據(jù)擴(kuò)展層和數(shù)據(jù)訪問(wèn)層。

圖4-1系統(tǒng)架構(gòu)圖
系統(tǒng)功能結(jié)構(gòu)
為了將系統(tǒng)從“做什么”落實(shí)到“怎么做”,基于系統(tǒng)設(shè)計(jì)原則,對(duì)系統(tǒng)功能進(jìn)行更適合編碼實(shí)現(xiàn)的功能劃分。根據(jù)上圖的系統(tǒng)架構(gòu)設(shè)計(jì),整理出規(guī)范的系統(tǒng)功能結(jié)構(gòu)圖,為系統(tǒng)的實(shí)現(xiàn)編碼做好準(zhǔn)備。
如下圖所示為系統(tǒng)功能結(jié)構(gòu)圖。


圖4-2系統(tǒng)功能結(jié)構(gòu)圖
功能模塊設(shè)計(jì)
用戶(hù)管理針對(duì)所有用戶(hù)和管理員。未注冊(cè)用戶(hù)點(diǎn)擊注冊(cè),進(jìn)入注冊(cè)頁(yè)面填寫(xiě)新用戶(hù)信息,得到自定義生成賬號(hào)后,注冊(cè)完成。未注冊(cè)用戶(hù)注冊(cè)的活動(dòng)圖如下圖所示。

圖4-3未注冊(cè)用戶(hù)注冊(cè)活動(dòng)圖
用戶(hù)可進(jìn)行登錄使用更多功能,首先進(jìn)入用戶(hù)登錄界面,輸入用戶(hù)賬號(hào)和密碼,后臺(tái)對(duì)賬號(hào)和密碼信息進(jìn)行核對(duì)驗(yàn)證,驗(yàn)證成功則頁(yè)面直接顯示登錄用戶(hù)昵稱(chēng)代表登錄成功,否則返回用戶(hù)登錄界面。用戶(hù)登錄活動(dòng)圖如下圖。

圖4-4用戶(hù)登錄活動(dòng)圖
用戶(hù)登錄后,進(jìn)入功能頁(yè)面,進(jìn)行寵物秀瀏覽,寵物信息搜索、寵物領(lǐng)養(yǎng)、寵物轉(zhuǎn)讓。用戶(hù)使用功能活動(dòng)圖如下圖所示。

圖4-5用戶(hù)使用功能活動(dòng)圖
用戶(hù)功能界面可對(duì)自己的密碼進(jìn)行修改。進(jìn)入修改密碼界面后核對(duì)當(dāng)前密碼,核對(duì)成功后填寫(xiě)新密碼。修改密碼活動(dòng)圖如下圖所示。

圖4-6修改密碼活動(dòng)圖
數(shù)據(jù)庫(kù)設(shè)計(jì)
寵物領(lǐng)養(yǎng)系統(tǒng)采用的數(shù)據(jù)庫(kù)是MySQL,該部分將根據(jù)系統(tǒng)需求和設(shè)計(jì),設(shè)計(jì)合理的數(shù)據(jù)庫(kù)。本系統(tǒng)考慮到之后系統(tǒng)的擴(kuò)展集群,數(shù)據(jù)庫(kù)將不使用外鍵。此外,不用外鍵時(shí)數(shù)據(jù)管理也較為簡(jiǎn)單,操作更加方便,性能更高。
E-R圖
E-R圖,更加直觀的告訴開(kāi)發(fā)人員系統(tǒng)的各個(gè)數(shù)據(jù)的屬性,各個(gè)數(shù)據(jù)之間的聯(lián)系,各個(gè)數(shù)據(jù)的類(lèi)型。能通過(guò)該模型更直觀地了解數(shù)據(jù)庫(kù)的設(shè)計(jì),并根據(jù)對(duì)其逐漸改善。
本系統(tǒng)圖設(shè)計(jì),如下圖所示。

圖4-7系統(tǒng)E-R圖
表結(jié)構(gòu)設(shè)計(jì)
本系統(tǒng)根據(jù)第三范式的思想設(shè)計(jì)數(shù)據(jù)庫(kù),減少最大程度的冗余,總共建立有多個(gè)表,用戶(hù)注冊(cè)表、管理員表、寵物信息表、寵物領(lǐng)養(yǎng)表、寵物轉(zhuǎn)讓表、寵物秀表等。
表結(jié)構(gòu)如下所示。






系統(tǒng)實(shí)現(xiàn)
開(kāi)發(fā)工具
系統(tǒng)中應(yīng)用的開(kāi)發(fā)工具總結(jié)如下表所示。
表5-1開(kāi)發(fā)工具

注冊(cè)模塊
未注冊(cè)用戶(hù)在用戶(hù)注冊(cè)界面uerRegister.jsp,輸入新用戶(hù)信息,點(diǎn)擊注冊(cè)后,新用戶(hù)信息由界面?zhèn)魅肟刂茖觰serAction,調(diào)用addUser(user)方法,通過(guò)userDAOImp向數(shù)據(jù)庫(kù)用戶(hù)表插入用戶(hù)信息,由于用戶(hù)賬號(hào)是自動(dòng)生成的,若成功則反饋?zhàn)?cè)成功,并提示新用戶(hù)的用戶(hù)賬號(hào);若失敗則回到登錄界面,并顯示登錄失敗。
注冊(cè)界面如下所示。

圖5-1注冊(cè)界面
用戶(hù)注冊(cè)關(guān)鍵代碼如下所示。
/**
? ? ?* 注冊(cè)
? ? ?* @param user
? ? ?* @return
? ? ?*/
? ? @PostMapping("register")
? ? public Map<String, Object> signUp(@RequestBody User user) {
? ? ? ? // 查詢(xún)用戶(hù)
? ? ? ? Map<String, String> query = new HashMap<>();
? ? ? ? query.put("username",user.getUsername());
? ? ? ? List list = service.select(query, new HashMap<>()).getResultList();
? ? ? ? if (list.size()>0){
? ? ? ? ? ? return error(30000, "用戶(hù)已存在");
? ? ? ? }
? ? ? ? user.setUserId(null);
? ? ? ? user.setPassword(service.encryption(user.getPassword()));
? ? ? ? service.save(user);
? ? ? ? return success(1);
}
/**
? ? ?* 用戶(hù)ID:[0,8388607]用戶(hù)獲取其他與用戶(hù)相關(guān)的數(shù)據(jù)
? ? ?*/
? ? @Id
? ? @GeneratedValue(strategy = GenerationType.IDENTITY)
? ? @Column(name = "user_id")
? ? private Integer userId;
? ? /**
? ? ?* 賬戶(hù)狀態(tài):[0,10](1可用|2異常|3已凍結(jié)|4已注銷(xiāo))
? ? ?*/
? ? @Basic
? ? @Column(name = "state")
? ? private Integer state;
? ? /**
? ? ?* 所在用戶(hù)組:[0,32767]決定用戶(hù)身份和權(quán)限
? ? ?*/
? ? @Basic
? ? @Column(name = "user_group")
? ? private String userGroup;
? ? /**
? ? ?* 上次登錄時(shí)間:
? ? ?*/
? ? @Basic
? ? @Column(name = "login_time")
? ? private Timestamp loginTime;
? ? /**
? ? ?* 手機(jī)號(hào)碼:[0,11]用戶(hù)的手機(jī)號(hào)碼,用于找回密碼時(shí)或登錄時(shí)
? ? ?*/
? ? @Basic
? ? @Column(name = "phone")
? ? private String phone;
? ? /**
? ? ?* 手機(jī)認(rèn)證:[0,1](0未認(rèn)證|1審核中|2已認(rèn)證)
? ? ?*/
? ? @Basic
? ? @Column(name = "phone_state")
? ? private Integer phoneState;
? ? /**
? ? ?* 用戶(hù)名:[0,16]用戶(hù)登錄時(shí)所用的賬戶(hù)名稱(chēng)
? ? ?*/
? ? @Basic
? ? @Column(name = "username")
? ? private String username;
? ? /**
? ? ?* 昵稱(chēng):[0,16]
? ? ?*/
? ? @Basic
? ? @Column(name = "nickname")
? ? private String nickname;
? ? /**
? ? ?* 密碼:[0,32]用戶(hù)登錄所需的密碼,由6-16位數(shù)字或英文組成
? ? ?*/
? ? @Basic
? ? @Column(name = "password")
? ? private String password;
? ? /**
? ? ?* 郵箱:[0,64]用戶(hù)的郵箱,用于找回密碼時(shí)或登錄時(shí)
? ? ?*/
? ? @Basic
? ? @Column(name = "email")
? ? private String email;
? ? /**
? ? ?* 郵箱認(rèn)證:[0,1](0未認(rèn)證|1審核中|2已認(rèn)證)
? ? ?*/
? ? @Basic
? ? @Column(name = "email_state")
? ? private Integer emailState;
? ? /**
? ? ?* 頭像地址:[0,255]
? ? ?*/
? ? @Basic
? ? @Column(name = "avatar")
? ? private String avatar;
? ? /**
? ? ?* 創(chuàng)建時(shí)間:
? ? ?*/
? ? @Basic
? ? @Column(name = "create_time")
? ? @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
? ? private Timestamp createTime;
? ? @Basic
? ? @Transient
? ? private String code;
}
登錄/注銷(xiāo)模塊
用戶(hù)在首頁(yè)點(diǎn)擊登錄,進(jìn)入用戶(hù)登錄界面uerLogin.jsp,輸入用戶(hù)賬號(hào)和密碼,點(diǎn)擊登錄,用戶(hù)賬號(hào)和密碼信息由界面?zhèn)魅肟刂茖觰serAction,調(diào)用userLogin(user)方法,通過(guò)userDAOImp向數(shù)據(jù)庫(kù)用戶(hù)表搜索該用戶(hù)賬號(hào)與密碼,將最終結(jié)果反饋到前端。若成功則回到首頁(yè);用戶(hù)成功登錄,若失敗則回到登錄界面,并顯示登錄失敗。
用戶(hù)點(diǎn)擊注銷(xiāo),清空瀏覽器session值,然后返回登錄頁(yè)或者首頁(yè)。
登錄界面如下所示。

圖5-2登錄界面
登錄界面關(guān)鍵代碼如下所示。
/**
? ? ?* 登錄
? ? ?* @param data
? ? ?* @param httpServletRequest
? ? ?* @return
? ? ?*/
? ? @PostMapping("login")
? ? public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
? ? ? ? log.info("[執(zhí)行登錄接口]");
? ? ? ? String username = data.get("username");
? ? ? ? String email = data.get("email");
? ? ? ? String phone = data.get("phone");
? ? ? ? String password = data.get("password");
? ? ? ? List resultList = null;
? ? ? ? Map<String, String> map = new HashMap<>();
? ? ? ? if(username != null && "".equals(username) == false){
? ? ? ? ? ? map.put("username", username);
? ? ? ? ? ? resultList = service.select(map, new HashMap<>()).getResultList();
? ? ? ? }
? ? ? ? else if(email != null && "".equals(email) == false){
? ? ? ? ? ? map.put("email", email);
? ? ? ? ? ? resultList = service.select(map, new HashMap<>()).getResultList();
? ? ? ? }
? ? ? ? else if(phone != null && "".equals(phone) == false){
? ? ? ? ? ? map.put("phone", phone);
? ? ? ? ? ? resultList = service.select(map, new HashMap<>()).getResultList();
? ? ? ? }else{
? ? ? ? ? ? return error(30000, "賬號(hào)或密碼不能為空");
? ? ? ? }
? ? ? ? if (resultList == null || password == null) {
? ? ? ? ? ? return error(30000, "賬號(hào)或密碼不能為空");
? ? ? ? }
? ? ? ? //判斷是否有這個(gè)用戶(hù)
? ? ? ? if (resultList.size()<=0){
? ? ? ? ? ? return error(30000,"用戶(hù)不存在");
? ? ? ? }
? ? ? ? User byUsername = (User) resultList.get(0);
? ? ? ? Map<String, String> groupMap = new HashMap<>();
? ? ? ? groupMap.put("name",byUsername.getUserGroup());
? ? ? ? List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
? ? ? ? if (groupList.size()<1){
? ? ? ? ? ? return error(30000,"用戶(hù)組不存在");
? ? ? ? }
? ? ? ? UserGroup userGroup = (UserGroup) groupList.get(0);
? ? ? ? //查詢(xún)用戶(hù)審核狀態(tài)
? ? ? ? if (!StringUtils.isEmpty(userGroup.getSourceTable())){
? ? ? ? ? ? String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
? ? ? ? ? ? String res = String.valueOf(service.runCountSql(sql).getSingleResult());
? ? ? ? ? ? if (res==null){
? ? ? ? ? ? ? ? return error(30000,"用戶(hù)不存在");
? ? ? ? ? ? }
? ? ? ? ? ? if (!res.equals("已通過(guò)")){
? ? ? ? ? ? ? ? return error(30000,"該用戶(hù)審核未通過(guò)");
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //查詢(xún)用戶(hù)狀態(tài)
? ? ? ? if (byUsername.getState()!=1){
? ? ? ? ? ? return error(30000,"用戶(hù)非可用狀態(tài),不能登錄");
? ? ? ? }
? ? ? ? String md5password = service.encryption(password);
? ? ? ? if (byUsername.getPassword().equals(md5password)) {
? ? ? ? ? ? // 存儲(chǔ)Token到數(shù)據(jù)庫(kù)
? ? ? ? ? ? AccessToken accessToken = new AccessToken();
? ? ? ? ? ? accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
? ? ? ? ? ? accessToken.setUser_id(byUsername.getUserId());
? ? ? ? ? ? tokenService.save(accessToken);
? ? ? ? ? ? // 返回用戶(hù)信息
? ? ? ? ? ? JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
? ? ? ? ? ? user.put("token", accessToken.getToken());
? ? ? ? ? ? JSONObject ret = new JSONObject();
? ? ? ? ? ? ret.put("obj",user);
? ? ? ? ? ? return success(ret);
? ? ? ? } else {
? ? ? ? ? ? return error(30000, "賬號(hào)或密碼不正確");
? ? ? ? }
}
用戶(hù)模塊
個(gè)人資料模塊
登錄用戶(hù)在首頁(yè)點(diǎn)擊進(jìn)入用戶(hù)中心userCenter.jsp,再點(diǎn)擊修改個(gè)人信息按鈕進(jìn)入userChangeInfo.jsp界面,系統(tǒng)根據(jù)session中存儲(chǔ)的目前登錄的用戶(hù)的賬號(hào),向控制層userAction發(fā)送請(qǐng)求,搜索當(dāng)前用戶(hù)信息,userAction向userDAOImp調(diào)用queryByUserId(user),向數(shù)據(jù)庫(kù)的用戶(hù)表搜索當(dāng)前用戶(hù)信息并將用戶(hù)信息以對(duì)象的形式層層返回到userChangeInfo.jsp界面,顯示出當(dāng)前用戶(hù)的個(gè)人信息。
若用戶(hù)要對(duì)個(gè)人信息進(jìn)行修改,則通過(guò)修改當(dāng)前信息之后點(diǎn)擊確認(rèn),向控制層userAction發(fā)送更改后的用戶(hù)信息,調(diào)用changeUser(user)方法,通過(guò)userDAOImp向數(shù)據(jù)庫(kù)用戶(hù)表更新用戶(hù)信息,若成功則反饋?zhàn)?cè)成功,則返回的userChangeInfo.jsp界面被更改成功;若失敗則顯示修改失敗。
寵物秀模塊
用戶(hù)在登錄狀態(tài)下瀏覽寵物秀時(shí),點(diǎn)擊加入寵物秀信息后前臺(tái)發(fā)起請(qǐng)求,將對(duì)應(yīng)的寵物shuliang、id參數(shù)信息從前臺(tái)傳遞GoumaiController類(lèi)里,匹配到add()方法,add()方法調(diào)用GoumaiServiceImpl類(lèi)的add()方法。
寵物秀界面如下所示。

圖5-3寵物秀界面
寵物領(lǐng)養(yǎng)模塊
用戶(hù)在登錄狀態(tài)下點(diǎn)擊寵物領(lǐng)養(yǎng)頁(yè)面可將進(jìn)行寵物領(lǐng)養(yǎng)申請(qǐng)?zhí)峤?,從session中取出該寵物領(lǐng)養(yǎng)的信息,點(diǎn)擊加入寵物領(lǐng)養(yǎng),發(fā)起請(qǐng)求,將對(duì)應(yīng)的寵物領(lǐng)養(yǎng)信息shichang、id參數(shù)信息從前臺(tái)傳遞XiadanController類(lèi)里,匹配到add()方法,add()方法調(diào)用XiadanServiceImpl類(lèi)的add()方法。
寵物領(lǐng)養(yǎng)信息界面如下所示。

圖5-4寵物領(lǐng)養(yǎng)界面
管理員模塊
密碼修改模塊
管理員選擇個(gè)人中心的修改本人密碼。通過(guò)密碼框輸入現(xiàn)密碼和2次新密碼,如果現(xiàn)密碼錯(cuò)誤,則提示修改失敗。如果2次新密碼不一致,則提示修改失敗。都沒(méi)問(wèn)題的話,系統(tǒng)提示修改成功,并返回登錄界面。
公告欄管理界面圖如下所示。

圖5-5公告欄管理界面
用戶(hù)信息界面如下所示。

圖5-6用戶(hù)信息界面
寵物秀管理模塊
根據(jù)需求,需要對(duì)寵物秀進(jìn)行添加、刪除或修改詳情信息。刪除或修改寵物秀時(shí),系統(tǒng)根據(jù)寵物秀的狀態(tài)判定為可刪除狀態(tài)下,才會(huì)給出刪除和修改鏈接,點(diǎn)擊刪除鏈接按鈕時(shí),請(qǐng)求到達(dá)后臺(tái),還會(huì)先查詢(xún)寵物秀狀態(tài)再次做出判定能否刪除。點(diǎn)擊修改鏈接按鈕時(shí),會(huì)跳轉(zhuǎn)到修改信息的頁(yè)面,重新填寫(xiě)好數(shù)據(jù)后,數(shù)據(jù)提交到后臺(tái)會(huì)對(duì)數(shù)據(jù)庫(kù)中相應(yīng)的記錄做出修改。
添加寵物秀時(shí),會(huì)給出數(shù)據(jù)填寫(xiě)的頁(yè)面,該頁(yè)面根據(jù)填寫(xiě)好的寵物秀編號(hào)同樣會(huì)事先發(fā)送Ajax請(qǐng)求查詢(xún)編號(hào)是否已存在,數(shù)據(jù)填寫(xiě)好之后提交到后臺(tái),會(huì)調(diào)用相關(guān)服務(wù)在數(shù)據(jù)庫(kù)中插入記錄。
寵物秀頁(yè)面設(shè)計(jì)效果如下圖所示。

