成都搜索优化排名公司_免费网站诊断_产品推广方案英文_个人域名备案转企业备案 keywords 注意事项 (可以方便查询,辅助搜索引擎理解页面)">

ui 模板

商场美陈设计、上海企业查询电话、永久使用、不限域名、安阳头条

深圳公司注册咨询?

成都搜索优化排名公司_免费网站诊断_产品推广方案英文_个人域名备案转企业备案

  1. 系统设计
    1. 系统架构设计

本黄冈旅游景点服务网站的架构设计主要分为可以3层,主要有Web层,业务层,Model层。其中web层还包括View层和Controller层,Model层包括元数据扩展层和数据访问层。

系统架构如下图所示。

图4-1 系统架构

    1. 系统总体设计

黄冈旅游景点服务网站总体分为前台用户模块和后台管理员模块。

两个模块表现上是分别独立存在,但是访问的数据库是一样的。每一个模块的功能都是根据先前完成的需求分析,并查阅相关资料后整理制作的。

综上所述,系统功能结构图如下图所示。

图4-2 系统功能结构图

    1. 系统功能设计

登录模块:登录模块是进入系统的入口,所有用户必须登录后才能访问系统。登录需要输入用户名和密码,如果多次尝试登录需要输入验证码。登录时需要选择用户的角色,是一般用户还是管理员登录等。登录成功后,会通过数据库获取用户的权限,并跳转至用户的主页面。

订单模块:订单模块促进用户对商品进行购买,查看某个商品详情。

资讯数据模块:可分为资讯数据浏览、资讯数据检索、资讯数据维护三个模块,管理员对资讯数据有维护的权限,发布新的资讯数据、更新已有的资讯数据等。

景点管理模块:景点管理分为景点添加、修改和景点购票。景点信息由管理员进行修改、添加、删除操作;景点购票由普通用户来执行。

酒店管理模块:酒店管理分为酒店添加、修改和酒店预订。酒店信息由管理员进行修改、添加、删除操作;酒店预订由普通用户来执行。

    1. 数据库设计
      1. 数据需求分析

从前面可以分析到数据库中最重要的是景点信息,用户信息,购物信息,同时存在酒店信息和预订信息。分析可以得到如下数据描述:

平台用户:用于记录用户的各种信息,包括用户名、密码、基本情况信息,信誉、发布信息数等数据项。

管理员:记录管理员的登录信息。包括用户名,密码,权限等数据项。

景点:存放给景点的内容,包括景点名称、景点类型、联系电话、票价、地址、星级、开放时间、照片等数据项。

酒店:存储各种酒店信息。包括酒店名称、图片、地址、联系电话、房型、价格等数据项。

当地特产:存储商品的分类、价格、详情、购买数量、总价格、联系电话、购买人、是否支付等数据项。

酒店预订。存储用户的酒店预订信息。包括酒店预订的订单号、酒店编号、酒店名称、房型、价格、预订天数、总价格、入住时间、联系电话、预订人、是否支付等数据项。

资讯数据:存储平台内的资讯数据内容。包括标题,资讯数据内容,时间等数据项。

      1. 数据库概念设计

根据前面的数据流程图,结合系统的功能模块设计,设计出符合系统的各信息实体。

系统ER图如下图所示。

图4-3 系统ER图

      1. 数据库表设计

黄冈旅游景点服务网站所拥有的数据表有以下:由于数据表较多,只展示系统主要数据表,如下表所示。

hotel_orders

字段名称

类型

长度

不是null

主键

字段说明

hotel_orders_id

int

11

主键

酒店订单ID

user_name

int

11

用户姓名

hotel_name

varchar

64

酒店名称

hotel_information

varchar

64

酒店信息

hotel_star

varchar

64

酒店星级

number_of_rooms_reserved

int

11

预订房间数量

check_in_time

date

0

入住时间

check_out

date

0

退房日期

remarks

varchar

64

备注

recommend

int

11

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

local_specialities

字段名称

类型

长度

不是null

主键

字段说明

local_specialities_id

int

11

主键

当地特产ID

commodity_specifications

varchar

64

商品规格

recommend

int

11

智能推荐

cart_title

varchar

125

标题

cart_img

text

0

封面图

cart_description

varchar

255

描述

cart_price_ago

double

8

原价

cart_price

double

8

卖价

cart_inventory

int

11

商品库存

cart_type

varchar

64

商品分类

cart_content

longtext

0

正文产品的主体内容

cart_img_1

text

0

主图1

cart_img_2

text

0

主图2

cart_img_3

text

0

主图3

cart_img_4

text

0

主图4

cart_img_5

text

0

主图5

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

logistics_information

字段名称

类型

长度

不是null

主键

字段说明

logistics_information_id

int

11

主键

物流信息ID

consignee

int

11

收货人

courier_services_company

varchar

64

快递公司

order_no

varchar

64

订单编号

order_status

varchar

64

物流状态

contact_number

varchar

64

联系电话

ship_to_address

varchar

64

收货地址

courier_number

varchar

64

快递单号

recommend

int

11

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

order

字段名称

类型

长度

不是null

主键

字段说明

order_id

int

11

主键

订单ID

order_number

varchar

64

订单号

goods_id

mediumint

8

商品id

title

varchar

32

商品标题

img

varchar

255

商品图片

price

double

10

价格

price_ago

double

10

原价

num

int

8

数量

price_count

double

8

总价

norms

varchar

255

规格

type

varchar

64

商品分类

contact_name

varchar

32

联系人姓名

contact_email

varchar

125

联系人邮箱

contact_phone

varchar

11

联系人手机

contact_address

varchar

255

收件地址

postal_code

varchar

9

邮政编码

user_id

int

10

买家ID

merchant_id

mediumint

8

商家ID

create_time

timestamp

0

创建时间

update_time

timestamp

0

更新时间

description

varchar

255

描述

state

varchar

16

订单状态

ordinary_users

字段名称

类型

长度

不是null

主键

字段说明

ordinary_users_id

int

11

主键

普通用户ID

user_name

varchar

64

用户姓名

user_gender

varchar

64

用户性别

user_age

int

11

用户年龄

examine_state

varchar

16

审核状态

recommend

int

11

智能推荐

user_id

int

11

用户ID

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

scenic_hotel

字段名称

类型

长度

不是null

主键

字段说明

scenic_hotel_id

int

11

主键

景点酒店ID

hotel_name

varchar

64

酒店名称

hotel_pictures

varchar

255

酒店图片

hotel_information

varchar

64

酒店信息

hotel_star

varchar

64

酒店星级

number_of_remaining_rooms

int

11

剩余房间数量

hotel_features

varchar

64

酒店特色

hotel_introduction

text

0

酒店介绍

hits

int

11

点击数

praise_len

int

11

点赞数

recommend

int

11

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

scenic_spot_information

字段名称

类型

长度

不是null

主键

字段说明

scenic_spot_information_id

int

11

主键

景点信息ID

name_of_scenic_spot

varchar

64

景点名称

pictures_of_scenic_spots

varchar

255

景点图片

scenic_spot_information

varchar

64

景点信息

scenic_spot_features

varchar

64

景点特色

ticket_price

varchar

64

门票价钱

location_of_scenic_spots

varchar

64

景点位置

attraction_details

text

0

景点详情

hits

int

11

点击数

praise_len

int

11

点赞数

recommend

int

11

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

tourism_strategy

字段名称

类型

长度

不是null

主键

字段说明

tourism_strategy_id

int

11

主键

旅游攻略ID

name_of_scenic_spot

varchar

64

景点名称

pictures_of_scenic_spots

varchar

255

景点图片

scenic_spot_features

varchar

64

景点特色

strategy_information

varchar

64

攻略信息

publish_user

int

11

发布用户

user_name

varchar

64

用户姓名

release_date

date

0

发布日期

introduction_details

text

0

攻略详情

hits

int

11

点击数

praise_len

int

11

点赞数

examine_state

varchar

16

审核状态

examine_reply

varchar

16

审核回复

recommend

int

11

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

  1. 系统实现
    1. 数据库访问层的实现

该系统是通过jdbc和Mysql达成连接的,新建一个jdbc.properties文件来填写与数据库连接所需要的驱动和参数。

jdbc.driverClass=com.Mysql.jdbc.Driver

jdbc.url=jdbc:Mysql://localhost:3306/tsi

jdbc.username=root

jdbc.password=123

第一个参数代表Mysql数据库的驱动,第二个参数代表要连接的数据库,第三个和第四个参数代表数据库连接名和密码。

后台与数据库访问主要是通过HQL语句来进行查询的,查询语句中的表名是表格的实体类名,在这种查询语句中*是不允许使用的,除非适合聚合函数一起使用才可以。

    1. 注册模块的实现

用户在填写数据的时候必须与注册页面上的验证相匹配否则会注册失败,注册页面的表单验证是通过JavaScript进行验证的,用户名的长度必须在6到18之间,邮箱必须带有@符号,密码和密码确认必须相同,你输入的密码,系统会根据你输入密码的强度给出指定的值,电话号码和身份证号码必须要求输入格式与生活相符合,当你前台验证通过的时候你点击注册,表单会将你输入的值通过name值传递给后台并保存到数据库中。

用户注册流程图如下图所示。

图5-1用户注册流程图

用户注册界面如下图所示。

图5-2用户注册界面

用户注册的关键代码如下。

   /**

     * 注册

     * @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);

}

    1. 登录模块的实现

主要由两部分组成,登录前的登录界面以及登录后的用户功能界面。登录界面,要求用户输入用户名和密码,当用户名和密码其中一个输入为空时,给出提示“用户名,密码不能为空”。获取用户名和密码后到数据库中查找,如果用户名存在,以及对应的密码正确,则登录成功,否则登录失败。登录失败后给出提示,并把焦点停在文本框中。登录成功后将该次会话的全局变量username设置为用户名。登录成功后进入会员的功能模块,主要有会员基本信息修改,已经发布景点信息管理,发布信息,和退出功能。退出功能是清除全局变量username的值,并跳回到首页。

登录流程图如下图所示。

图5-4登录流程图

用户登录界面如下图所示。

图5-5用户登录界面

用户登录的关键代码如下。

  /**

     * 登录

     * @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;

}

    1. 用户资料修改模块的实现

用户登录/注册成功之后可以修改自己的基本信息。修改页面的表单中每一个input的name值都要与实体类中的参数相匹配,在用户点击修改页面的时候,如果改后用户名与数据库里面重复了,页面会提示该用户名已经存在了,否则通过Id来查询用户,并将用户的信息修改为表单提交的数据。

    1. 资讯数据管理模块的实现

如果资讯数据的信息需要修改,管理员可以通过查询资讯数据的基本信息来查询资讯数据,查询资讯数据是通过ajax技术来进行查询的,需要传递资讯数据的标题、编号等参数然后在返回到该页面中,可以选中要修改或删除的那条信息,如果选中了超过一条数据,页面会挑一个窗口提醒只能选择一条数,如果没有选中数据会挑一个窗口题型必须选择一条数据。当选择确认修改的时候,后台会根据传过来的id到数据库查询,并将结果返回到修改页面中,可以在修改页面中修改刚刚选中的信息当点击确认的时候from表单会将修改的数据提交到后台并保存到数据库中,就是说如果提交的数据数据库中存在就修改,否则就保存。

资讯数据展示界面如下图所示。

图5-6资讯数据展示界面

资讯数据管理界面如下图所示。

图5-7资讯数据管理界面

资讯数据发布的关键代码如下。

     Map<String, Object> map = new HashMap<>();

        map.put("error", new HashMap<String, Object>(4) {{

            put("code", code);

            put("message", message);

        }});

        return map;

}

    1. 预订酒店模块的实现

预订酒店功能整体流程:用户浏览酒店信息时,同时会显示酒店的状态,系统会在其显示详细信息的页面时便会判断酒店的状态,若酒店状态为可预订,则会显示预订的链接按钮。在用户点击预订按钮时,会先通过拦截器判断用户是否登录,若未登录,会跳转至登录页面,提示用户先登录,若为登录用户就会跳转至填写预订信息的页面,填写好预订信息之后,点击提交按钮,预订成功之后返回提示信息,告知用户预订成功。

预订酒店流程图如下图所示。

图5-8预订酒店流程图

预订酒店界面如下图所示。

图5-8预订酒店界面

预订管理界面如下图所示。

图5-9预订管理界面

预订添加关键代码如下。

  @RequestMapping("/get_obj")

    public Map<String, Object> obj(HttpServletRequest request) {

        List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));

        if (resultList.size() > 0) {

            JSONObject jsonObject = new JSONObject();

            jsonObject.put("obj",resultList.get(0));

            return success(jsonObject);

        } else {

            return success(null);

        }

}

    1. 景点管理模块的实现

此页面的关键是编写景点信息,包括景点编号,名称,详情等。单击提交按钮以完成信息的添加。如果未写入完整的景点信息,例如,如果未写入景点编号,系统将给出相应的错误提示,并且无法成功输入。数据以概念的形式以onsubmit =“return checkForm()”的形式写入以进行检查,checkForm()函数是一种用于写入数据的不同类型的校对方法,是不是为空也是经过form表单中的οnsubmit=”return checkForm()来检查。

管理员点击左侧菜单“景点信息管理”,页面跳转到景点信息管理外观,调用后台景点查询所有景点信息。并将信息密封到数据集合List,绑定到请求对象,然后页面跳转到相应的jsp,显示出景点信息,单击删除按钮完成景点信息的删除。

景点管理流程图如下图所示。

图5-10景点管理流程图

景点添加界面如下图所示。

图5-11景点添加界面

景点管理界面如下图所示。

图5-12景点管理界面

景点发布的关键代码如下。

 @PostMapping("/add")

    @Transactional

    public Map<String, Object> add(HttpServletRequest request) throws IOException {

        service.insert(service.readBody(request.getReader()));

        return success(1);

    }

    @Transactional

    public Map<String, Object> addMap(Map<String,Object> map){

        service.insert(map);

        return success(1);

}

%>

    1. 酒店管理模块的实现

根据需求,需要对酒店进行添加、删除或修改详情信息。删除或修改酒店时,系统根据酒店的状态判定为可删除状态下,才会给出删除和修改链接,点击删除链接按钮时,请求到达后台,还会先查询酒店状态再次做出判定能否删除。点击修改链接按钮时,会跳转到修改信息的页面,重新填写好数据后,数据提交到后台会对数据库中相应的记录做出修改。

添加酒店时,会给出数据填写的页面,该页面根据填写好的酒店编号同样会事先发送Ajax请求查询编号是否已存在,数据填写好之后提交到后台,会调用相关服务在数据库中插入记录。

酒店管理流程图如下图所示。

图5-13酒店管理流程图

酒店添加页面设计效果如下图所示。

图5-14酒店添加界面

酒店管理页面效果如下图所示。

图5-15酒店管理界面

酒店发布的关键代码如下。

  @RequestMapping(value = "/del")

    @Transactional

    public Map<String, Object> del(HttpServletRequest request) {

        service.delete(service.readQuery(request), service.readConfig(request));

        return success(1);

}

小鸟网站logo如何用dw制作网页搜索栏重庆商业网站建设费用个人社保缴费基数如何计算办公空间设计手绘网站开发合同范本最新智能手机网手机资源上海中学门户网站官网2022年最流行的装修风格图片嘉兴南湖疫情最新消息广州演出舞台搭建公司四川建筑信息查询网网络工程师以后出来干嘛表白网站网址合肥最新新闻事件会员卡充值消费系统怎么做设计制作文字鸿蒙手机应用开发河北建筑工程平台邯郸一中网站海洋互联网泰安市建设局一体化平台网站导航设计大全精美ppt作品欣赏建设局个人为民办实事清单如何制作软件图标进一步优化购房资格复核顺位 如何认定 赠与 为什么要调整无房家庭资格顺位代办公司可靠吗中国室内设计人网怎样制作图片文字图片信阳信息港

猜你喜欢

  • 友情链接:
  • 网站设计规划说明 新工艺新材料 动漫设计与制作课件 建设局个人为民办实事清单 西安有几个区都叫什么区 搜索引擎统计