著者について: フルスタック開発プロジェクト、Java、Python、フロントエンド、および小規模プログラムの開発と研究に従事し、ビッグデータ アプリケーションと開発に興味があり、
主な内容:Javaプロジェクト、フロントエンドプロジェクト、Pythonプロジェクト、小規模プログラム開発、ビッグデータプロジェクト、マイコン
お気に入り、いいね、迷わず作者フォローすると良いです
記事の最後にあるソースコードを入手してください
ご清聴ありがとうございます。忘れないようにブックマークしてください。励ましの気持ちを示したい場合、コメントして提案をしてください。愛しています
商品番号:BS-PT-087
1. 環境紹介
ロケール: Java: jdk1.8
データベース: MySQL: mysql5.7
アプリケーションサーバー: Tomcat: tomcat8.5.31
開発ツール: IDEA または eclipse
2. プロジェクト紹介
2.1 プロジェクトの背景
Ctrip、Tuniu、Mafengwoなど、市場にある既存の旅行情報プラットフォームの一部は、ユーザーのニーズの一部しか満たすことができず、大多数のユーザーに最高の体験を提供することができません。さらに、プラットフォームと地元の景勝地間のプッシュやポリシーなどの情報の更新がタイムリーではなく、ユーザーと観光の間の矛盾が解決されておらず、観光地のポリシーが変更された場合、ユーザーはそれを時間内に知ることができません最新の現地観光情報を取得するために他のプラットフォームを利用しているため、一部のユーザーが他のプラットフォームを利用して現地情報を把握していない場合、「無駄に旅行してしまう」などの現象が発生し、ユーザーの体験感が低下してしまう可能性があります。
この論文の観光情報プラットフォームシステムの設計と実装は、市場にある他の観光情報システムの長所を吸収し、また、時期尚早の情報交換、ユーザーエクスペリエンス、および双方向性の問題にも注意を払いました。不確実性、不信感、不便さなど、利用者と観光の間の矛盾を解決するために、情報の可視化、情報セキュリティ、利用者と観光の間のパーソナライズされたサービスの特性を実現し、利用者により一層の親しみやすさと快適な旅行体験をもたらします。
社会時代の発展が2022年の梯子に入り、社会全体の経済発展モデルはこれまでとは大きく変化した。新興サービス産業は国の経済発展の主な原動力の1つとなっており、サービス産業の重要なモジュールの1つとして観光もますます注目を集めています。観光業は急速に発展しました。産業規模の継続的な拡大は国の重要な発展プロジェクトとなっており、観光市場は徐々に拡大しています。市場経済の発展と国民の所得水準のさらなる向上に伴い、観光消費に対する人々の需要も増加しており、国民経済における観光の地位と役割は非常に重要です。観光業の発展は非常に重要です。
観光産業の急速な発展に伴い、さまざまな側面から情報が流入し、経営にも課題が生じており、インテリジェントな情報システムの構築が迫っています。新興 IT 産業は、情報技術産業として、情報手段と技術を使用して情報を収集、整理、保存、送信し、情報サービスを提供し、対応する情報手段、情報技術、その他のサービスを提供します。現在、IT 分野のテクノロジーは常に進歩しており、エンタープライズレベルのプロジェクト開発、マイクロサービス、ビッグデータの分野でデータに関する大きな進歩が見られます。観光産業の持続的かつ安定的な発展を促進するための最新テクノロジーの活用は今後の発展の方向性となっており、便利なデータ管理を実現するための観光情報プラットフォームの構築がトレンドとなるはずです。
2.2 機能要件の分析
バックグラウンド管理システムモジュール:フロントディスプレイ管理、ユーザー管理、管理者管理、ホテル管理、航空券管理、鉄道チケット管理、戦略アトラクション管理、注文管理、システム統計、管理者管理およびその他の機能。ユーザーフロントの管理、ユーザー情報、管理者情報、ホテル情報、航空券情報、戦略・景勝地情報、システムデータ情報、注文情報などが含まれます。
フロントエンドシステムモジュール:フロントエンドディスプレイ、ユーザーモジュール、ホテルモジュール、航空券モジュール、鉄道チケットモジュール、戦略アトラクションモジュール、注文モジュールなどを含む。主にユーザーと観光客はフロントエンドシステムにアカウントを登録でき、システムにログインし、全商品(ホテル、航空券、鉄道チケット、景勝地チケットなど)情報の閲覧、商品の購入、注文の確認などの操作を行います。会員システムモジュール: ユーザーはシステム内の注文について問い合わせたり、注文、クーポン、その他の情報を管理したりできます。
ユーザー システム モジュール: ユーザーはアカウントの登録、ログイン、パスワードやアバターなどの個人情報の変更を行うことができます。ログインしていないユーザーは、ホテル情報の照会などのシステムの一部の機能のみを利用でき、ホテルの部屋を予約することはできません。 。
注文システムモジュール: システムユーザーはこのシステムでホテル、航空券、鉄道チケット、景勝地のチケットなどを購入または予約できます。購入または予約が完了すると、対応する注文情報が表示されます。ユーザーは注文を表示または変更できます。注文を通じて、またはアカウント情報に従って情報を取得します。
シングル サインオン システム モジュール: この複数のアプリケーション システムでは、ユーザーは 1 回ログインするだけで、このプラットフォーム上のすべてのシステムにアクセスできます。
ホテル システム モジュール: ユーザーは、都市、名前、評価、場所などによる必要なホテル情報の検索を含むホテル情報を表示できます。また、ユーザーが必要なホテル情報をすばやく見つけるのに役立つホテル情報ランキングも提供します。ホテルシステムは、まずホテルを検索し、次にホテルの客室情報を検索して宿泊予約を完了します。
チケットシステムモジュール:ユーザーは日付、出発都市、目的地都市をクエリ条件としてチケット情報をクエリできます。
鉄道チケット システム モジュール: ユーザーは日付、出発都市、目的地都市をクエリ条件として鉄道チケット情報をクエリできます。
レイダーとアトラクション モジュール: このモジュールには、アトラクションのチケットの購入とレイダーの共有が含まれます。アトラクションのチケットを都市名や景勝地名であいまい検索できます。同時に、景勝地のホットリストが設定され、最近最も人気のある景勝地が表示され、ユーザーのチェックインを引き付けます。
その主な機能モジュール図を図 1 に示します。
図1 機能モジュール図
2.3 システム設計
この観光情報プラットフォームは、Spring Cloud マイクロサービス技術によって展開される Web プロジェクトに基づいており、予想される需要、開発難易度、パフォーマンス要件に応じて、階層化されたアーキテクチャ形式が採用されています。システムの具体的な階層化アーキテクチャの展開を図 2 に示します。
図2 システム配置図
システムはフロントエンドユーザーとバックエンドユーザーに分かれており、フォアグラウンドユーザーは主に一般ユーザーであり、一般ユーザーにはログインユーザーと未ログインユーザーが含まれます。ログインの有無により、ユーザーのアクセス範囲や利用できる機能が異なります。バックグラウンド ユーザーは主にバックグラウンドの保守担当者とバックグラウンドの管理者ユーザーです。図 3 と図 4 は、フロント エンドとバック エンドのユーザー アクセス スコープのリソースを示しています。
図3 観光情報プラットフォームのフロントユースケース図
図4 旅行情報プラットフォームの舞台裏
三、システム表示
3.1 フロントデスクのログインと登録の実装
ユーザーがシステムに入るとき、インターフェース上の「ログイン」をクリックしてログインインターフェースにジャンプすることができます。ユーザーが照会オーダーやオーダー作成などの機能をクリックすると、ログインしていなくてもログインインターフェースに直接ジャンプします。ログイン インターフェイスには、登録インターフェイスにジャンプするためのパスがあります。アカウント登録を実現するには、ユーザーは携帯電話番号、アカウントのパスワード、電子メールのアカウント番号などの情報を入力し、ユーザーはパスワードを2回確認する必要があり、登録するには2つのパスワードが同じです。各携帯電話番号で作成できるアカウントは 1 つだけであり、登録時に携帯電話番号が認証されます。ログインの実装では、ユーザーは携帯電話番号とパスワードを入力します。また、携帯電話番号認証を通じてログインすることも選択できます。実現された UI インターフェイスを図 3-1 および図 3-2 に示します。
図 3-1 ユーザー登録 UI 図
図 3-2 ユーザーログイン UI の図
3.2 ホテルモジュールの実現
ホテルモジュールは、ユーザーがシステムに入る最初の表示モジュールであり、ホテルモジュールのホームページには、ホテル情報検索、ホテル推薦、ホテルランキング情報プロモーションなどが備わっています。ホテル検索では、ホテル名、都市、場所などの情報に基づくファジークエリを通じて、ホテル情報リストページにジャンプしてホテル情報を表示し、同時にホテルの地図上の位置情報を表示します。ページ。おすすめのホテルをクリックしてホテルの詳細を直接入力したり、ホテル一覧の「詳細を見る」をクリックしてホテルの詳細を入力したりすることができ、ホテルの詳細にはホテルの詳しい紹介やホテルの客室情報が表示されます。このインターフェースでは、注文が完了し、ホテルの予約が完了すると、予約した部屋はロックされ、他のユーザーは部屋の情報ステータスを閲覧できなくなります。実現された UI インターフェイスを図 3-3、3-4、および 3-5 に示します。
図 3-3 ホテルのホームページの UI マップ
図 3-4 ホテルのクエリ UI インターフェイス
図 3-5 ホテルの詳細と部屋情報の UI 図
3.3 チケットモジュールの実現
ユーザーはサイドバーからチケットモジュールにジャンプします。チケット実装の上部はチケット情報の検索です。チケットのクエリ条件は目的地都市、出発地都市、出発空港、目的地空港、時刻です。 。クエリ結果が空の場合、プロンプトがポップアップ表示され、クエリされた情報を時間と価格で並べ替えることができます。実現された UI インターフェイスは図 5-6 に示されています。
図 3-6 チケット情報の UI 図
3.4 乗車券モジュールの実現
ユーザーはサイドバーから鉄道チケットモジュールに入ることができます。鉄道チケットの検索では、時刻、都市、列車の種類(高速鉄道、新幹線、電車など)をクエリ条件として提供します。ユーザーは鉄道チケットを直接入力して作成できます。列車一覧画面の切符購入ボタンより注文。場所が変更されると、出発地と目的地に関するポリシーの内容がページにポップアップ表示され、ユーザーに通知されます。ユーザーは、チケットリストから「チケットを購入」をクリックすることで、注文を作成する機能に直接入ることができます。実現された UI インターフェイスを図 3-7 および図 3-8 に示します。
図 3-7 ローカル ポリシー自動送信 UI の図
図 3-8 乗車券情報表示 UI 図
3.5 アトラクションモジュール機能の実現
景勝地モジュールは主に景勝地のチケットの購入を容易にすることを目的としており、ユーザーは都市、景勝地の名前(ファジークエリ)を通じて景勝地をクエリし、景勝地リストまたはホテルの推奨リストから詳細をクリックして、入力することができます景勝地の紹介、サービス措置を含む景勝地の詳細情報を表示します。公共施設やその他のコンテンツについては、ユーザーはこのインターフェースで景勝地のチケットを購入することもできます。実現された UI インターフェイスを図 5-9 に示します。
図 3-9 アトラクション情報の UI 図
図 3-10 ホテル詳細情報 UI 図
3.6 レイダーズモジュールの実装
ガイドモジュールは主にユーザーが公開した景勝地のガイドや景勝地のガイドを閲覧するためのもので、ガイドに対して「いいね!」したりコメントしたりすることができます。実現された UI インターフェイスを図 5-10 および図 5-11 に示します。
図 3-10 レイダー情報 UI の図
図 5-11 レイダーの詳細 UI ダイアグラム
3.7 ユーザーモジュールの実装
ユーザーモジュールは主にユーザー情報の表示と変更を行うためのものであり、同時にユーザーは自分のさまざまなタイプの注文を表示することができます。実現された UI インターフェイスを図 5-12 に示します。
図 3-12 ユーザー センター UI の図
5.8 オーダーモジュールの実装
注文モジュールは主に、ユーザーがホテル、鉄道チケット、航空券、景勝地のチケットを購入または予約する際に注文を作成するためのもので、注文を作成すると、注文番号、注文金額などの注文の基本情報が表示されます。情報。ユーザーは支払い方法を選択でき、支払いが成功すると、支払いの成功を促すインターフェースにジャンプします。実現された UI インターフェイスを図 5-13 および図 5-14 に示します。
図 3-13 支払いインターフェースの UI 図
図 3-14 支払い成功プロンプトの UI 図
3.9 背景ホームページの実現
バックグラウンド ホーム ページは、管理者がバックグラウンド管理インターフェイスに入ったときに最初に表示されるページで、主にグラフ、統計、その他の情報が含まれています。管理者は注文件数や登録ユーザー数、全注文金額などのデータ内容を視覚的に確認することができます。実現された UI インターフェイスを図 3-15 に示します。
図 3-15 背景のホームページ UI インターフェイス
4番目、コアコード表示
package com.lypt.controller.admin;
import com.lypt.api.CommonResult;
import com.lypt.pojo.vo.*;
import com.lypt.service.*;
import com.lypt.uitls.ComparatorSort;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@RestController
@RequestMapping("/admin/echarts")
public class AdminEchartsController {
@Autowired
TrainOrderService trainOrderService;
@Autowired
ScenicOrderService scenicOrderService;
@Autowired
PlaneOrderService planeOrderService;
@Autowired
BookOrderService bookOrderService;
@Autowired
UserService userService;
@RequestMapping("/topData")
public CommonResult topData(){
AdminTopData adminTopData = new AdminTopData();
//用户数量
adminTopData.setUserNumber(userService.AllUserNumber());
//一周销售额
Double totalPrice = 0.00;
totalPrice+= trainOrderService.weekData();
totalPrice+= scenicOrderService.weekData();
totalPrice+=planeOrderService.weekData();
totalPrice+= bookOrderService.weekData();
adminTopData.setWeekSalesVolume(totalPrice);
AllTypeOrderData allTypeOrderData1 = trainOrderService.allOrderData();
AllTypeOrderData allTypeOrderData2 = scenicOrderService.allOrderData();
AllTypeOrderData allTypeOrderData3 = planeOrderService.allOrderData();
AllTypeOrderData allTypeOrderData4 = bookOrderService.allOrderData();
//所有订单数量
int totalNumber = 0;
totalNumber+=allTypeOrderData1.getTotal();
totalNumber+=allTypeOrderData2.getTotal();
totalNumber+=allTypeOrderData3.getTotal();
totalNumber+=allTypeOrderData4.getTotal();
adminTopData.setAllOrderNumber(totalNumber);
//总销售额
Double allOrderPrice = 0.00;
allOrderPrice+=allTypeOrderData1.getTotalPrice();
allOrderPrice+=allTypeOrderData2.getTotalPrice();
allOrderPrice+=allTypeOrderData3.getTotalPrice();
allOrderPrice+=allTypeOrderData4.getTotalPrice();
adminTopData.setAllSalesVolume(allOrderPrice);
return CommonResult.success(adminTopData);
}
@RequestMapping("/weekBuyRanking")
public CommonResult weekBuyRanking(){
WeekSalesVolume weekSalesVolume1 = new WeekSalesVolume();
WeekSalesVolume weekSalesVolume2 = new WeekSalesVolume();
WeekSalesVolume weekSalesVolume3 = new WeekSalesVolume();
WeekSalesVolume weekSalesVolume4 = new WeekSalesVolume();
weekSalesVolume1.setTypeName("酒店");
weekSalesVolume1.setMoney(bookOrderService.weekData());
weekSalesVolume2.setTypeName("机票");
weekSalesVolume2.setMoney(planeOrderService.weekData());
weekSalesVolume3.setTypeName("火车票");
weekSalesVolume3.setMoney(trainOrderService.weekData());
weekSalesVolume4.setTypeName("景点门票");
weekSalesVolume4.setMoney(scenicOrderService.weekData());
ArrayList<Object> list = new ArrayList<>();
list.add(weekSalesVolume1);
list.add(weekSalesVolume2);
list.add(weekSalesVolume3);
list.add(weekSalesVolume4);
ComparatorSort comparatorSort = new ComparatorSort();
Collections.sort(list,comparatorSort);
return CommonResult.success(list);
}
@RequestMapping("/allBuyTotal")
public CommonResult allBuyTotal(){
ArrayList<Object> list = new ArrayList<>();
AllSalesVolume allSalesVolume1 = new AllSalesVolume();
AllSalesVolume allSalesVolume2 = new AllSalesVolume();
AllSalesVolume allSalesVolume3 = new AllSalesVolume();
AllSalesVolume allSalesVolume4 = new AllSalesVolume();
allSalesVolume1.setName("酒店");
allSalesVolume1.setValue(bookOrderService.allOrderData().getTotalPrice());
allSalesVolume2.setName("机票");
allSalesVolume2.setValue(planeOrderService.allOrderData().getTotalPrice());
allSalesVolume3.setName("火车票");
allSalesVolume3.setValue(trainOrderService.allOrderData().getTotalPrice());
allSalesVolume4.setName("景区门票");
allSalesVolume4.setValue(scenicOrderService.allOrderData().getTotalPrice());
list.add(allSalesVolume1);
list.add(allSalesVolume2);
list.add(allSalesVolume3);
list.add(allSalesVolume4);
return CommonResult.success(list);
}
@RequestMapping("/weekScenicDay")
public CommonResult weekScenicDay(){
WeekOnDay weekOnDay = scenicOrderService.weekOrderNumber();
return CommonResult.success(weekOnDay);
}
}
package com.lypt.controller.admin;
import com.github.pagehelper.PageInfo;
import com.lypt.api.CommonResult;
import com.lypt.pojo.springcloud_graduation.Manage;
import com.lypt.pojo.vo.Page;
import com.lypt.pojo.vo.Users;
import com.lypt.pojo.vo.Users2;
import com.lypt.service.ManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@PropertySource("classpath:nginxconfig.properties")
@RestController
@RequestMapping("/admin")
public class AdminManageController {
@Value("${pichost}")
private String pichost;
@Autowired
ManageService manageService;
@RequestMapping("/userInfo")
public CommonResult userInfo(){
ArrayList<String> list = new ArrayList<>();
list.add("admin");
Users user = new Users();
user.setUsername("admin");
user.setAvatar("https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
user.setPermissions(list);
return CommonResult.success(user);
}
@RequestMapping("/login")
public CommonResult login(){
Users2 users2 = new Users2();
users2.setAccessToken("admin");
return CommonResult.success(users2);
}
@RequestMapping("/manage/getAllList")
public CommonResult getAllList(Page page,Manage manage){
List<Manage> allList = manageService.getAllList(page, manage);
PageInfo pageInfo = new PageInfo(allList);
return CommonResult.success(pageInfo);
}
/**
* 上传图片
* @param tupian
* @return
*/
@RequestMapping("/manage/uploadImg")
public CommonResult uploadFile(MultipartFile tupian){
System.out.println("nihao");
String url=null;
if(tupian!=null&&!tupian.isEmpty()){
String name= UUID.randomUUID().toString();//生成随机的uuid作为文件名
int pos=tupian.getOriginalFilename().lastIndexOf(".");//后缀的位置
String fileName=name+tupian.getOriginalFilename().substring(pos);//得到文件名
try {
tupian.transferTo(new File("D:\\date\\images\\bysj\\user\\"+fileName));
} catch (IOException e) {
e.printStackTrace();
}
url=pichost+"bysj/user/"+fileName;
System.out.println(url);
}
return CommonResult.success(url);
}
/**
* 添加/修改管理员
* @param manage
* @return
*/
@RequestMapping("/manage/addManage")
public CommonResult addManage(Manage manage){
Boolean aBoolean = manageService.addManage(manage);
if (aBoolean){
return CommonResult.success("添加/修改管理员成功");
}else {
return CommonResult.failed();
}
}
}
V. プロジェクトの概要
このシステムの主な研究テーマは、現在の観光産業の発展のボトルネックと人々の旅行に影響を与える要因を分析し、今日のIT産業技術を組み合わせて人々の旅行の現在の困難とニーズをどのように解決するか、マイクロシステムを設計および実装することです。・利用者本位のサービスを基本としたサービス体制。このシステムは、エンタープライズ レベルのプロジェクトの開発モードを採用し、現在の成熟したフロントエンドとバックエンドの分離開発を採用し、プロジェクト アーキテクチャは、Spring Cloud マイクロサービス アーキテクチャに基づいて構築され、大規模なユーザー ベースの特性に応じて、システムの使いやすさと安定性を実現するために、サービスリクエストの同時実行性を高め、redis および mysql データベースシステムを使用してシステムデータベースへの負荷を軽減し、エンタープライズレベルのプロジェクト開発のためのソリューションを提供します。
エンタープライズ レベルのプロジェクトでは、システム パフォーマンス、システムのスケーラビリティ、高可用性、高同時実行性、システムの安定性、およびデータ セキュリティ要件を考慮する必要があり、データ損失を回避するためにデータベース クラスターを構築する必要があります。プロジェクトは、展開に分散マイクロサービスの概念を採用し、クラスターとマルチサーバーを使用してプロジェクトを起動し、同時にシステム間のサービスの正常な通信を保証する合理的なメカニズムを設計する必要があります。設計と実装のプロセスにおける私のリソースと時間は限られているため、これらのニーズを満たすことはできません。
現在、大量のアクセス要求に耐えられる同様のシステムが市場に多数存在しており、PC とモバイル APP の 2 つのアクセスを用意する方が良いでしょう。しかし、類似のシステムをほとんどチェックしてみたところ、それぞれに長所と短所があることが分かりましたので、ここでは、インターフェイスが乱雑で見苦しい、情報やローカルポリシーがユーザーにタイムリーにフィードバックできない、などの欠点をいくつかまとめて説明します。ユーザーの臨場感や共有感が乏しく、情報の流れが十分ではありません。将来的には、これらの問題を解決し、同時にユーザーが使いやすくするための小さなプログラムの入り口を開発できる、より良いシステムが登場することを願っています。