Ver código fonte

first commit

GZP 5 meses atrás
pai
commit
2018aba3a3

+ 171 - 0
README.md

@@ -0,0 +1,171 @@
+# Destination Discovery APP产品计划
+- 作者:郭志平
+- 学号:0210428
+
+## 一、项目概况
+
+### 背景现状
+- 项目名称:
+  - Destination Discovery
+- 项目Slogan:
+  - 梦想的起点,目的地探索的终点。
+- 项目简介:
+  - 我们的项目旨在开发一款旅游分享的移动应用程序(APP),为用户提供全面的旅游信息、个性化推荐和社交互动功能。通过整合各种旅游资源和技术手段,我们的APP将成为用户规划旅行、发现新目的地和分享旅游经历的首选平台。
+## 政策背景
+
+随着旅游业的快速发展,越来越多的人选择旅行作为休闲和度假的方式。政府和旅游部门对于旅游业的发展给予了重要支持和关注,鼓励旅游业的创新和提升服务质量。在这样的政策背景下,我们的项目应运而生,旨在满足旅游者日益增长的需求,提供更好的旅游体验和服务。
+
+## 经济趋势
+
+旅游业是一个蓬勃发展的行业,全球范围内都呈现出稳定增长的趋势。随着人们收入水平的提高和休闲观念的转变,旅游支出不断增加。同时,数字化技术的快速发展也为旅游行业带来了新的机遇和挑战。我们的项目将充分利用数字化技术,满足旅游者个性化、便捷化的需求,抓住这一经济趋势。
+
+## 行业痛点与解决方案
+
+在旅游行业中存在一些痛点和挑战,例如:
+- 旅游信息分散不全面,用户难以获取准确和全面的旅游信息。
+- 传统的旅游规划和推荐方式缺乏个性化,无法满足用户的个性化需求。
+- 旅游者缺乏一个可以分享和交流旅游经历的平台。
+
+针对这些痛点,我们的解决方案包括:
+- 提供全面的旅游信息,整合各种资源,为用户提供准确、全面的旅游信息。
+- 基于用户的兴趣和偏好,提供个性化的旅游推荐,帮助用户发现适合自己的旅游目的地和攻略。
+- 建立用户社区,让用户可以分享旅游经历、交流心得,并与其他用户互动,增加旅行的乐趣和互动性。
+
+## 背景现状
+
+目前,旅游行业已经有许多旅游平台和应用程序存在,但仍然存在一些问题。一些平台信息不够全面、推荐不够个性化,用户体验有待改善。我们的项目将通过整合各种技术手段,包括图像识别、自然语言处理、推荐系统、地理信息系统和社交媒体分析等,提供更全面、个性化的旅游服务,改善用户体验,并与旅游相关企业建立合作关系,提供更多优惠和特别服务。
+
+
+### 用户分析:相关者
+
+政府文旅局:
+- 宣传本地特色。
+
+景区景点单位:
+- 发布自己景区的美景,吸引游客观光。
+
+旅游者:
+- 分享旅游经历
+- 获取旅游攻略
+### 技术模型
+
+图像识别模型:
+- 使用现有的图像识别模型(如ResNet、Inception等)来识别和分类景区景点的照片,帮助景区景点单位发布自己景区的美景。
+
+自然语言处理模型:
+- 使用文本分类模型、情感分析模型等来处理旅游者的分享和评论,帮助他们分享旅游经历以及获取旅游攻略。
+
+推荐系统模型:
+- 基于旅游者的兴趣和历史数据,构建个性化的旅游攻略和景点推荐系统,可以使用协同过滤、内容推荐等算法。
+
+地理信息系统(GIS)模型:
+- 利用开源的地图服务和地理信息系统库(如Google Maps API、OpenStreetMap等),展示地理位置和地图信息,帮助旅游者查找目的地、规划路线和探索景点。
+
+社交媒体分析模型:
+- 分析旅游者在社交媒体上的分享和评论,帮助政府文旅局了解旅游者的兴趣和需求,以便宣传本地特色和进行市场调研。
+
+## 商业模型
+
+### 1. 收入来源
+
+- 广告收入:通过向旅游相关企业提供广告展示的机会,赚取广告费用。
+- 会员订阅:提供高级会员服务,包括独家旅游攻略、特别优惠等,以收取会员订阅费用。
+- 合作伙伴推广:与旅行社、酒店、航空公司等合作伙伴建立推广合作关系,获取推广费用或佣金。
+- 数据销售:将用户旅游行为数据进行分析和挖掘,提供给相关企业进行市场调研和精准营销,获取数据销售收入。
+
+### 2. 成本结构
+
+- 技术开发和维护成本:包括开发和维护APP平台、服务器租用费用、软件许可费用等。
+- 运营成本:包括人员工资、办公场地租金、市场推广费用等。
+- 数据存储和处理成本:包括用户数据存储、数据分析和处理的成本。
+- 客户支持成本:提供客户支持和售后服务的成本。
+
+### 3. 用户增长策略
+
+- 市场推广:通过线上线下广告、社交媒体宣传等方式提高品牌知名度和用户曝光率。
+- 用户口碑传播:提供优质的旅游服务和用户体验,鼓励用户分享和推荐,扩大用户基础。
+- 合作伙伴推广:与旅游相关企业建立合作关系,共同推广APP,扩大用户覆盖范围。
+
+### 4. 用户留存和活跃策略
+
+- 个性化推荐:利用推荐系统模型,向用户提供个性化的旅游攻略和景点推荐,增加用户粘性和活跃度。
+- 社交互动功能:提供用户之间的社交互动功能,如评论、点赞、分享等,增加用户参与度和社交效应。
+- 优惠和奖励机制:提供会员专属优惠、积分奖励等激励机制,鼓励用户持续使用和参与。
+
+### 5. 持续发展和扩张策略
+
+- 拓展目的地和服务范围:逐步增加覆盖的旅游目的地和提供的旅游服务种类,满足不同用户需求。
+- 数据驱动决策:通过对用户数据的深入分析和挖掘,不断优化产品和服务,提升用户体验和满意度。
+- 国际化拓展:考虑进军国际市场,提供多语言支持和适应不同国家和地区的旅游特点。
+
+
+### 融资策略
+- 种子期 0.6-0.8
+    - 1-10万以内,采购基本设备,完成APP开发
+- 天使轮
+    - 50-100万,用于APP的大规模推广
+
+## 产品结构
+
+### 1. 首页
+- 展示精选的旅游目的地和热门旅游攻略,吸引用户浏览和探索。
+- 提供搜索功能,让用户可以根据关键词查找目的地、景点或旅游攻略。
+
+### 2. 目的地详情页
+- 展示特定目的地的详细信息,包括景点介绍、美食推荐、交通指南等。
+- 提供用户评价和评论功能,让用户分享自己的旅游经历和建议。
+
+### 3. 旅游攻略页
+- 提供各种旅游攻略,包括城市指南、行程规划、旅行贴士等。
+- 根据用户的兴趣和偏好,推荐个性化的旅游攻略。
+
+### 4. 用户社区
+- 提供用户之间的社交互动功能,如评论、点赞、分享等。
+- 用户可以发布自己的旅游分享和照片,与其他用户交流和互动。
+
+### 5. 个人中心
+- 用户可以管理自己的个人信息,包括头像、昵称、个人简介等。
+- 提供收藏功能,让用户收藏喜欢的目的地、攻略等。
+
+### 6. 广告展示
+- 在合适的位置展示旅游相关企业的广告,为APP带来广告收入。
+
+### 7. 其他功能
+- 提供即时聊天功能,让用户可以与其他用户或客服进行实时沟通。
+- 提供用户反馈和建议的渠道,以不断改进产品和服务。
+
+## 产品优势和特点
+
+### 1. 综合性旅游平台
+- 提供全面的旅游信息,包括目的地介绍、景点推荐、旅游攻略等,满足用户的各种旅游需求。
+- 用户可以在同一个平台上获取多种旅游信息,方便快捷。
+
+### 2. 个性化推荐
+- 基于用户的兴趣和偏好,提供个性化的旅游推荐,帮助用户发现适合自己的旅游目的地和攻略。
+- 用户可以根据自己的喜好定制旅游行程,提升旅行体验。
+
+### 3. 用户社区和互动
+- 提供用户社区功能,让用户可以分享旅游经历、交流心得,并与其他用户互动。
+- 用户可以从其他用户的分享中获取灵感和建议,增加旅行的乐趣和互动性。
+
+### 4. 数据驱动的服务优化
+- 通过对用户数据的分析和挖掘,不断优化产品和服务,提升用户体验和满意度。
+- 根据用户的反馈和行为,进行改进和调整,为用户提供更好的旅游服务。
+
+### 5. 广告展示和商业合作
+- 通过向旅游相关企业提供广告展示的机会,为APP带来广告收入。
+- 与旅行社、酒店、航空公司等合作伙伴建立推广合作关系,为用户提供更多优惠和特别服务。
+
+### 6. 及时的客户支持
+- 提供即时聊天功能和用户反馈渠道,让用户可以随时与客服进行沟通和解决问题。
+- 关注用户的需求和反馈,及时提供帮助和支持。
+
+### 竞品分析对比
+- 云游江西
+
+- 界面
+![主页面](./img/page.jpg)
+![子页面](./img/page2.jpg)
+![子页面](./img/page3.jpg)
+![子页面](./img/page4.jpg)
+

+ 2 - 1
angular.json

@@ -136,7 +136,8 @@
   "cli": {
     "schematicCollections": [
       "@ionic/angular-toolkit"
-    ]
+    ],
+    "analytics": false
   },
   "schematics": {
     "@ionic/angular-toolkit:component": {

+ 4 - 0
src/app/app-routing.module.ts

@@ -5,6 +5,10 @@ const routes: Routes = [
   {
     path: '',
     loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule)
+  },
+  {
+    path: 'tab-mine',
+    loadChildren: () => import('./tab-mine/tab-mine.module').then( m => m.TabMinePageModule)
   }
 ];
 @NgModule({

+ 17 - 0
src/app/tab-mine/tab-mine-routing.module.ts

@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { TabMinePage } from './tab-mine.page';
+
+const routes: Routes = [
+  {
+    path: '',
+    component: TabMinePage
+  }
+];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule],
+})
+export class TabMinePageRoutingModule {}

+ 20 - 0
src/app/tab-mine/tab-mine.module.ts

@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { TabMinePageRoutingModule } from './tab-mine-routing.module';
+
+import { TabMinePage } from './tab-mine.page';
+
+@NgModule({
+  imports: [
+    CommonModule,
+    FormsModule,
+    IonicModule,
+    TabMinePageRoutingModule
+  ],
+  declarations: [TabMinePage]
+})
+export class TabMinePageModule {}

+ 13 - 0
src/app/tab-mine/tab-mine.page.html

@@ -0,0 +1,13 @@
+<ion-header [translucent]="true">
+  <ion-toolbar>
+    <ion-title>tab-mine</ion-title>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+  <ion-header collapse="condense">
+    <ion-toolbar>
+      <ion-title size="large">tab-mine</ion-title>
+    </ion-toolbar>
+  </ion-header>
+</ion-content>

+ 0 - 0
src/app/tab-mine/tab-mine.page.scss


+ 17 - 0
src/app/tab-mine/tab-mine.page.spec.ts

@@ -0,0 +1,17 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { TabMinePage } from './tab-mine.page';
+
+describe('TabMinePage', () => {
+  let component: TabMinePage;
+  let fixture: ComponentFixture<TabMinePage>;
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(TabMinePage);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 15 - 0
src/app/tab-mine/tab-mine.page.ts

@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-tab-mine',
+  templateUrl: './tab-mine.page.html',
+  styleUrls: ['./tab-mine.page.scss'],
+})
+export class TabMinePage implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+}

+ 2 - 3
src/app/tab1/tab1.page.html

@@ -1,11 +1,10 @@
-<ion-header [translucent]="true">
+<!-- <ion-header [translucent]="true">
   <ion-toolbar>
     <ion-title>
       Tab 1
     </ion-title>
   </ion-toolbar>
-</ion-header>
-
+</ion-header> -->
 <ion-content [fullscreen]="true">
   <ion-header collapse="condense">
     <ion-toolbar>

+ 1 - 1
src/app/tab3/tab3.page.html

@@ -9,7 +9,7 @@
 <ion-content [fullscreen]="true">
   <ion-header collapse="condense">
     <ion-toolbar>
-      <ion-title size="large">Tab 3</ion-title>
+      <ion-title size="large">我的</ion-title>
     </ion-toolbar>
   </ion-header>
 

+ 2 - 2
src/app/tabs/tabs.page.html

@@ -3,7 +3,7 @@
   <ion-tab-bar slot="bottom">
     <ion-tab-button tab="tab1" href="/tabs/tab1">
       <ion-icon aria-hidden="true" name="triangle"></ion-icon>
-      <ion-label>Tab 1</ion-label>
+      <ion-label>首页</ion-label>
     </ion-tab-button>
 
     <ion-tab-button tab="tab2" href="/tabs/tab2">
@@ -13,7 +13,7 @@
 
     <ion-tab-button tab="tab3" href="/tabs/tab3">
       <ion-icon aria-hidden="true" name="square"></ion-icon>
-      <ion-label>Tab 3</ion-label>
+      <ion-label>我的</ion-label>
     </ion-tab-button>
   </ion-tab-bar>
 

+ 1 - 1
src/index.html

@@ -3,7 +3,7 @@
 
 <head>
   <meta charset="utf-8" />
-  <title>Ionic App</title>
+  <title>Luck 16th</title>
 
   <base href="/" />
 

+ 3 - 0
src/luck-16th/login-page/login-page.component.html

@@ -0,0 +1,3 @@
+<p>
+  login-page works!
+</p>

+ 0 - 0
src/luck-16th/login-page/login-page.component.scss


+ 24 - 0
src/luck-16th/login-page/login-page.component.spec.ts

@@ -0,0 +1,24 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { LoginPageComponent } from './login-page.component';
+
+describe('LoginPageComponent', () => {
+  let component: LoginPageComponent;
+  let fixture: ComponentFixture<LoginPageComponent>;
+
+  beforeEach(waitForAsync(() => {
+    TestBed.configureTestingModule({
+      declarations: [ LoginPageComponent ],
+      imports: [IonicModule.forRoot()]
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(LoginPageComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  }));
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 14 - 0
src/luck-16th/login-page/login-page.component.ts

@@ -0,0 +1,14 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-login-page',
+  templateUrl: './login-page.component.html',
+  styleUrls: ['./login-page.component.scss'],
+})
+export class LoginPageComponent  implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {}
+
+}

+ 12 - 0
src/luck-16th/luck-16th.module.ts

@@ -0,0 +1,12 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+
+
+@NgModule({
+  declarations: [],
+  imports: [
+    CommonModule
+  ]
+})
+export class Luck16thModule { }