系列文章目录
目录
前言
随着旅游行业的不断发展,各家旅游行业之间的竞争日益激烈,旅游部门所需的信息量越来越大,业务操作中涉及的各种线路情况、用户情况以及旅游协作部门的情况越来越复杂多变。而除了一些个别地区已采用了的旅游网站,一般通常是以原始的手工方式处理/新闻资讯。但是工作人员若仅靠手工方式处理大量资料,很可能带来出错率的增长以及大量资源的浪费和闲置等问题。因此,只有加强对旅游信息资源的整合、统一管理,才能使旅游部门运行更加合理、高效地运转。本文是根据旅游行业的这种现状,提出解决问题的一个可行性方法:采用现代化统一的计算机网络系统,实现了旅游管理的网络化,各类信息有序地进行存储,同时采用了权限认证的方式,本系统有管理员与用户,只有经过了系统权限认证之后,方可进入系统主控界面,进行信息管理,推荐查询,在线组队,线路规划等功能的使用。
该系统开发环境为的数据库是Mysql,使用PHP技术开发,B/S结构,是本系统的开发平台。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
一、相关技术
开发语言:PHP
框架:原生php/thinkphp5
服务器:Apache
数据库:MySQL57
数据库管理工具:Navicat
运行软件:小皮phpstudy
二、系统设计
1.系统体系结构
结构图:
登录系统结构图
系统结构图
2.数据库设计原则
每个数据库的应用它们都是和区分开的,当运行到一定的程序当中,它就会与自己相关的协议与用户端进行通讯。那么这个系统就会对使这些数据进行连接。当我们选择哪个桥段的时候,接下来就会简单的叙述这个数据库是如何来创建的。当点击完成按钮的时候就会自动在对话框内弹出数据源的名称,在进行点击下一步即可,直接在输入相对应的身份验证和登录密码。
旅游见闻的数据流程:
用户信息:用户名、密码、用户姓名、头像、性别、手机号码、邮箱实体E-R图
景点推荐信息:景点名称、图片、景点星级、景点介绍、地址、城市、门票价格、营业时间、注意事项E-R图
3.系统UML用例分析
管理员登录后可进行首页、个人中心、用户管理、景点推荐管理、特色美食管理、酒店青旅管理、路线规划管理、休闲娱乐管理、结伴同行管理、结伴同行管理、视频类型管理、新闻资讯、留言板管理、系统管理
用户后台:首页、个人中心、景点推荐管理、特色美食管理、酒店青旅管理、路线规划管理、休闲娱乐管理、结伴同行管理、结伴同行管理、视频类型管理、留言板管理、我的收藏管理
三、系统页面
1.管理员功能页面
登陆、管理员输入个人的账号、密码、角色登录系统,这时候系统的数据库就会在进行查找相关的信息,如果我们输入的账号、密码不正确,数据库就会提示出错误的信息提示,同时会提示管理员重新输入自己的账号、密码,直到账号密码输入成功后,会提登录成功的信息。
首页:管理员进入到界面,通过界面的任务大厅,登录成功后进入到系统可以进行查看首页、个人中心、用户管理、景点推荐管理、特色美食管理、酒店青旅管理、路线规划管理、休闲娱乐管理、结伴同行管理、留言板管理、系统管理等功能模块,进行相对应操作。
管理员对用户信息可编辑用户名、密码、用户姓名、头像、性别、手机号码、邮箱并进行添加、删除、修改以及查看。
景点推荐管理:管理员通过列表可以获取查看编辑景点名称、图片、景点星级、景点介绍、地址、城市、门票价格、营业时间、注意事项等信息,进行详情、修改操作。
酒店青旅管理:管理员通过列表可以获取酒店名称、图片、酒店类型、星级、酒店介绍、酒店地址、联系电话等信息,进行查看评论、详情、修改、删除操作。
休闲娱乐管理:管理员通过列表可以获取娱乐名称、图片、详情介绍、打卡地点、城市、人均消费等信息,进行查看评论、详情、修改、删除操作。
结伴同行管理:管理员通过列表可以获取景点名称、图片、景点介绍、地址、结伴内容、结伴人数、出发时间、用户名、用户姓名、发布日期等信息,进行查看评论、详情、修改、删除操作。
系统管理:管理员通过系统管理页面查看轮播图/新闻资讯等进行上传图片,资讯发布进行添加、删除、修改以及查看并对整个系统进行维护等操作。
2.用户功能页面
首页:用户进入到界面,通过界面的任务大厅,登录成功后进入到系统可以进行查看首页、个人中心、结伴同行管理、我的收藏管理等功能模块。
结伴同行管理,在结伴同行页面可以新增景点名称、图片、景点介绍、地址、结伴内容、结伴人数、出发时间、用户名、用户姓名、发布日期等内容,并进行提交/取消、添加、删除、修改操作操作。
我的收藏管理,在收藏管理页面可以查看收藏名称、收藏图片等等内容,并进行详情查看,修改,等操作。
3.前台功能页面
首页:用户通过首页列表可以查看首页、景点推荐、特色美食、酒店青旅、结伴同行、新闻资讯、留言反馈、个人中心、后台管理、客服等内容。
注册、用户登陆,在注册页面可以填写用户名、密码、用户姓名、手机号码、邮箱等详细内容,进行注册、登录。
景点推荐,在景点推荐页面通过景点名称、图片、景点星级、景点介绍、地址、城市、门票价格、营业时间、注意事项等信息进行查看、评论。
特色美食,用户在特色美食页面可查看、评论操作。
路线规划,在路线规划页面可查看、搜索、评论、收藏。
个人中心,用户在个人信息页面可进行编辑用户名、密码、用户姓名、头像、性别、手机号码、邮箱进行添加、修改、删除操作。
四、核心代码
<?php
session_start();
class UsersController extends CommonController {
public function __construct()
{
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE");
header('Access-Control-Allow-Headers:Origin,Content-Type,Accept,token,X-Requested-With,device');
}
public $columData = [
'id','addtime','username','password','role'
];
/**
* 登录接口
* POST
* */
public function login(){
$username = isset($_REQUEST['username'])?$_REQUEST['username']:"";
$password = isset($_REQUEST['password'])?$_REQUEST['password']:"";
$sql = "select * from `users` where username = '".$username."' and password = '".$password."'";
$result = table_sql($sql);
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
$token_array = [
"iat" => time(), //签发时间
"exp" => time()+7200, //token 过期时间
'tablename'=> 'users',//表名
'isAdmin' => 1,
'id' => $row["id"],
"success" => $row,//记录的uid的信息,如果有其它信息,可以再添加数组的键值对
];
$tokens = base64_encode(json_encode($token_array));
$data = ['code' => 0, 'token' => $tokens];
exit(json_encode($data));
}
} else {
exit(json_encode(['code'=>500,'msg'=>"账号或密码错误"]));
}
}
/**
* 退出
* post
*/
public function logout(){
$token = $this->token();
unset($token);
exit(json_encode(['code'=>0,'msg'=>'退出成功']));
}
/**
* 获取session
*/
public function session(){
$token = $this->token();
$data = json_decode(base64_decode($token),true);
$arrayData = $data['success'];
exit(json_encode(['code'=>0,'data'=>$arrayData]));
}
/**
* 找回密码 重置为123456
**/
public function resetPass(){
$username = input('post.username');
$counts = "select * from `users` where username = '".$username."'";
$cotte = table_sql($counts);
if($cotte->num_rows<1){
exit(json_encode(['code'=>500,'msg'=>"用户名错误。"]));
}
$sql = "update users set password = '123456' where username = '".$username."'";
$result = table_sql($sql);
if($result) exit(json_encode(['code'=>500,'msg'=>"重置密码错误。"]));
exit(json_encode(['code'=>0,'msg'=>"密码已重置为:123456"]));
}
/**
* 分页,列表
* get
*/
public function page(){
$token = $this->token();
$tokens = json_decode(base64_decode($token),true);
if (!isset($tokens['id']) || empty($tokens['id'])) exit(json_encode(['code'=>403,'msg'=>"你还没有登录。"]));
$userid = $tokens['id'];
$page = isset($_REQUEST['page'])?$_REQUEST['page']:"1";
$limt = isset($_REQUEST['limit'])?$_REQUEST['limit']:"10";
$sort = isset($_REQUEST['sort'])?$_REQUEST['sort']:"id";
$order = isset($_REQUEST['order'])?$_REQUEST['order']:"asc";
$where = "";//查询条件
$sql = "select * from `users`".$where;
$count = table_sql($sql);
if ($count->num_rows < 1){
$numberCount = 1;
}else{
$numberCount = $count->num_rows;
}
$page_count = ceil($numberCount/$limt);//页数
$startCount = ($page-1)*10;
$lists = "select * from `users` ".$where." order by ".$sort." ".$order." limit ".$startCount.",".$limt;
$result = table_sql($lists);
$arrayData = array();
if ($result->num_rows > 0) {
while ($datas = $result->fetch_assoc()){
array_push($arrayData,$datas);
}
}
exit(json_encode([
'code'=>0,
'data' => [
"total" => $count,
"pageSize" => $limt,
"totalPage" => $page_count,
"currPage" => $page,
"list" => $arrayData
]
]));
}
/**
* 新增数据接口
* post
*/
public function save(){
$token = $this->token();
$tokens = json_decode(base64_decode($token),true);
if (!isset($tokens['id']) || empty($tokens['id'])) exit(json_encode(['code'=>403,'msg'=>"你还没有登录。"]));
$userid = $tokens['id'];
$keyArr = $valArr = array();
$tmpData = strval(file_get_contents("php://input"));//Content-Type: application/json 需要用到php://input 处理输入流
if (!empty($tmpData)&& isset($tmpData)){
$postData = json_decode($tmpData,true);
foreach ($postData as $key => $value){
if (in_array($key, $this->columData)){
array_push($keyArr,"`".$key."`");
array_push($valArr,"'".$value."'");
}
}
}
$k = implode(',',$keyArr);
$v = implode(',',$valArr);
$sql = "INSERT INTO `users` (".$k.") VALUES (".$v.")";
$result = table_sql($sql);
if (!$result) exit(json_encode(['code'=>500,'msg'=>"新增失败"]));
exit(json_encode(['code'=>0]));
}
/**
* 更新接口
* post
*/
public function update(){
$tmpData = strval(file_get_contents("php://input"));
$postData = json_decode($tmpData,true);
$v = array();
foreach ($postData as $key => $value){
if (in_array($key, $this->columData)){
array_push($v,$key." = '".$value."'");
}
}
$value = implode(',',$v);
$sql = "UPDATE users SET ".$value;
$result = table_sql($sql);
if (!$result) exit(json_encode(['code'=>500,'msg'=>"修改失败"]));
exit(json_encode(['code'=>0]));
}
/**
* 删除
* post
*/
public function delete(){
$ids = strval(file_get_contents("php://input"));//发现接收的是字符串
preg_match_all('/\d+/',$ids,$arr);
$str = implode(',',$arr[0]);//拼接字符,
$sql = "delete from users WHERE id in({$str})";
$result = table_sql($sql);
if (!$result) exit(json_encode(['code'=>500,'msg'=>"删除失败。"]));
exit(json_encode(['code'=>0]));
}
/**
* 查询一条数据
* get
*/
public function info($id=false){
$token = $this->token();
$tokens = json_decode(base64_decode($token),true);
if (!isset($tokens['id']) || empty($tokens['id'])) exit(json_encode(['code'=>403,'msg'=>"你还没有登录。"]));
$userid = $tokens['id'];
$name = isset($_REQUEST['name'])? $_REQUEST['name']:"";
if (!empty($id)){
$where = "`id` = ".$id;
}else{
$where = "`name` = ".$name;
}
$sql = "select * from `users` where ".$where;
$result = table_sql($sql);
if (!$result) exit(json_encode(['code'=>500,'msg'=>"查询数据发生错误。"]));
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
$lists = $row;
}
}
exit(json_encode([
'code'=>0,
'data'=> $lists
]));
}
}