基于springboot的旅游出行指南_655ms

@TOC

springboot615基于springboot的旅游出行指南_655ms--论文

系统概述

该系统由个人管理员和用户两部分组成。其中:用户进入系统首页可以实现首页,景点信息,酒店信息,餐厅信息,交通路线,旅行日记,公告信息,后台管理,个人中心等;管理员则是根据不同需求设置了不同功能,可以通过后台管理接口管理用户信息。

3.2 需求分析

需求分析,也称为软件需求分析、系统需求分析或需求分析工程,是指开发人员经过充分的研究和分析,准确地理解用户和项目在功能、性能、可靠性等方面的具体需求,并将用户的非正式需求表述转化为确定系统必须执行的需求的完整定义的过程[11]。

功能需求分析是系统设计的前提,它要求开发者和用户定义开发什么样的体系和系统需要什么样的功能。本文主要介绍了一种基于windows平台实现的旅游出行指南。该系统为用户找到景点信息和酒店信息提供了更安全、更高效、更便捷的途径。本系统有两个角色:管理员和用户,要求具备以下功能:

(1)用户可以浏览主页了解旅游出行信息,并进行酒店预订和景点购票等操作;

(2)管理员通过后台管理员界面,实现对用户信息管理,或发布系统公告,让用户实时知道最新的旅游出行信息;

3.3 可行性分析

可行性分析是指通过比较项目的主要内容和支撑条件,如市场需求、资源供应、环境影响、资金筹措情况、盈利能力等,预测项目建成后可能产生的资金、经济效益、社会和环境影响,为项目决策提供依据的综合性系统分析方法。可行性研究报告编制的质量直接影响着投资决策的成,而可行性研究报告编制程序又决定了可行性研究报告能否得到有效执行。因此,必须重视可行性研究工作,提高其编制水平。可行性分析应当具有预见性、公正性、可靠性和科学性[13]。

3.3.1 技术可行性分析

本系统是为了为用户寻找旅游出行提供更加安全、高效、便捷的方式,本系统需要运用到Java、MySQL、springboot、B/S结构等技术,这些技术在国内外已经非常成熟[14],在大学期间也有所涉及,相关的知识和工具在网络上也可以查到,再加上老师的指导,在技术上的难题可以得到解决。

3.3.2 经济可行性分析

该系统的主题是基于springboot的旅游出行指南的设计与实现。开发所需的软件资源是Eclipse。我们可以在它的网站上安装一个免费的版本,这对我们的开发和使用是足够好的。数据库就是MySQL数据库。是开源是免费的,服务器使用Tomcat服务器,浏览器使用日常IE浏览器,springboot框架是开源的。经过可行性评估,软件资源支出符合经济可行性[15]。硬件方面,配备齐全的笔记本电脑作为工具在经济上是可行的。

3.4 系统用例分析

旅游出行指南综合网络空间开发设计要求。目的是将旅游出行指南从传统管理方式转换为在网上管理,完成旅游出行信息管理的方便快捷、安全性高、交易规范做了保障,目标明确。旅游出行指南可以将功能划分为管理员功能和用户功能。

(1)、管理员关键功能包含系统首页,个人中心,用户管理,天气预报管理,景点信息管理,门票预订管理,酒店信息管理,酒店预订管理,餐厅信息管理,餐厅预订管理,交通路线管理,旅行日记管理,旅游规划管理,系统管理等进行管理。管理员用例如下:

图3-1 管理员用例图

(2)、用户关键功能包含系统首页,个人中心,门票预订管理,酒店预订管理,餐厅预订管理,旅行日记管理,旅游规划管理等进行管理。用户用例如下:

图3-2 用户用例图

3.5系统流程分析

3.5.1 用户登录流程

要想利用这个软件来进行系统的安全管理,首先需要登录到该软件中。如图3-3所示。

图3-3登录流程图

3.5.2 添加信息流程

管理员可以添加信息,用户添加可以自己权限内的信息,输入信息后,要想利用这个软件来进行系统的安全管理,首先需要登录到该软件中。添加信息流程如图3-4所示。

图3-4添加信息流程图

3.5.3 修改信息流程

管理员可以修改旅游出行信息,用户可以修改自己权限内的信息,首先进入修改信息界面,输入需要修改信息,在系统进行判定为正确和合规后修改成功,并将数据更新至数据库。信息不合法则修改失败,重新输入。修改信息流程图如图3-5所示。

图3-5修改信息流程图

3.5.4 删除信息流程

管理员可以删除旅游出行信息,点击删除按钮,系统会提示是否删除信息,点击确定,则信息被删除,数据库中的信息随之删除,删除信息流程图如图3-6所示。

图3-6 删除信息流程图

3.6本章小结

基于springboot的旅游出行指南从市场、技术、经济、功能等方面分析了系统的功能需求,可以满足用户的旅游出行管理需求,帮助用户安全、高效地找到合适的旅游出行信息,因此有必要对其进行课题研究。

第4章 系统设计

系统设计是将被设计对象划分为单个模块进行构建,各个模块相互支持,相互制约,它们的组合是一个完整的系统。通过系统设计,可以最大限度地满足系统的预期目标,明确软件开发的目的。

4.1 系统基本结构设计

本次系统采用springboot框架集进行开发,springboot框架是一款企业界主流的软件开发框架,其简化了开发流程,大大缩减了软件开发所需的时间提高了软件的响应速度。系统总体结构图如图4-1所示。

图4-1 系统总体结构图

4.2 数据库设计

数据库结构设计的好坏直接影响到旅游出行指南的效率和实现的效果。本系统的数据库采用MySQL数据库,MySQL是一种开放源代码的关系型数据库管理系统,使用最常见的数据库管理语言SQL进行数据库管理。

4.2.1 数据库E-R图设计

E-R图也可称为实体-联系图,其可以清楚的显示实体与实体之间的关系,是描述概念模型的有效方式,通过各实体间的关系方便数据库结构的设计。以下是本系统主要的实体属性图如下所示。

餐厅信息评论表实体如图4-2所示。

图4-2餐厅信息评论表实体属性图

旅游规划实体如图4-3所示。

图4-3旅游规划实体属性图

公告信息实体如图4-4所示。

图4-4公告信息实体属性图

旅行日记实体如图4-5所示。

图4-5旅行日记实体属性图

用户实体如图4-6所示。

图4-6用户实体属性图

4.2.2 数据库表设计

数据表是用来保存多种数据的表,它是所有数据库的核心对象,且对于软件开发有着不可替代的作用。其相关数据表如下:

表4-1:收藏表

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
useridbigint用户id
refidbigint商品id
tablenamevarchar200表名
namevarchar200名称
picturelongtext4294967295图片
typevarchar200类型(1:收藏,21:赞,22:踩,31:竞拍参与,41:关注)1
inteltypevarchar200推荐类型
remarkvarchar200备注

表4-2:餐厅信息评论表

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
refidbigint关联表id
useridbigint用户id
avatarurllongtext4294967295头像
nicknamevarchar200用户名
contentlongtext4294967295评论内容
replylongtext4294967295回复内容

表4-3:旅游规划

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
mudedivarchar200目的地
chufashijiandatetime出发时间
yujitianshuint预计天数
lvyouluxianlongtext4294967295旅游路线
guihuaneironglongtext4294967295规划内容
zhanghaovarchar200账号
xingmingvarchar200姓名

表4-4:公告信息

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
titlevarchar200标题
introductionlongtext4294967295简介
picturelongtext4294967295图片
contentlongtext4294967295内容

表4-5:配置文件

字段名称类型长度字段说明主键默认值
idbigint主键主键
namevarchar100配置参数名称
valuevarchar100配置参数值

表4-6:旅行日记评论表

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
refidbigint关联表id
useridbigint用户id
avatarurllongtext4294967295头像
nicknamevarchar200用户名
contentlongtext4294967295评论内容
replylongtext4294967295回复内容

表4-7:用户表

字段名称类型长度字段说明主键默认值
idbigint主键主键
usernamevarchar100用户名
passwordvarchar100密码
rolevarchar100角色管理员
addtimetimestamp新增时间CURRENT_TIMESTAMP

表4-8:酒店信息评论表

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
refidbigint关联表id
useridbigint用户id
avatarurllongtext4294967295头像
nicknamevarchar200用户名
contentlongtext4294967295评论内容
replylongtext4294967295回复内容

表4-9:token表

字段名称类型长度字段说明主键默认值
idbigint主键主键
useridbigint用户id
usernamevarchar100用户名
tablenamevarchar100表名
rolevarchar100角色
tokenvarchar200密码
addtimetimestamp新增时间CURRENT_TIMESTAMP
expiratedtimetimestamp过期时间CURRENT_TIMESTAMP

表4-10:景点信息评论表

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
refidbigint关联表id
useridbigint用户id
avatarurllongtext4294967295头像
nicknamevarchar200用户名
contentlongtext4294967295评论内容
replylongtext4294967295回复内容

表4-11:交通路线评论表

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
refidbigint关联表id
useridbigint用户id
avatarurllongtext4294967295头像
nicknamevarchar200用户名
contentlongtext4294967295评论内容
replylongtext4294967295回复内容

表4-12:旅行日记

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
lvxingdidianvarchar200旅行地点
lvxingleixingvarchar200旅行类型
lvxingtianshuint旅行天数
lvxingneironglongtext4294967295旅行内容
lvxingtupianlongtext4294967295旅行图片
zhanghaovarchar200账号
xingmingvarchar200姓名
thumbsupnumint0
crazilynumint0

表4-13:门票预订

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
jingdianmingchengvarchar200景点名称
jingdiandizhivarchar200景点地址
menpiaojiagefloat门票价格
jingdiandengjivarchar200景点等级
yudingshijiandatetime预订时间
beizhuvarchar200备注
zhanghaovarchar200账号
xingmingvarchar200姓名
shoujivarchar200手机
ispayvarchar200是否支付未支付

表4-15:餐厅预订

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
cantingmingchengvarchar200餐厅名称
cantingdidianvarchar200餐厅地点
yudingjiagefloat预订价格
yudingshijiandatetime预订时间
yudingshuomingvarchar200预订说明
zhanghaovarchar200账号
xingmingvarchar200姓名
shoujivarchar200手机
ispayvarchar200是否支付未支付

表4-16:酒店预订

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
jiudianmingchengvarchar200酒店名称
jiudianleixingvarchar200酒店类型
jiudiandizhivarchar200酒店地址
fangjianleixingvarchar200房间类型
yuyuejiagefloat预约价格
yudingshijiandatetime预订时间
yudingshuomingvarchar200预订说明
zhanghaovarchar200账号
xingmingvarchar200姓名
shoujivarchar200手机
ispayvarchar200是否支付未支付

表4-17:餐厅信息

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
cantingmingchengvarchar200餐厅名称
cantingdidianvarchar200餐厅地点
renjunxiaofeiint人均消费
yudingjiageint预订价格
cantingjieshaolongtext4294967295餐厅介绍
cantingtupianlongtext4294967295餐厅图片
thumbsupnumint0
crazilynumint0
clicktimedatetime最近点击时间
clicknumint点击次数0

表4-18:酒店信息

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
jiudianmingchengvarchar200酒店名称
jiudianleixingvarchar200酒店类型
jiudiandizhivarchar200酒店地址
fangjianleixingvarchar200房间类型
yuyuejiagefloat预约价格
lianxidianhuavarchar200联系电话
jiudianjieshaolongtext4294967295酒店介绍
jiudiantupianlongtext4294967295酒店图片
thumbsupnumint0
crazilynumint0
clicktimedatetime最近点击时间
clicknumint点击次数0

表4-19:景点信息

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
jingdianmingchengvarchar200景点名称
jingdiandizhivarchar200景点地址
jingdiandengjivarchar200景点等级
menpiaojiageint门票价格
jingdiandianhuavarchar200景点电话
jingdianjieshaolongtext4294967295景点介绍
jingdiantupianlongtext4294967295景点图片
thumbsupnumint0
crazilynumint0
clicktimedatetime最近点击时间
clicknumint点击次数0

表4-20:交通路线

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
luxianmingchengvarchar200路线名称
luxianleixingvarchar200路线类型
shifadivarchar200始发地
zhongdiandivarchar200终点地
quanchengjulivarchar200全程距离
luxianxiangqinglongtext4294967295路线详情
luxiantupianlongtext4294967295路线图片

表4-21:用户

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
zhanghaovarchar200账号
mimavarchar200密码
xingmingvarchar200姓名
xingbievarchar200性别
nianlingint年龄
shoujivarchar200手机
touxianglongtext4294967295头像

表4-22:天气预报

字段名称类型长度字段说明主键默认值
idbigint主键主键
addtimetimestamp创建时间CURRENT_TIMESTAMP
chengshivarchar200城市
fengmianlongtext4294967295封面
tianqivarchar200天气
qiwenvarchar200气温
shiduvarchar200湿度
fengxiangvarchar200风向
fengsuvarchar200风速
shiyichuxingvarchar200适宜出行
chuanyituijianvarchar200穿衣推荐
gengxinshijiandatetime更新时间

4.3 本章小结

通过本章针对旅游出行指南功能的总体结构、E-R属性图和数据表的大概介绍,对在开发系统时所要涉及到的数据库进行简单设计,为下一章系统的实现做好铺垫。

第5章 系统实现

系统实现章节的主要内容主要是将系统分析和系统设计方案进行实现,按照各个系统角色进行功能介绍,系统实现就是一个真正开始编写的阶段,将前面的分析结果以及设计方案进行实现,最终做出一个符合用户需求的软件系统。

5.1系统前台实现

当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到系统的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图5-1所示:

图5-1 系统首页界面

景点信息:在景点信息页面可以输入景点名称和景点地址进行查询,可以查看到景点详细信息,并根据需要进行订门票、评论或收藏操作;景点信息页面如图5-2所示:

图5-2景点信息详细页面

酒店信息:在酒店信息页面的输入栏中输入酒店名称、酒店类型和选择房间类型进行查询,可以查看到酒店详细信息,并根据需要进行订酒店、评论或收藏操作;酒店信息页面如图5-3所示:

图5-3酒店信息详细页面

在个人中心页面输入个人信息可以进行更新操作,并根据需要对我的收藏进行详细操作;如图5-4所示:

图5-4 个人中心界面

5.2后台功能实现

后台登录,在登录页面选择需要登录的角色,并正确输入用户名和密码后,进入操作系统进行操作;如图5-5所示。

图5-5 后台登录界面

5.2.1管理员模块实现

管理员进入主页面,主要功能包括对系统首页,个人中心,用户管理,天气预报管理,景点信息管理,门票预订管理,酒店信息管理,酒店预订管理,餐厅信息管理,餐厅预订管理,交通路线管理,旅行日记管理,旅游规划管理,系统管理等进行操作。管理员主页面如图5-6所示:

图5-6 管理员主界面

管理员点击用户管理。在用户页面输入账号和姓名进行查询、新增或删除用户信息列表,并根据需要对用户详情信息进行详情、修改或删除操作;如图5-7所示:

图5-7用户管理界面

管理员点击门票预订管理。在门票预订页面输入景点名称和景点地址进行查询或删除门票预订列表,并根据需要对门票预订详情信息进行详情或删除操作;如图5-8所示:

图5-8门票预订管理界面

管理员点击餐厅预订管理。在餐厅预订页面输入餐厅名称、姓名和手机进行查询或删除餐厅预订列表,并根据需要对餐厅预订详情信息进行详情或删除操作;如图5-9所示:

图5-9餐厅预订管理界面

管理员点击旅行日记管理。在旅行日记页面输入旅行地点和选择旅行类型进行查询或删除旅行日记列表,并根据需要对旅行日记详情信息进行详情、查看评论或删除操作;如图5-10所示:

图5-10旅行日记管理界面

管理员点击系统管理,进入系统管理页面可以对轮播图管理进行详情或修改操作,在公告信息页面输入标题可以查询,新增或删除公告信息列表,并根据需要对公告详情信息进行查看详情,修改和删除等操作。如图5-11所示:

图5-11系统管理界面

5.2.2用户模块实现

用户进入主页面,主要功能包括对系统首页,个人中心,门票预订管理,酒店预订管理,餐厅预订管理,旅行日记管理,旅游规划管理等进行操作。用户主页面如图5-12所示:

图5-12 用户主界面

用户点击门票预订管理。在门票预订页面输入景点名称和景点地址进行查询门票预订列表,并根据需要对门票预订详情信息进行详情操作;如图5-13所示:

图5-13门票预订管理界面

UsersServiceImpl.java

package com.service.impl;


import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.UsersDao;
import com.entity.UsersEntity;
import com.service.UsersService;
import com.utils.PageUtils;
import com.utils.Query;


/**
 * 系统用户
 */
@Service("usersService")
public class UsersServiceImpl extends ServiceImpl<UsersDao, UsersEntity> implements UsersService {

	@Override
	public PageUtils queryPage(Map<String, Object> params) {
		Page<UsersEntity> page = this.selectPage(
                new Query<UsersEntity>(params).getPage(),
                new EntityWrapper<UsersEntity>()
        );
        return new PageUtils(page);
	}

	@Override
	public List<UsersEntity> selectListView(Wrapper<UsersEntity> wrapper) {
		return baseMapper.selectListView(wrapper);
	}

	@Override
	public PageUtils queryPage(Map<String, Object> params,
			Wrapper<UsersEntity> wrapper) {
		 Page<UsersEntity> page =new Query<UsersEntity>(params).getPage();
	        page.setRecords(baseMapper.selectListView(page,wrapper));
	    	PageUtils pageUtil = new PageUtils(page);
	    	return pageUtil;
	}
}

InterceptorConfig.java
package com.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import com.interceptor.AuthorizationInterceptor;

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport{
	
	@Bean
    public AuthorizationInterceptor getAuthorizationInterceptor() {
        return new AuthorizationInterceptor();
    }
	
	@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getAuthorizationInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");
        super.addInterceptors(registry);
	}
	
	/**
	 * springboot 2.0配置WebMvcConfigurationSupport之后,会导致默认配置被覆盖,要访问静态资源需要重写addResourceHandlers方法
	 */
	@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/**")
        .addResourceLocations("classpath:/resources/")
        .addResourceLocations("classpath:/static/")
        .addResourceLocations("classpath:/admin/")
        .addResourceLocations("classpath:/front/")
        .addResourceLocations("classpath:/public/");
		super.addResourceHandlers(registry);
    }
}

TianqiyubaoServiceImpl.java
package com.service.impl;

import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.utils.PageUtils;
import com.utils.Query;


import com.dao.TianqiyubaoDao;
import com.entity.TianqiyubaoEntity;
import com.service.TianqiyubaoService;
import com.entity.vo.TianqiyubaoVO;
import com.entity.view.TianqiyubaoView;

@Service("tianqiyubaoService")
public class TianqiyubaoServiceImpl extends ServiceImpl<TianqiyubaoDao, TianqiyubaoEntity> implements TianqiyubaoService {
	
	
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        Page<TianqiyubaoEntity> page = this.selectPage(
                new Query<TianqiyubaoEntity>(params).getPage(),
                new EntityWrapper<TianqiyubaoEntity>()
        );
        return new PageUtils(page);
    }
    
    @Override
	public PageUtils queryPage(Map<String, Object> params, Wrapper<TianqiyubaoEntity> wrapper) {
		  Page<TianqiyubaoView> page =new Query<TianqiyubaoView>(params).getPage();
	        page.setRecords(baseMapper.selectListView(page,wrapper));
	    	PageUtils pageUtil = new PageUtils(page);
	    	return pageUtil;
 	}
    
    @Override
	public List<TianqiyubaoVO> selectListVO(Wrapper<TianqiyubaoEntity> wrapper) {
 		return baseMapper.selectListVO(wrapper);
	}
	
	@Override
	public TianqiyubaoVO selectVO(Wrapper<TianqiyubaoEntity> wrapper) {
 		return baseMapper.selectVO(wrapper);
	}
	
	@Override
	public List<TianqiyubaoView> selectListView(Wrapper<TianqiyubaoEntity> wrapper) {
		return baseMapper.selectListView(wrapper);
	}

	@Override
	public TianqiyubaoView selectView(Wrapper<TianqiyubaoEntity> wrapper) {
		return baseMapper.selectView(wrapper);
	}


}

add-or-update.vue
<template>
	<div class="addEdit-block" style="width: 100%;">
		<el-form
			:style='{"padding":"30px","boxShadow":"0 0px 0px rgba(64, 158, 255, .3)","margin":"-30px 0 0","borderRadius":"0 0 30px 30px","flexWrap":"wrap","background":"#F8F6F7","display":"flex","width":"100%"}'
			class="add-update-preview"
			ref="ruleForm"
			:model="ruleForm"
			:rules="rules"
			label-width="120px"
		>
			<template >
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' class="input" v-if="type!='info'"  label="路线名称" prop="luxianmingcheng">
					<el-input v-model="ruleForm.luxianmingcheng" placeholder="路线名称" clearable  :readonly="ro.luxianmingcheng"></el-input>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' v-else class="input" label="路线名称" prop="luxianmingcheng">
					<el-input v-model="ruleForm.luxianmingcheng" placeholder="路线名称" readonly></el-input>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' class="select" v-if="type!='info'"  label="路线类型" prop="luxianleixing">
					<el-select :disabled="ro.luxianleixing" v-model="ruleForm.luxianleixing" placeholder="请选择路线类型" >
						<el-option
							v-for="(item,index) in luxianleixingOptions"
							v-bind:key="index"
							:label="item"
							:value="item">
						</el-option>
					</el-select>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' v-else class="input" label="路线类型" prop="luxianleixing">
					<el-input v-model="ruleForm.luxianleixing"
						placeholder="路线类型" readonly></el-input>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' class="input" v-if="type!='info'"  label="始发地" prop="shifadi">
					<el-input v-model="ruleForm.shifadi" placeholder="始发地" clearable  :readonly="ro.shifadi"></el-input>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' v-else class="input" label="始发地" prop="shifadi">
					<el-input v-model="ruleForm.shifadi" placeholder="始发地" readonly></el-input>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' class="input" v-if="type!='info'"  label="终点地" prop="zhongdiandi">
					<el-input v-model="ruleForm.zhongdiandi" placeholder="终点地" clearable  :readonly="ro.zhongdiandi"></el-input>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' v-else class="input" label="终点地" prop="zhongdiandi">
					<el-input v-model="ruleForm.zhongdiandi" placeholder="终点地" readonly></el-input>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' class="input" v-if="type!='info'"  label="全程距离" prop="quanchengjuli">
					<el-input v-model="ruleForm.quanchengjuli" placeholder="全程距离" clearable  :readonly="ro.quanchengjuli"></el-input>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' v-else class="input" label="全程距离" prop="quanchengjuli">
					<el-input v-model="ruleForm.quanchengjuli" placeholder="全程距离" readonly></el-input>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' class="upload" v-if="type!='info' && !ro.luxiantupian" label="路线图片" prop="luxiantupian">
					<file-upload
						tip="点击上传路线图片"
						action="file/upload"
						:limit="3"
						:multiple="true"
						:fileUrls="ruleForm.luxiantupian?ruleForm.luxiantupian:''"
						@change="luxiantupianUploadChange"
					></file-upload>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' class="upload" v-else-if="ruleForm.luxiantupian" label="路线图片" prop="luxiantupian">
					<img v-if="ruleForm.luxiantupian.substring(0,4)=='http'" class="upload-img" style="margin-right:20px;" v-bind:key="index" :src="ruleForm.luxiantupian.split(',')[0]" width="100" height="100">
					<img v-else class="upload-img" style="margin-right:20px;" v-bind:key="index" v-for="(item,index) in ruleForm.luxiantupian.split(',')" :src="$base.url+item" width="100" height="100">
				</el-form-item>
			</template>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' v-if="type!='info'"  label="路线详情" prop="luxianxiangqing">
					<editor 
						style="min-width: 200px; max-width: 600px;"
						v-model="ruleForm.luxianxiangqing" 
						class="editor" 
						action="file/upload">
					</editor>
				</el-form-item>
				<el-form-item :style='{"width":"100%","margin":"0 0 20px 0"}' v-else-if="ruleForm.luxianxiangqing" label="路线详情" prop="luxianxiangqing">
                    <span :style='{"fontSize":"14px","lineHeight":"40px","color":"#000","fontWeight":"500","display":"inline-block"}' v-html="ruleForm.luxianxiangqing"></span>
                </el-form-item>
			<el-form-item :style='{"width":"100%","padding":"0","margin":"0"}' class="btn">
				<el-button :style='{"border":"0","cursor":"pointer","padding":"0","margin":"0 20px 0 0","outline":"none","color":"rgba(255, 255, 255, 1)","borderRadius":"0","background":"#67D4B2","width":"128px","lineHeight":"40px","fontSize":"14px","height":"40px"}'  v-if="type!='info'" type="primary" class="btn-success" @click="onSubmit">提交</el-button>
				<el-button :style='{"border":"0px solid rgba(64, 158, 255, 1)","cursor":"pointer","padding":"0","margin":"0","outline":"none","color":"#fff","borderRadius":"0","background":"#67D4B2","width":"128px","lineHeight":"40px","fontSize":"14px","height":"40px"}' v-if="type!='info'" class="btn-close" @click="back()">取消</el-button>
				<el-button :style='{"border":"0px solid rgba(64, 158, 255, 1)","cursor":"pointer","padding":"0","margin":"0","outline":"none","color":"#fff","borderRadius":"0","background":"#67D4B2","width":"128px","lineHeight":"40px","fontSize":"14px","height":"40px"}' v-if="type=='info'" class="btn-close" @click="back()">返回</el-button>
			</el-form-item>
		</el-form>
    

  </div>
</template>
<script>
// 数字,邮件,手机,url,身份证校验
import { isNumber,isIntNumer,isEmail,isPhone, isMobile,isURL,checkIdCard } from "@/utils/validate";
export default {
	data() {
		let self = this
		var validateIdCard = (rule, value, callback) => {
			if(!value){
				callback();
			} else if (!checkIdCard(value)) {
				callback(new Error("请输入正确的身份证号码"));
			} else {
				callback();
			}
		};
		var validateUrl = (rule, value, callback) => {
			if(!value){
				callback();
			} else if (!isURL(value)) {
				callback(new Error("请输入正确的URL地址"));
			} else {
				callback();
			}
		};
		var validateMobile = (rule, value, callback) => {
			if(!value){
				callback();
			} else if (!isMobile(value)) {
				callback(new Error("请输入正确的手机号码"));
			} else {
				callback();
			}
		};
		var validatePhone = (rule, value, callback) => {
			if(!value){
				callback();
			} else if (!isPhone(value)) {
				callback(new Error("请输入正确的电话号码"));
			} else {
				callback();
			}
		};
		var validateEmail = (rule, value, callback) => {
			if(!value){
				callback();
			} else if (!isEmail(value)) {
				callback(new Error("请输入正确的邮箱地址"));
			} else {
				callback();
			}
		};
		var validateNumber = (rule, value, callback) => {
			if(!value){
				callback();
			} else if (!isNumber(value)) {
				callback(new Error("请输入数字"));
			} else {
				callback();
			}
		};
		var validateIntNumber = (rule, value, callback) => {
			if(!value){
				callback();
			} else if (!isIntNumer(value)) {
				callback(new Error("请输入整数"));
			} else {
				callback();
			}
		};
		return {
			id: '',
			type: '',
			
			
			ro:{
				luxianmingcheng : false,
				luxianleixing : false,
				shifadi : false,
				zhongdiandi : false,
				quanchengjuli : false,
				luxianxiangqing : false,
				luxiantupian : false,
			},
			
			
			ruleForm: {
				luxianmingcheng: '',
				luxianleixing: '',
				shifadi: '',
				zhongdiandi: '',
				quanchengjuli: '',
				luxianxiangqing: '',
				luxiantupian: '',
			},
		
			luxianleixingOptions: [],
			
			rules: {
				luxianmingcheng: [
				],
				luxianleixing: [
				],
				shifadi: [
				],
				zhongdiandi: [
				],
				quanchengjuli: [
				],
				luxianxiangqing: [
				],
				luxiantupian: [
				],
			}
		};
	},
	props: ["parent"],
	computed: {



	},
	created() {
	},
	methods: {
		
		// 下载
		download(file){
			window.open(`${file}`)
		},
		// 初始化
		init(id,type) {
			if (id) {
				this.id = id;
				this.type = type;
			}
			if(this.type=='info'||this.type=='else'){
				this.info(id);
			}else if(this.type=='logistics'){
				this.logistics=false;
				this.info(id);
			}else if(this.type=='cross'){
				var obj = this.$storage.getObj('crossObj');
				for (var o in obj){
						if(o=='luxianmingcheng'){
							this.ruleForm.luxianmingcheng = obj[o];
							this.ro.luxianmingcheng = true;
							continue;
						}
						if(o=='luxianleixing'){
							this.ruleForm.luxianleixing = obj[o];
							this.ro.luxianleixing = true;
							continue;
						}
						if(o=='shifadi'){
							this.ruleForm.shifadi = obj[o];
							this.ro.shifadi = true;
							continue;
						}
						if(o=='zhongdiandi'){
							this.ruleForm.zhongdiandi = obj[o];
							this.ro.zhongdiandi = true;
							continue;
						}
						if(o=='quanchengjuli'){
							this.ruleForm.quanchengjuli = obj[o];
							this.ro.quanchengjuli = true;
							continue;
						}
						if(o=='luxianxiangqing'){
							this.ruleForm.luxianxiangqing = obj[o];
							this.ro.luxianxiangqing = true;
							continue;
						}
						if(o=='luxiantupian'){
							this.ruleForm.luxiantupian = obj[o];
							this.ro.luxiantupian = true;
							continue;
						}
				}
				







			}
			
			
			// 获取用户信息
			this.$http({
				url: `${this.$storage.get('sessionTable')}/session`,
				method: "get"
			}).then(({ data }) => {
				if (data && data.code === 0) {
					
					var json = data.data;
				} else {
					this.$message.error(data.msg);
				}
			});
			
            this.luxianleixingOptions = "火车,汽车,飞机,轮船".split(',')
			
		},
    // 多级联动参数

    info(id) {
      this.$http({
        url: `jiaotongluxian/info/${id}`,
        method: "get"
      }).then(({ data }) => {
        if (data && data.code === 0) {
        this.ruleForm = data.data;
        //解决前台上传图片后台不显示的问题
        let reg=new RegExp('../../../upload','g')//g代表全部
        this.ruleForm.luxianxiangqing = this.ruleForm.luxianxiangqing.replace(reg,'../../../springboot655ms/upload');
        } else {
          this.$message.error(data.msg);
        }
      });
    },


    // 提交
    onSubmit() {














	if(this.ruleForm.luxiantupian!=null) {
		this.ruleForm.luxiantupian = this.ruleForm.luxiantupian.replace(new RegExp(this.$base.url,"g"),"");
	}

var objcross = this.$storage.getObj('crossObj');

      //更新跨表属性
       var crossuserid;
       var crossrefid;
       var crossoptnum;
       if(this.type=='cross'){
                var statusColumnName = this.$storage.get('statusColumnName');
                var statusColumnValue = this.$storage.get('statusColumnValue');
                if(statusColumnName!='') {
                        var obj = this.$storage.getObj('crossObj');
                       if(statusColumnName && !statusColumnName.startsWith("[")) {
                               for (var o in obj){
                                 if(o==statusColumnName){
                                   obj[o] = statusColumnValue;
                                 }
                               }
                               var table = this.$storage.get('crossTable');
                             this.$http({
                                 url: `${table}/update`,
                                 method: "post",
                                 data: obj
                               }).then(({ data }) => {});
                       } else {
                               crossuserid=this.$storage.get('userid');
                               crossrefid=obj['id'];
                               crossoptnum=this.$storage.get('statusColumnName');
                               crossoptnum=crossoptnum.replace(/\[/,"").replace(/\]/,"");
                        }
                }
        }
       this.$refs["ruleForm"].validate(valid => {
         if (valid) {
		 if(crossrefid && crossuserid) {
			 this.ruleForm.crossuserid = crossuserid;
			 this.ruleForm.crossrefid = crossrefid;
			let params = { 
				page: 1, 
				limit: 10, 
				crossuserid:this.ruleForm.crossuserid,
				crossrefid:this.ruleForm.crossrefid,
			} 
			this.$http({ 
				url: "jiaotongluxian/page", 
				method: "get", 
				params: params 
			}).then(({ 
				data 
			}) => { 
				if (data && data.code === 0) { 
				       if(data.data.total>=crossoptnum) {
					     this.$message.error(this.$storage.get('tips'));
					       return false;
				       } else {
					 this.$http({
					   url: `jiaotongluxian/${!this.ruleForm.id ? "save" : "update"}`,
					   method: "post",
					   data: this.ruleForm
					 }).then(({ data }) => {
					   if (data && data.code === 0) {
					     this.$message({
					       message: "操作成功",
					       type: "success",
					       duration: 1500,
					       onClose: () => {
						 this.parent.showFlag = true;
						 this.parent.addOrUpdateFlag = false;
						 this.parent.jiaotongluxianCrossAddOrUpdateFlag = false;
						 this.parent.search();
						 this.parent.contentStyleChange();
					       }
					     });
					   } else {
					     this.$message.error(data.msg);
					   }
					 });

				       }
				} else { 
				} 
			});
		 } else {
			 this.$http({
			   url: `jiaotongluxian/${!this.ruleForm.id ? "save" : "update"}`,
			   method: "post",
			   data: this.ruleForm
			 }).then(({ data }) => {
			   if (data && data.code === 0) {
			     this.$message({
			       message: "操作成功",
			       type: "success",
			       duration: 1500,
			       onClose: () => {
				 this.parent.showFlag = true;
				 this.parent.addOrUpdateFlag = false;
				 this.parent.jiaotongluxianCrossAddOrUpdateFlag = false;
				 this.parent.search();
				 this.parent.contentStyleChange();
			       }
			     });
			   } else {
			     this.$message.error(data.msg);
			   }
			 });
		 }
         }
       });
    },
    // 获取uuid
    getUUID () {
      return new Date().getTime();
    },
    // 返回
    back() {
      this.parent.showFlag = true;
      this.parent.addOrUpdateFlag = false;
      this.parent.jiaotongluxianCrossAddOrUpdateFlag = false;
      this.parent.contentStyleChange();
    },
    luxiantupianUploadChange(fileUrls) {
	    this.ruleForm.luxiantupian = fileUrls;
    },
  }
};
</script>
<style lang="scss" scoped>
	.amap-wrapper {
		width: 100%;
		height: 500px;
	}
	
	.search-box {
		position: absolute;
	}
	
	.el-date-editor.el-input {
		width: auto;
	}
	
	.add-update-preview .el-form-item /deep/ .el-form-item__label {
	  	  padding: 0 10px 0 0;
	  	  color: #666;
	  	  font-weight: 500;
	  	  width: 120px;
	  	  font-size: 14px;
	  	  line-height: 40px;
	  	  text-align: center;
	  	}
	
	.add-update-preview .el-form-item /deep/ .el-form-item__content {
	  margin-left: 120px;
	}
	
	.add-update-preview .el-input /deep/ .el-input__inner {
	  	  border: 2px solid #797979;
	  	  border-radius: 0;
	  	  padding: 0 12px;
	  	  box-shadow: 0 0 0px rgba(64, 158, 255, .5);
	  	  outline: none;
	  	  color: #000;
	  	  width: 400px;
	  	  font-size: 14px;
	  	  height: 40px;
	  	}
	
	.add-update-preview .el-select /deep/ .el-input__inner {
	  	  border: 2px solid #797979;
	  	  border-radius: 0;
	  	  padding: 0 10px;
	  	  box-shadow: 0 0 0px rgba(64, 158, 255, .5);
	  	  outline: none;
	  	  color: #000;
	  	  width: 300px;
	  	  font-size: 14px;
	  	  height: 40px;
	  	}
	
	.add-update-preview .el-date-editor /deep/ .el-input__inner {
	  	  border: 2px solid #797979;
	  	  border-radius: 0;
	  	  padding: 0 10px 0 30px;
	  	  box-shadow: 0 0 0px rgba(64, 158, 255, .5);
	  	  outline: none;
	  	  color: #000;
	  	  width: 300px;
	  	  font-size: 14px;
	  	  height: 40px;
	  	}
	
	.add-update-preview /deep/ .el-upload--picture-card {
		background: transparent;
		border: 0;
		border-radius: 0;
		width: auto;
		height: auto;
		line-height: initial;
		vertical-align: middle;
	}
	
	.add-update-preview /deep/ .upload .upload-img {
	  	  border: 2px solid #797979;
	  	  cursor: pointer;
	  	  border-radius: 6px;
	  	  color: #797979;
	  	  width: 90px;
	  	  font-size: 32px;
	  	  line-height: 90px;
	  	  text-align: center;
	  	  height: 90px;
	  	}
	
	.add-update-preview /deep/ .el-upload-list .el-upload-list__item {
	  	  border: 2px solid #797979;
	  	  cursor: pointer;
	  	  border-radius: 6px;
	  	  color: #797979;
	  	  width: 90px;
	  	  font-size: 32px;
	  	  line-height: 90px;
	  	  text-align: center;
	  	  height: 90px;
	  	}
	
	.add-update-preview /deep/ .el-upload .el-icon-plus {
	  	  border: 2px solid #797979;
	  	  cursor: pointer;
	  	  border-radius: 6px;
	  	  color: #797979;
	  	  width: 90px;
	  	  font-size: 32px;
	  	  line-height: 90px;
	  	  text-align: center;
	  	  height: 90px;
	  	}
	
	.add-update-preview .el-textarea /deep/ .el-textarea__inner {
	  	  border: 2px solid #797979;
	  	  border-radius: 0;
	  	  padding: 12px;
	  	  box-shadow: 0 0 0px rgba(64, 158, 255, .5);
	  	  outline: none;
	  	  color: #000;
	  	  width: 400px;
	  	  font-size: 14px;
	  	  height: 120px;
	  	}
</style>

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值