SSM垃圾分类小助手毕业设计-附源码191356
摘?要
隨著現在網絡的快速發展,網絡的應用在各行各業當中它很快融入到了許多分類管理之中,他們利用網絡來做這個垃圾分類小助手,隨之就產生了“湖師校園垃圾分類管理”,這樣就讓垃圾分類小助手更加方便簡單。
對于本垃圾分類小助手的設計來說,通過科學的管理方式、便捷的服務提高了工作效率,減少了數據存儲上的錯誤和遺漏。教材管理系統使用Java語言,采用基于 MVVM模式的SSM技術進行開發,使用 Eclipse 2017 CI 10 編譯器編寫,數據方面主要采用的是微軟的MySQL關系型數據庫來作為數據存儲媒介,配合前臺HTML+CSS 技術完成系統的開發。具體根據垃圾分類小助手的現狀來進行開發的,具體根據用戶需求實現垃圾分類小助手網絡化的管理,各類信息有序地進行存儲,實現功能:首頁、站點管理(輪播圖、公告欄)用戶管理(管理員、用戶注冊)內容管理(環保資訊、新聞分類列表、垃圾分類小測試)更多管理(垃圾信息、商城兌換、兌換記錄、分類信息、我的積分)等功能。
本論文主要講述了垃圾分類小助手開發背景,該系統它主要是對需求分析和功能需求做了介紹,并且對系統做了詳細的測試和總結。具體從業務流程、數據庫設計和系統結構等多方面的問題。望能利用先進的計算機技術和網絡技術來改變目前的垃圾分類小助手管理狀況,提高管理效率。
關鍵詞:垃圾分類小助手;Java語言;?
SSM garbage sorting assistant
Abstract
With the rapid development of the network, the application of the network is in all walks of life. It quickly integrates into many classification management. They use the network to do this little assistant of garbage classification, and then there is "Hushi campus garbage classification management", which makes the little assistant of garbage classification more convenient and simple.
For the design of this garbage classification assistant, through scientific management and convenient service, the work efficiency is improved and the errors and omissions in data storage are reduced. The textbook management system uses Java language, adopts SSM technology based on MVVM mode for development, and is written with eclipse 2017 CI 10 compiler. In terms of data, it mainly uses Microsoft's MySQL relational database as the data storage medium, and cooperates with the foreground HTML + CSS technology to complete the development of the system. Specifically, it is developed according to the current situation of the garbage classification assistant. Specifically, the network management of the garbage classification assistant is realized according to the needs of users, and all kinds of information are stored orderly to realize the functions: home page Site management (rotation chart, bulletin board), user management (administrator, user registration), content management (environmental protection information, news classification list, garbage classification test) more management (garbage information, mall exchange, exchange records, classification information, my points) and other functions.
This paper mainly describes the development background of garbage classification assistant. The system mainly introduces the requirements analysis and functional requirements, and makes a detailed test and summary of the system. From the aspects of business process, database design and system structure. It is hoped that the advanced computer technology and network technology can be used to change the current management status of garbage classification assistant and improve the management efficiency.
Key words:?Garbage sorting assistant; Java language;
目 ?錄
第1章?緒論
1.1?研究背景與意義
1.2?開發現狀
1.3?主要工作及論文結構
第2章 相關技術介紹
2.1微信開發者工具
2.2小程序框架以及目錄結構介紹
2.3?B/S結構
2.4?Mysql數據庫
2.5?SSM框架
2.5 SSM框架各層關系
第3章 系統分析
3.1?可行性分析
3.1.1?技術可行性
3.1.2?經濟可行性
3.1.3?社會可行性
3.2系統功能分析和描述
3.3性能分析 6
3.4系統操作流程 7
3.4.1添加信息流程 7
3.4.2操作流程 7
3.4.3刪除信息流程 8
第4章 系統設計
4.1系統架構設計
4.2開發流程設計
4.3數據庫設計
4..3.1實體ER圖 13
4.3.2數據表 14
第5章?系統實現
5.1?數據庫連接模塊的實現
5.2?登錄模塊的實現 16
5.3注冊模塊的實現
5.4環保資訊模塊的實現 23
5.5兌換記錄模塊的實現 24
5.6商城兌換模塊的實現 26
5.7垃圾信息管理模塊的實現 28
5.8我的積分管理模塊的實現 30
第6章?系統測試 31
6.1?測試環境 31
6.2?測試目標
6.3?功能測試 31
6.4?測試結果 32
第7章?總結與展望 34
參考文獻 35
致謝 37
網絡的快速發展從根本上更改了世界各組織的管理方式,自二十世紀九十年代開始,我國的政府、企事業等學校就設想可以通過互聯網系統來進行管理信息。由于以前存在各方面的原因,比如網絡普及度低、用戶不接受、互聯網的相關法律法規也不夠完善、開發技術也不夠成熟等,阻礙了互聯網在各大機構中的發展速度。進入二十一世紀以后,我國經濟有了快速的發展,限制機構管理的各個難題逐一被解決,國內各大機構都加入到了電子信息化的管理模式中來。
以往的垃圾分類相關信息管理,都是工作人員手工統計。這種方式不但時效性低,而且需要查找和變更的時候很不方便。隨著科學的進步,技術的成熟,計算機信息化也日新月異的發展,社會也已經深刻的認識,計算機功能非常的強大,計算機已經進入了人類社會發展的各個領域,并且發揮著十分重要的作用。本系統利用網絡溝通、計算機信息存儲管理,有著與傳統的方式所無法替代的優點。比如計算檢索速度特別快、可靠性特別高、存儲容量特別大、保密性特別好、可保存時間特別長、成本特別低等。在工作效率上,能夠得到極大地提高,延伸至服務水平也會有好的收獲,有了網絡,垃圾分類小助手的各方面的管理更加科學和系統,更加規范和簡便。
隨著綠色設計,可持續設計的發展,節約資源,保護環境成為了時代的主題,而有效的垃圾分類回收正是實現節約資源保護環境的途徑之一,垃圾分類回收處理系統顯得日益重要起來,現在全國截至2014年7月9日,全國高等學校(不含獨立學院)共計2542所,其中:普通高等學校2246所(包括民辦普通高校444所)﹔成人高等學校296所〈包括民辦成人高校1所)。通過網上的一些調研發現很多的社區垃圾分類與回收系統做的并不好。只有很少的社區有一定程度的垃圾分類與回收,整個系統也是相當的混亂。
一些發達國家,網絡發展比較快,已經很大程度上完成了從人工到計算機管理的轉變。我國計算機應用起步比較晚,而且發展區域不平衡,還有很多地區或學校使用傳統的方式進行管理,但是目前計算機發展較快,包括網絡也已經普及,很多學校和用戶也開始慢慢接觸網絡管理系統。縱觀這些系統主要有以下幾個特點:
(1)先進性:實現網絡化管理。
(2)通用性:同一行業基本都能使用。
(3)方便性:通過網絡就能完成管理工作。
(4)及時性:信息更新及時。
(5)可擴展性:可根據需要進行模塊的增加。
(6)安全性:對企業、用戶等信息進行加密。
截至如今,互聯網已經深入人們的生活,智能手機、筆記本電腦等已經是人們獲取信息的主要工具,這是一個溝通無限的時代,因此,利用網絡來進行校園垃圾分類管理系統的管理也成為大勢所趨。
本文的主要工作是研究如何將計算機和信息管理進行有機結合,從而利用Java語言以及Mysql數據庫技術在Dreamweaver中實現了系統的功能模塊,切實的開發出一套貼近垃圾分類小助手的實際,有效管理垃圾分類小助手。
論文結構如下:
第一章緒論:主要對垃圾分類小助手?的開發背景,研究現狀,目的,及意義進行了分析。
第二章開發技術及軟件:主要把系統開發工具進行介紹,另外講解開發系統所用到的一些特殊功能技術。
第三章系統分析:主要是對垃圾分類小助手進行需求分析,以及對其數據流程與功能進行分析。
第四章系統設計:主要根據系統需求對系統的設計進行介紹,以及對數據的開發與功能模塊設計的過程。
第五章系統實現:本章主要結合系統界面截圖,介紹了系統各個功能實現的結果。
第六章系統測試:本章系統進行功能模塊的測試,撰寫測試用例,確保系統各大功能準確無誤。
第七章總結與展望:對整個論文的研究內容進行總結,概括整個論文的特點,指出不足之處,為下步深究指明方向。
微信開發者工具現在已經被小程序開發團隊開發運行,目前微信開發者工具任然在不斷的完善中,在開發小程序時經常要不斷的更新。可以使用微信掃碼登陸開發者工具,開發者工具將使用這個微信帳號的信息進行小程序的開發和調試。
機型選擇:小程序以智能手機的屏幕尺寸為設計標準,進行切圖。
預覽界面:寫好視圖布局后點擊編譯,用來刷新視圖界面。
控制臺:方便調試打印輸出信息。
上傳代碼:上傳到騰訊服務器,提交審核必經步驟。上傳代碼時可以填寫版本號和備注信息。
資源文件:一般可以在資源文件進行對應項目的文件目錄的斷點調試。
顯示遠程調試:手機端和PC端開發工具聯調對用戶而言是非常實用的。
本地數據存儲:顯示的是本地存儲的數據。
視圖調試:標組件以子父層級結構呈現,方便調試。
微信限制在2M 以內的代碼體積;開發中一般不校驗合法域名信息;小程序后臺要做配置服務器域名。
以上就是在開發過程中微信開發者工具常用到的功能,微信開發者工具也在不斷的完善。
整個小程序框架系統分為兩部分:邏輯層和視圖層。小程序開發框架的目標是通過盡可能簡單、高效的方式讓開發者可以在微信中開發具有原生小程序體驗的服務。小程序在視圖層與邏輯層間提供了數據傳輸和事件系統,提供了自己的視圖層以及邏輯層框架,讓開發者能夠專注于數據與邏輯。框架的核心是一個響應的數據綁定系統,可以讓數據與視圖非常簡單地保持同步。在邏輯層做數據修改,在視圖層就會做相應的更新。框架提供了一套基礎的組件,這些組件自帶微信風格的樣式以及特殊的邏輯,開發者可以通過組合基礎組件,創建出強大的微信小程序 。
Mysql 經過多次的更新,功能層面已經非常的豐富和完善了,從Mysql4版本到5版本進行了比較大的更新,在商業的實際使用中取得了很好的實際應用效果。最新版本的Mysql支持對信息的壓縮,同時還能進行加密能更好的滿足對信息安全性的需求。同時經過系統的多次更新,數據庫自身的鏡像功能也得到了很大的增強,運行的流暢度和易用性方面有了不小的進步,驅動的使用和創建也更加的高效快捷。最大的變動還是進行了空間信息的顯示優化,能更加方便的在應用地圖上進行坐標的標注和運算。強大的備份功能也保證了用戶使用的過程會更加安心,同時支持的Office特性還支持用戶的自行安裝和使用。在信息的顯示形式上也進行了不小的更新,增加了兩個非常使用的顯示區,一個是信息區,對表格和文字進行了分類處理,界面的顯示更加清爽和具體。第二是儀表的信息控件,能在儀表信息區進行信息的顯示,同時還能進行多個信息的比對,為用戶的實際使用帶來了很大的便捷。
針對本文中設計的垃圾分類小助手平臺在實際的實現過程中,最終選擇Mysql數據庫的主要原因在于在企業的應用系統應用及開發的過程中會存在大量的數據庫比較頻繁的操作,而且數據的安全性要求也是非常的高。綜合這些因素,最終選擇安全性系數比較高的Mysql來對垃圾分類小助手平臺后臺數據進行存儲操作。
數據庫管理系統的總體結構圖如下圖所示。
圖2-1 數據庫組成結構
B/S結構
B/S(Browser/Server)比前身架構更為省事的架構。它借助Web server完成數據的傳遞交流。只需要下載瀏覽器作為客戶端,那么工作就達到“瘦身”效果, 不需要考慮不停裝軟件的問題。
SSM即SpringMVVM+Spring+MySQL,這三個框架有各自最獨有的優勢,那么將它們組合在一起能夠碰撞出很強的火花。設計者在不需消耗大量功夫,能做出Web應用程序,而且這個程序還具有層次清晰、升級更新操作不影響正常使用的、允許多次使用的特點。這個復合框架形成一個有著結構完整、功能強大和結構良好的體系:SpringMVVM使各板塊分離,Spring使開發更靈活方便,讓開發者直接對對象進行操縱,各層次分工明細,并實現各個層次間的解耦,讓代碼更加的靈活精簡。這個框架使程序員能夠規避在開發時期避免個別錯誤導致整體被破壞,也能在后期應對客戶對產品提出的新需求。
DAO層、Service層這兩個層次都可以單獨開發,互相的耦合度很低,完全可以獨立進行,這樣的一種模式在開發大項目的過程中尤其有優勢。
Controller,View層因為耦合度比較高,因而要結合在一起開發,但是也可以看作一個整體獨立于前兩個層進行開發。這樣,在層與層之前只需要知道接口的定義,調用接口即可完成所需要的邏輯單元應用,一切顯得非常清晰簡單。
開發任何一個系統,都要對其可行性進行分析,對其時間和資源上的限制進行考慮,這樣可以減少系統開發的風險。同時,分析之后不僅能夠合理的運用人力,還能在各方面資源的消耗上得到節省。下面就對技術、經濟和社會三個方面來介紹。
技術可行性主要考慮當前項目所用的技術是否能夠符合,在設備上是否能夠滿足,及各種輔助工具是否提供幫助。本系統用的是Java開發語言,調試相對簡單,當前的計算機硬件配置也完全能滿足開發的需求,因此在技術上是絕對可行的。軟件方面:由于軟件的開發平臺成熟可行,它們速度快、容量大、可靠性能高、價格低,完全能滿足系統的需求。采用Java編程語言,已無技術上的問題。
系統所采用的Myeclipse開發平臺和Mysql后端數據庫均為免費開發工具。故開發成本主要集中在后期的推廣及系統維護上。相對于成本較高的C/S模式,也是選用了成本較低的B/S模式,所以經濟上幾乎沒任何問題。
本系統是自行開發的系統,以方便高效管理垃圾分類小助手為出發點,是具有實際意義的系統,開發的環境軟件和用到的數據庫也都是開源代碼,不存在侵權等問題,所以在社會方面也是可行的。
對于性能分析,與傳統的管理方式相比,傳統的管理方式是使用人工通過用紙和筆進行數據信息的統計和管理,并且這種方式對于存儲和查找某一數據信息都比較麻煩,隨著計算機網絡的到來,這種傳統的方法很難適應當下社會的發展,不僅降低人們的辦事效率,而且還需要很多的人力和物力,對于使用的時間和所要花費的費用都是比較高的,為了降低成本費用,提高用戶的工作效率,進行開發一套基于計算機和網絡技術的垃圾分類小助手 ?。
垃圾分類小助手的開發設計時一個獨立的系統,以之前數據庫進行數據的存儲開發,主要是為了實現垃圾分類小助手 ?的用戶角色及相對應的功能模塊,讓垃圾分類小助手的管理不會存在管理差異、低效率,而是跟傳統的管理信息恰好相反,垃圾分類小助手的實現可以節約資源,并且對于業務的處理速度也提高,速度快、效率高,功能性強大。
3.3系統流程分析
3.3.1添加信息流程
添加信息,編號系統使用自動編號模式,沒有用戶填寫,用戶添加信息輸入信息,系統將自動確認的信息和數據,驗證的成功是有效的信息添加到數據庫,信息無效,重新輸入信息。添加信息流程如圖3-3所示。
圖3-3 添加信息流程圖
3.3.2操作流程
用戶想進入系統,首先進入系統登錄界面,通過正確的用戶名、密碼,選擇登錄類型登錄,系統會檢查登錄信息,信息正確,然后輸入相應的功能界面,提示信息錯誤,登錄失敗。系統操作流程如圖3-4所示。
圖3-4操作流程圖
3.3.3刪除信息流程
用戶選擇要刪除的信息并單擊Delete按鈕。系統提示是否刪除信息。如果用戶想要刪除信息,系統將刪除信息。系統數據庫刪除信息。刪除信息流程圖如圖3-5所示。
圖3-5?刪除信息流程圖
系統設計
垃圾分類小助手 的系統項目的概述設計分析,主要內容有垃圾分類小助手的具體分析,進行數據庫的是設計,數據采用mysql數據庫,并且對于系統的設計采用比較人性化的操作設計,對于系統出現的錯誤信息可以及時做出處理及反饋。
基于垃圾分類小助手的設計基于現有的電腦,可以實現用戶管理、垃圾信息、商城兌換、兌換記錄、分類信息、我的積分等詳細的了解及統計分析。根據系統功能需求建立的模塊關系圖如下圖:
???????????圖4-1管理員功能模塊圖
垃圾分類小助手的開發對管理模塊和系統使用的數據庫進行分析,編寫代開發,規劃和操作是構建信息管理應用程序的必要三步曲,它決定了系統是否能夠真正實現預設功能以及是否可以在成功設計后實施。在開發過程中,每個階段必須嚴格按照線性順序進行開發,并且在相應階段生成的每個工作都可以通過技術進行驗證和檢查。確保一個階段完成后是正確的,不會造成下一階段拖拽現象,使系統完成設計功能后得到保證。
從垃圾分類小助手的成功開發經驗來看,上述方法效果最為明顯,最大程度地降低了系統開發的復雜性。如圖4-2所示。
?????????圖4-2開發系統流程圖
數據庫是信息系統的基礎和核心。數據庫設計的好壞直接影響到信息系統開發的成敗。創建數據庫表首先確定實體的屬性和實體之間的關系。根據關系創建一個數據表。
4.3.1實體ER圖
數據庫是整個軟件編程中最重要的一個步驟,對于數據庫問題主要是判定數據庫的數量和結構公式的創建。展示系統使用的是Mysql進行對數據庫進行管理,進行保證數據的安全性、穩定性等。
概念模型的設計是為了抽象真實世界的信息,并對信息世界進行建模。它是數據庫設計的強大工具。數據庫概念模型設計可以通過E-R圖描述現實世界的概念模型。系統的E-R圖顯示了系統中實體之間的鏈接。而且Mysql數據庫是自我保護能力比較強的數據庫,下圖主要是對數據庫實體的E-R圖:
(1)用戶注冊管理E-R圖,如圖4-3所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖4-3用戶注冊實體屬性圖
? ? ? ? ? ? ? ? ? ? ? ? ??
?(2)垃圾信息管理E-R圖如圖4-4所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖4-4垃圾信息管理實體圖
這些功能可以充分滿足垃圾分類小助手的需求。此系統功能較為全面如下圖系統功能結構如圖4-5所示。
??????????????????????????????圖4-5系統功能結構圖
4.3.2數據表
將數據庫概念設計的E-R圖轉換為關系數據庫。在關系數據庫中,數據關系由數據表組成,但是表的結構表現在表的字段上。
user_registration表:
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| user_registration_id | int | 11 | 是 | 是 | 用戶注冊ID |
| user_account | varchar | 64 | 是 | 否 | 用戶賬號 |
| full_name | varchar | 64 | 否 | 否 | 姓名 |
| gender | varchar | 64 | 否 | 否 | 性別 |
| age | varchar | 64 | 否 | 否 | 年齡 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| user_id | int | 11 | 是 | 否 | 用戶ID |
| create_time | datetime | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
| user_answer表: | |||||
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| user_answer_id | mediumint | 8 | 是 | 是 | |
| user_id | mediumint | 8 | 是 | 否 | 用戶ID |
| exam_id | mediumint | 8 | 是 | 否 | 考試id |
| score | double | 8 | 否 | 否 | 分數 |
| answers | varchar | 1000 | 否 | 否 | 答案 |
| score_detail | varchar | 1000 | 否 | 否 | 評分詳情 |
| objective_score | double | 8 | 否 | 否 | 客觀題得分 |
| subjective_score | double | 8 | 否 | 否 | 主觀題得分 |
| score_state | tinyint | 2 | 否 | 否 | 評分狀態 |
| nickname | varchar | 255 | 否 | 否 | 提交人 |
| create_time | timestamp | 0 | 是 | 否 | 創建時間: |
| update_time | timestamp | 0 | 是 | 否 | 更新時間: |
| spam_information表: | |||||
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| spam_information_id | int | 11 | 是 | 是 | 垃圾信息ID |
| garbage_name | varchar | 64 | 否 | 否 | 垃圾名稱 |
| garbage_type | varchar | 64 | 否 | 否 | 垃圾類型 |
| quantity_of_garbage | varchar | 64 | 否 | 否 | 垃圾數量 |
| cover | varchar | 255 | 否 | 否 | 封面 |
| remarks | text | 0 | 否 | 否 | 備注 |
| hits | int | 11 | 是 | 否 | 點擊數 |
| praise_len | int | 11 | 是 | 否 | 點贊數 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
| mall_exchange表: | |||||
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| mall_exchange_id | int | 11 | 是 | 是 | 商城兌換ID |
| commodity_number | varchar | 64 | 否 | 否 | 商品編號 |
| trade_name | varchar | 64 | 否 | 否 | 商品名稱 |
| commodity_type | varchar | 64 | 否 | 否 | 商品類型 |
| redeem_points_required | varchar | 64 | 否 | 否 | 兌換所需積分 |
| product_picture | varchar | 255 | 否 | 否 | 商品圖片 |
| merchandise_inventory | varchar | 64 | 否 | 否 | 商品庫存 |
| commodity_specifications | varchar | 64 | 否 | 否 | 商品規格 |
| hits | int | 11 | 是 | 否 | 點擊數 |
| praise_len | int | 11 | 是 | 否 | 點贊數 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
| classification_information表 | |||||
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| classification_information_id | int | 11 | 是 | 是 | 分類信息ID |
| garbage_type | varchar | 64 | 否 | 否 | 垃圾類型 |
| commodity_type | varchar | 64 | 否 | 否 | 商品類型 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
| Collect表: | |||||
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| collect_id | int | 10 | 是 | 是 | 收藏ID |
| user_id | int | 10 | 是 | 否 | 收藏人ID |
| source_table | varchar | 255 | 否 | 否 | 來源表 |
| source_field | varchar | 255 | 否 | 否 | 來源字段 |
| source_id | int | 10 | 是 | 否 | 來源ID |
| title | varchar | 255 | 否 | 否 | 標題 |
| img | varchar | 255 | 否 | 否 | 封面 |
| create_time | timestamp | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
| my_points表: | |||||
| 名稱 | 類型 | 長度 | 不是null | 主鍵 | 注釋 |
| my_points_id | int | 11 | 是 | 是 | 我的積分ID |
| integral_number | varchar | 64 | 否 | 否 | 積分編號 |
| account_points | varchar | 64 | 否 | 否 | 賬戶積分 |
| user_account | int | 11 | 否 | 否 | 用戶賬號 |
| full_name | varchar | 64 | 否 | 否 | 姓名 |
| remarks | text | 0 | 否 | 否 | 備注 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態 |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創建時間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時間 |
從web系統查詢數據的根本的查詢步驟:
Step1: 進行檢查并且過濾來自用戶的系統數據;
Step2: 成立起一個合適的數據庫進行連接;
Step3: 進行查詢系統數據庫;
Step4: 獲得查詢的結構;
Step5: 把查詢的結果展示給用戶。
Step6: 數據庫連接斷開,釋放資源。
數據庫連接原理如下圖所示。
圖5-1數據庫連接原理
數據庫連接關鍵代碼如下所示。
/**
?* 臨時訪問牌(AccessToken)表實體類
?*
?*/
@TableName("access_token")
@Data
@EqualsAndHashCode(callSuper = false)
public class AccessToken implements Serializable {
????private static final long serialVersionUID = 913269304437207500L;
????/**
?????* 臨時訪問牌ID
?????*/
????@TableId(value = "token_id", type = IdType.AUTO)
????private Integer tokenId;
????/**
?????* 臨時訪問牌
?????*/
????@TableField(value = "token")
????private String token;
????/**
?????* 最大壽命:默認2小時
?????*/
????@TableField(value = "maxage")
????private Integer maxage;
????/**
?????* 創建時間:
?????*/
????@TableField(value = "create_time")
????private Timestamp createTime;
????/**
?????* 更新時間:
?????*/
????@TableField(value = "update_time")
????private Timestamp updateTime;
????/**
?????* 用戶信息
?????*/
????@TableField(value = "user_id")
????private Integer user_id;
}
為確保系統安全性,系統操作員只有在登錄界面輸入正確的用戶名、密碼、權限以及驗證碼,單擊“登錄”按鈕后才能夠進入本系統的主界面。
用戶登錄流程圖如下所示。
????????????????????
圖5-1用戶登錄流程圖
登錄界面如下圖所示。
? ? ? ? ? ? ? ? ? ? ? ? ??
圖5-1登錄界面
登錄代碼如下:
????/**
?????* 登錄
?????* @param data
?????* @param httpServletRequest
?????* @return
?????*/
????@PostMapping("login")
????public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
????????log.info("[執行登錄接口]");
????????String username = data.get("username");
????????String email = data.get("email");
????????String phone = data.get("phone");
????????String password = data.get("password");
????????List resultList = null;
????????QueryWrapper wrapper = new QueryWrapper<User>();
????????Map<String, String> map = new HashMap<>();
????????if(username != null && "".equals(username) == false){
????????????map.put("username", username);
????????????resultList = service.selectBaseList(service.select(map, new HashMap<>()));
????????}
????????else if(email != null && "".equals(email) == false){
????????????map.put("email", email);
????????????resultList = service.selectBaseList(service.select(map, new HashMap<>()));
????????}
????????else if(phone != null && "".equals(phone) == false){
????????????map.put("phone", phone);
????????????resultList = service.selectBaseList(service.select(map, new HashMap<>()));
????????}else{
????????????return error(30000, "賬號或密碼不能為空");
????????}
????????if (resultList == null || password == null) {
????????????return error(30000, "賬號或密碼不能為空");
????????}
????????//判斷是否有這個用戶
????????if (resultList.size()<=0){
????????????return error(30000,"用戶不存在");
????????}
????????User byUsername = (User) resultList.get(0);
????????Map<String, String> groupMap = new HashMap<>();
????????groupMap.put("name",byUsername.getUserGroup());
????????List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));
????????if (groupList.size()<1){
????????????return error(30000,"用戶組不存在");
????????}
????????UserGroup userGroup = (UserGroup) groupList.get(0);
????????//查詢用戶審核狀態
????????if (!StringUtils.isEmpty(userGroup.getSourceTable())){
????????????String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());
????????????if (res==null){
????????????????return error(30000,"用戶不存在");
????????????}
????????????if (!res.equals("已通過")){
????????????????return error(30000,"該用戶審核未通過");
????????????}
????????}
????????//查詢用戶狀態
????????if (byUsername.getState()!=1){
????????????return error(30000,"用戶非可用狀態,不能登錄");
????????}
????????String md5password = service.encryption(password);
????????if (byUsername.getPassword().equals(md5password)) {
????????????// 存儲Token到數據庫
????????????AccessToken accessToken = new AccessToken();
????????????accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
????????????accessToken.setUser_id(byUsername.getUserId());
????????????tokenService.save(accessToken);
????????????// 返回用戶信息
????????????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, "賬號或密碼不正確");
????????}
}
????public String select(Map<String,String> query,Map<String,String> config){
????????StringBuffer sql = new StringBuffer("select ");
????????sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");
????????sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));
????????if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){
????????????sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");
????????}
????????if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){
????????????sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");
????????}
????????if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){
????????????int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;
????????????int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;
????????????sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);
????????}
????????log.info("[{}] - 查詢操作,sql: {}",table,sql);
????????return sql.toString();
}
????public List selectBaseList(String select) {
????????List<Map<String,Object>> mapList = baseMapper.selectBaseList(select);
????????List<E> list = new ArrayList<>();
????????for (Map<String,Object> map:mapList) {
????????????list.add(JSON.parseObject(JSON.toJSONString(map),eClass));
????????}
????????return list;
}
用戶在填寫數據的時候必須與注冊頁面上的驗證相匹配否則會注冊失敗,注冊頁面的表單驗證是通過驗證的,用戶名的長度必須在6到18之間,郵箱必須帶有@符號,密碼和密碼確認必須相同,你輸入的密碼,系統會根據你輸入密碼的強度給出指定的值,電話號碼和身份證號碼必須要求輸入格式與生活相符合,當你前臺驗證通過的時候你點擊注冊,表單會將你輸入的值通過name值傳遞給后臺并保存到數據庫中。
用戶注冊流程圖如下圖所示。
圖5-1用戶注冊流程圖
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖5-1用戶注冊界面
注冊關鍵代碼如下所示。
??/**
?????* 注冊
?????* @return
?????*/
????@PostMapping("register")
????public Map<String, Object> signUp(HttpServletRequest request) throws IOException {
????????// 查詢用戶
????????Map<String, String> query = new HashMap<>();
????????Map<String,Object> map = service.readBody(request.getReader());
????????query.put("username",String.valueOf(map.get("username")));
????????List list = service.selectBaseList(service.select(query, new HashMap<>()));
????????if (list.size()>0){
????????????return error(30000, "用戶已存在");
????????}
????????map.put("password",service.encryption(String.valueOf(map.get("password"))));
????????service.insert(map);
????????return success(1);
}
????public Map<String,Object> readBody(BufferedReader reader){
????????BufferedReader br = null;
????????StringBuilder sb = new StringBuilder("");
????????try{
????????????br = reader;
????????????String str;
????????????while ((str = br.readLine()) != null){
????????????????sb.append(str);
????????????}
????????????br.close();
????????????String json = sb.toString();
????????????return JSONObject.parseObject(json, Map.class);
????????}catch (IOException e){
????????????e.printStackTrace();
????????}finally{
????????????if (null != br){
????????????????try{
????????????????????br.close();
????????????????}catch (IOException e){
????????????????????e.printStackTrace();
????????????????}
????????????}
????????}
????????return null;
????}
????public void insert(Map<String,Object> body){
????????E entity = JSON.parseObject(JSON.toJSONString(body),eClass);
????????baseMapper.insert(entity);
????????log.info("[{}] - 插入操作:{}",entity);
}
如果環保資訊的信息需要修改,管理員可以通過查詢環保資訊數據的基本信息來查詢環保資訊,查詢環保資訊是通過ajax技術來進行查詢的,需要傳遞環保資訊的標題、編號等參數然后在返回到該頁面中,可以選中要修改或刪除的那條信息,如果選中了超過一條數據,頁面會挑一個窗口提醒只能選擇一條數,如果沒有選中數據會挑一個窗口題型必須選擇一條數據。當選擇確認修改的時候,后臺會根據傳過來的id到數據庫查詢,并將結果返回到修改頁面中,可以在修改頁面中修改剛剛選中的信息當點擊確認的時候from表單會將修改的數據提交到后臺并保存到數據庫中,就是說如果提交的數據數據庫中存在就修改,否則就保存。
環保資訊展示界面如下圖所示。
圖5-1環保資訊界面圖
環保資訊管理關鍵代碼如下所示。
@RequestMapping("/get_list")
????public Map<String, Object> getList(HttpServletRequest request) {
????????Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
????????return success(map);
????}
用戶兌換記錄頁面點開,后臺會自動生成兌換記錄列表。從session中取出該兌換信息,前臺發起請求,將對應的兌換信息、baozhangpId參數信息從前臺傳遞BaozhangController類里,匹配到create()方法,create()方法調用BaozhangServiceImpl類的createBaozhang()方法獲取數據,調用本類的getCartBaozhangItem()方法得到兌換記錄列表。
兌換記錄界面如下所示。
圖5-1兌換記錄界面
兌換記錄關鍵代碼如下:
????@RequestMapping(value = "/del")
????@Transactional
????public Map<String, Object> del(HttpServletRequest request) {
????????service.delete(service.readQuery(request), service.readConfig(request));
????????return success(1);
}
????
???????
}
商城兌換信息功能需要考慮高并發,防止出現商城重復兌換、兌換狀態顯示出錯等情況,特對兌換這一共享數據增加鎖機制。在樂觀鎖、悲觀鎖以及線程鎖中,綜合考慮性能效率和錯誤的可接受性選擇了樂觀鎖機制。樂觀鎖的實現方式是使用版本標識來確定讀到的數據與提交時的數據是否一致,提交后修改版本標識,不一致時可以采取丟棄和再次嘗試的策略。在數據庫圖書表(對應圖書實體)設計中增加了version字段,每次數據提交時(更改兌換狀態)會判斷version是否匹配,若不匹配停止本次提交,若匹配則提交成功并增加version的值。
商城兌換信息功能整體流程:用戶瀏覽商城兌換信息時,同時會顯示兌換的狀態,在用戶點擊搜索按鈕時,會先通過攔截器判斷用戶是否登錄,若未登錄,會跳轉至登錄頁面,提示用戶先登錄,若為登錄用戶就會跳轉至填寫商城兌換信息的頁面,填寫關鍵字眼之后,點擊搜索按鈕,搜索成功之后返回提示信息。
商城兌換添加流程圖如下圖所示。
圖5-1商城兌換添加流程圖
商城兌換信息展示界面如下圖所示。
圖5-1商城兌換展示界面
商城兌換信息展示關鍵代碼如下所示。
public List selectBaseList(String select) {
????????List<Map<String,Object>> mapList = baseMapper.selectBaseList(select);
????????List<E> list = new ArrayList<>();
????????for (Map<String,Object> map:mapList) {
????????????list.add(JSON.parseObject(JSON.toJSONString(map),eClass));
????????}
????????return list;
}
垃圾信息功能整體流程:用戶瀏覽垃圾信息時,同時會顯示垃圾信息書的狀態,系統會在其顯示詳細信息的頁面時便會判斷垃圾的狀態,若圖書狀態為可垃圾信息,則會顯示垃圾信息的鏈接按鈕。在用戶點擊垃圾信息按鈕時,會先通過攔截器判斷用戶是否登錄,若未登錄,會跳轉至登錄頁面,提示用戶先登錄,若為登錄用戶就會跳轉至填寫垃圾信息的頁面,填寫好垃圾信息之后,點擊提交按鈕,垃圾信息成功之后返回提示信息,告知用戶垃圾信息成功。
垃圾信息管理界面如下圖所示。
圖5-1垃圾信息管理界面圖
垃圾信息管理關鍵代碼如下所示。
???public List selectBaseList(String select) {
????????List<Map<String,Object>> mapList = baseMapper.selectBaseList(select);
????????List<E> list = new ArrayList<>();
????????for (Map<String,Object> map:mapList) {
????????????list.add(JSON.parseObject(JSON.toJSONString(map),eClass));
????????}
????????return list;
}
此頁面的關鍵是編輯我的積分,包括積分編號、賬號積分、用戶賬號、姓名、備注等。單擊提交按鈕以完成信息的添加。如果未寫入完整的我的積分,例如,如果未寫入積分編號,系統將給出相應的錯誤提示,并且無法成功輸入。數據以概念的形式以onsubmit =“return checkForm()”的形式寫入以進行檢查,checkForm()函數是一種用于寫入數據的不同類型的校對方法,是不是為空也是經過form表單中的οnsubmit=”return checkForm()來檢查。
管理員點擊左側菜單“我的積分管理”,頁面跳轉到我的積分管理外觀,調用后臺測評查詢所有我的積分。并將信息密封到數據集合List,綁定到請求對象,然后頁面跳轉到相應的界面,顯示出測評信息,單擊刪除按鈕完成我的積分的刪除。
我的積分管理流程圖如下圖所示。
圖5-1我的積分管理流程圖
我的積分管理界面如下圖所示。
圖5-1我的積分管理界面圖
我的積分管理關鍵代碼如下所示。
@RequestMapping(value = "/del")
????@Transactional
????public Map<String, Object> del(HttpServletRequest request) {
????????service.delete(service.readQuery(request), service.readConfig(request));
????????return success(1);
}
1、服務器端
操作系統:Windows 7
Web服務器:Tomcat7.0
數據庫:Mysql
開發語言:Java
2、客戶端
瀏覽器:Internet Explorer10
界面布局:DIV+CSS
分辨率:最佳效果1027*768以上像素
3、開發工具
Visual Studio Code
Myeclipse
系統測試是用于檢查軟件的質量、性能、可靠性等是否符合用戶需求。一套嚴謹的、規范的、完善的測試過程將大大提高軟件的質量、可信度、可靠性,降低軟件的出錯率,降低用戶風險系數。通過在計算機上對系統進行測試試驗并從中發現此系統中存在的問題和錯誤然后加以修改,使之更加符合用戶需求。
1.測試的目的是通過測試來發現程序在執行過程中的錯誤的過程。
2.好的測試方案是可以檢驗出還未被發現的錯誤的方案。
3.好的測試是發現了到目前為止還未被發現的錯誤的測試。
4.該系統能夠完成管理員、垃圾信息、用戶管理、我的積分、商城兌換、兌換記錄、分類信息等功能,做到所開發的系統操作簡單,盡量使系統操作不受用戶對電腦知識水平的限制。
下表是垃圾分類小助手功能的測試用例,檢測了垃圾分類小助手中對垃圾信息的增加,刪除,修改,查詢操作是否成功運行。觀察系統的響應情況,得出該功能也達到了設計目標,系統運行正確。
前置條件;管理員登錄系統。
表6-1垃圾信息管理的測試用例
| 功能描述 | 用于垃圾信息管理 | |
| 測試目的 | 檢測垃圾信息管理時的各種操作的運行情況 | |
| 測試數據以及操作 | 預期結果 | 實際結果 |
| 點擊添加垃圾信息,必填項合法輸入,點擊保存 | 提示添加成功 | 與預期結果一致 |
| 點擊添加垃圾信息,必填項輸入不合法,點擊保存 | 提示必填項不能為空 | 與預期結果一致 |
| 點擊修改垃圾信息,必填項修改為空,點擊保存 | 提示必填項不能為空 | 與預期結果一致 |
| 點擊修改垃圾信息,必填項輸入不合法,點擊保存 | 提示必填項不能為空 | 與預期結果一致 |
| 點擊刪除垃圾信息,選擇垃圾信息刪除 | 提示刪除成功 | 與預期結果一致 |
| 點擊搜索垃圾信息,輸入存在的垃圾信息名 | 查找出垃圾信息 | 與預期結果一致 |
| 點擊搜索垃圾信息 ,輸入不存在的在線投票名 | 不顯示垃圾信息 | 與預期結果一致 |
下表是兌換記錄管理功能的測試用例,檢測了兌換記錄管理的操作是否成功運行。觀察系統的響應情況,得出該功能也達到了設計目標,系統運行正確。
前置條件;管理員登錄系統。
表6-2 兌換記錄管理的測試用例
| 功能描述 | 用于兌換記錄管理 | |
| 測試目的 | 檢測兌換記錄管理時各種操作的情況 | |
| 測試數據以及操作 | 預期結果 | 實際結果 |
| 未選擇兌換記錄,點擊提交 | 提示請選擇兌換記錄 | 與預期結果一致 |
| 未上傳附件,點擊提交 | 提示請選擇附件 | 與預期結果一致 |
| 未選擇原因,點擊提交 | 提示請選擇原因 | 與預期結果一致 |
根據以上測試情況,測試結果如下表所示。
表6-1測試結果表
| 測試項目 | 測試結果 |
| 登錄測試 | 成功 |
| 修改密碼測試 | 成功 |
| 我的積分管理測試 | 成功 |
| 垃圾信息測試 | 成功 |
| 分類信息 | 成功 |
| 兌換記錄管理測試 | 成功 |
| 商城兌換測試 | 成功 |
| 用戶管理測試 | 成功 |
本研究針對垃圾分類小助手地需求建模,數據建模及過程建模分析設計并實現垃圾分類小助手的過程。給出系統應用架構并分析優劣勢,通過功能分解圖,系統組件圖描述功能需求。設計建立了數據庫,給出系統關鍵數據結構的定義。通過類關系圖描述組件間的協作關系,給出各個類的定義方法。通過描述每一個類的字段,屬性及方法實現垃圾分類小助手 ?的前后端代碼。最終給出系統集成整合方法,完成垃圾分類小助手 ?地設計與實現。
在此項目的開發中,當靜態頁面的搭建的大體已經完善時,就需要和負責后臺開發的技術開發者聯系,來接好前后臺的數據接口,可以讓后臺的信息在前臺顯示出來,在這個項目實現中,明白了前端開發和后臺在整個系統中起到了什么作用,因為前后臺的連接,用戶可以對系統進行操作,可以在輸入自己的相關信息后,通過后臺加工,完成對數據庫的查找、修改、添加,而理解了這些關系與實現的方法后。再去完善整個系統的功能就更加清晰與簡單了。此次的項目它涉及了前臺與后臺系統的搭建,在學校所學的知識基礎上,此次的項目,讓我對于一個系統的前端開發,以及后臺的作用都有了一個更深切的認知。
參考文獻
[1]周曉博. 一種微信小程序足球戰術板[P]. 江蘇省:CN114064164A,2022-02-18.
[2]郭凱倩. “樂游南寧”APP及微信小程序:引領南寧樂游新潮流[N]. 中國文化報,2022-01-25(007).
[3], 白銀區疾病預防控制中心 開發微信小程序“白銀艾檢測”. 張國琦 主編,白銀區年鑒,甘肅人民出版社,2021,270,年鑒.
[4]姚歆蕾. 基于艾賓浩斯遺忘曲線的英語詞匯學習微信小程序的設計與實現[D].云南師范大學,2021.
[5]He Xinbin,Bai Yongbin,Yue Lisen,Wang Haixiao,Liu Yi. Design and Implementation of Information System Based on Java Technology Platform[J]. Journal of Physics: Conference Series,2021,2033(1).
[6]黃麗師,熊春榮.微信小程序垃圾分類小衛士[J].電子世界,2021(09):14-15.
[7]張寶虎. 基于微信小程序的CBMS橋梁巡查工具研發與應用[C]//.中國公路學會養護與管理分會第十一屆學術年會論文集.,2021:408-414.
[8]張武竹,王得梁,楊相龍,張瑞,劉瓊玉.個人環保貢獻IP值在垃圾分類上的實踐研究[J].環境與發展,2021,33(03):224-227.
[9]Qu Xiaona. Application of Java Technology in Dynamic Web Database Technology[J]. Journal of Physics: Conference Series,2021,1744(4).
[10]張巧嶺.基于微信小程序的垃圾分類系統的設計與實現[J].電子世界,2020(21):185-186.
[11]王淑雅,王偉,李娟,諶江波,錢進. 一種基于微信小程序的垃圾分類系統[P]. 安徽省:CN111814026A,2020-10-23.
[12]徐文超,焦詩琪.基于小程序云開發的垃圾分類小助手的設計與實現[J].電子技術與軟件工程,2020(11):62-64.
[13]鄧斌權,李劍波,瞿先超.基于云開發和微信小程序的垃圾分類系統實現[J].電腦知識與技術,2020,16(07):82-84.
[14]Lei Yu,Cheng Li,Lei Wei,Hu WenYa. Marine biological monitoring and managing system based on Java technology[J]. MIPPR 2019: REMOTE SENSING IMAGE PROCESSING, GEOGRAPHIC INFORMATION SYSTEMS, AND OTHER APPLICATIONS,2020,11432.
[15]王爽.微信小程序在垃圾分類中的應用研究[J].信息與電腦(理論版),2019,31(22):66-68.
[16], 基于微信小程序人力資源咨詢與培訓平臺V1.0. 安徽省,蕭縣新生商務代理有限公司,2019-11-09.
[17]秦先普.華釜青年獎大賽落幕,“垃圾分類”策劃方案奪得金獎[J].中國廣告,2019(08):109-114.
[18]楊蓉.垃圾分類小程序爆火 支付寶微信爭奪本地生活新入口[J].計算機與網絡,2019,45(14):12-13.
[19]周芳妃,吳俊峰.“生態藍”垃圾分類微信小程序產品推廣方案研究[J].無線互聯科技,2018,15(23):41-43.
[20]周芳妃,吳俊峰.“生態藍”垃圾分類微信小程序研究[J].合作經濟與科技,2018(02):188-190.
[21]劉明洋,汪鴻俊,任小蕾. 微信小程序實戰入門[M].人民郵電出版社:, 201710.429.
致謝
在此論文完成之際,感謝我的指導老師。在指導老師的網頁設計課上,當時我學到了很多東西,這對于我實習過程中也打了一定的基礎,而且指導老師對于我的設計也提出許多建議,并予以悉心的指導,對于一些細小的問題都耐心的指導我去完善,授予我寫論文的好友,時常的鼓勵我,另外感謝教導我完善此項目的前端同學,對于這個項目,我是邊學習邊實現完成的,有許多東西開始并不是很明白,但前端開發的同學非常耐心的引導我去將這個項目完成,在系統的后端開發中,所用到的后臺開發技術也時常會給我講解,助于我更好的將論文完成,在此對幫助到我的同學和一直予以教導的指導老師致以衷心的感謝,祝事業有成。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 點贊+收藏+關注??→? 私信領取本源代碼、數據庫?
總結
以上是生活随笔為你收集整理的SSM垃圾分类小助手毕业设计-附源码191356的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用友T+标准版如何反结账,反记账
- 下一篇: 2023秋招—大数据开发面经—多益网络