免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

小程序 0

大家好,我是java1234_小锋老师,看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,分享下哈。

项目视频演示

【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端) Java毕业设计_哔哩哔哩_bilibili【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端) Java毕业设计项目来自互联网,免费开源分享,严禁商业。更多毕业设源码:http://www.java1234.com/a/bysj/javaweb/, 视频播放量 115、弹幕量 0、点赞数 5、投硬币枚数 0、收藏人数 2、转发人数 1, 视频作者 java1234官方, 作者简介 公众号:java1234 微信:java9266,相关视频:打造前后端分离 权限系统 基于SpringBoot2+SpringSecurity+Vue3.2+Element Plus 视频教程 (火爆连载更新中..),实战springboot+CAS单点登录系统,【免费】微信小程序扫码点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) Java毕业设计,非常好的源码,小而美,小而精,Java组件项目完结撒花!一周可以学习完成!,【免费】微信小程序投票系统(uni-app+SpringBoot后端+Vue3管理端技术实现) Java毕业设计,非常好的源码,SpringBoot微信小程序电商实战项目课程 Vue3.2 Element Plus后台管理 ( 火爆连载更新中... ),2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~,【Java实战项目】基于jsp和servlet的图书馆借阅管理系统(源码+数据库)_毕业设计_Java项目_Java毕设_Jsp架构,【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) Java毕业设计,非常好的源码,【免费】springboot+vue前后端音乐网系统icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Uy411a7RF/

项目介绍

随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了智慧旅游平台开发微信小程序的开发全过程。通过分析智慧旅游平台开发微信小程序管理的不足,创建了一个计算机管理智慧旅游平台开发微信小程序的方案。文章介绍了智慧旅游平台开发微信小程序的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。

本智慧旅游平台开发微信小程序功能有管理员和用户。管理员功能有个人中心,用户管理,景点分类管理,旅游景点管理,景点购票管理,景区活动管理,留言板管理,系统管理。用户可以查看景点信息,活动信息,还可以购票,以及留言。因而具有一定的实用性。

本站后台采用Java的SpringBoot框架进行后台管理开发,可以在浏览器上登录进行后台数据方面的管理,MySQL作为本地数据库,微信小程序用到了微信开发者工具,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得智慧旅游平台开发微信小程序管理工作系统化、规范化。

系统展示

部分代码

package com.controller;import java.util.Arrays;import java.util.Calendar;import java.util.Date;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import com.annotation.IgnoreAuth;import com.baomidou.mybatisplus.mapper.EntityWrapper;import com.entity.TokenEntity;import com.entity.UserEntity;import com.service.TokenService;import com.service.UserService;import com.utils.CommonUtil;import com.utils.MD5Util;import com.utils.MPUtil;import com.utils.PageUtils;import com.utils.R;import com.utils.ValidatorUtils;/** * 登录相关 */@RequestMapping("users")@RestControllerpublic class UserController{		@Autowired	private UserService userService;		@Autowired	private TokenService tokenService;	/**	 * 登录	 */	@IgnoreAuth	@PostMapping(value = "/login")	public R login(String username, String password, String captcha, HttpServletRequest request) {		UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));		if(user==null || !user.getPassword().equals(password)) {			return R.error("账号或密码不正确");		}		String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());		return R.ok().put("token", token);	}		/**	 * 注册	 */	@IgnoreAuth	@PostMapping(value = "/register")	public R register(@RequestBody UserEntity user){//    	ValidatorUtils.validateEntity(user);    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {    		return R.error("用户已存在");    	}        userService.insert(user);        return R.ok();    }	/**	 * 退出	 */	@GetMapping(value = "logout")	public R logout(HttpServletRequest request) {		request.getSession().invalidate();		return R.ok("退出成功");	}		/**     * 密码重置     */    @IgnoreAuth	@RequestMapping(value = "/resetPass")    public R resetPass(String username, HttpServletRequest request){    	UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));    	if(user==null) {    		return R.error("账号不存在");    	}    	user.setPassword("123456");        userService.update(user,null);        return R.ok("密码已重置为:123456");    }		/**     * 列表     */    @RequestMapping("/page")    public R page(@RequestParam Map<String, Object> params,UserEntity user){        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();    	PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));        return R.ok().put("data", page);    }	/**     * 列表     */    @RequestMapping("/list")    public R list( UserEntity user){       	EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();      	ew.allEq(MPUtil.allEQMapPre( user, "user"));         return R.ok().put("data", userService.selectListView(ew));    }    /**     * 信息     */    @RequestMapping("/info/{id}")    public R info(@PathVariable("id") String id){        UserEntity user = userService.selectById(id);        return R.ok().put("data", user);    }        /**     * 获取用户的session用户信息     */    @RequestMapping("/session")    public R getCurrUser(HttpServletRequest request){    	Long id = (Long)request.getSession().getAttribute("userId");        UserEntity user = userService.selectById(id);        return R.ok().put("data", user);    }    /**     * 保存     */    @PostMapping("/save")    public R save(@RequestBody UserEntity user){//    	ValidatorUtils.validateEntity(user);    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {    		return R.error("用户已存在");    	}        userService.insert(user);        return R.ok();    }    /**     * 修改     */    @RequestMapping("/update")    public R update(@RequestBody UserEntity user){//        ValidatorUtils.validateEntity(user);    	UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));    	if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {    		return R.error("用户名已存在。");    	}        userService.updateById(user);//全部更新        return R.ok();    }    /**     * 删除     */    @RequestMapping("/delete")    public R delete(@RequestBody Long[] ids){        userService.deleteBatchIds(Arrays.asList(ids));        return R.ok();    }}
<template>  <div>    <div class="container loginIn" style="backgroundImage: url(http://codegen.caihongy.cn/20210303/67b609077de7473ab18ab95e1fdecac0.jpg)">      <div :class="2 == 1 ? 'left' : 2 == 2 ? 'left center' : 'left right'" style="backgroundColor: rgba(9, 21, 10, 0.05)">        <el-form class="login-form" label-position="left" :label-width="1 == 3 ? '56px' : '0px'">          <div class="title-container"><h3 class="title" style="color: rgba(242, 218, 129, 0.82)">智慧旅游平台小程序登录</h3></div>          <el-form-item :label="1 == 3 ? '用户名' : ''" :class="'style'+1">            <span v-if="1 != 3" class="svg-container" style="color:rgba(95, 188, 232, 0.76);line-height:44px"><svg-icon icon-class="user" /></span>            <el-input placeholder="请输入用户名" name="username" type="text" v-model="rulesForm.username" />          </el-form-item>          <el-form-item :label="1 == 3 ? '密码' : ''" :class="'style'+1">            <span v-if="1 != 3" class="svg-container" style="color:rgba(95, 188, 232, 0.76);line-height:44px"><svg-icon icon-class="password" /></span>            <el-input placeholder="请输入密码" name="password" type="password" v-model="rulesForm.password" />          </el-form-item>          <el-form-item v-if="0 == '1'" class="code" :label="1 == 3 ? '验证码' : ''" :class="'style'+1">            <span v-if="1 != 3" class="svg-container" style="color:rgba(95, 188, 232, 0.76);line-height:44px"><svg-icon icon-class="code" /></span>            <el-input placeholder="请输入验证码" name="code" type="text" v-model="rulesForm.code" />            <div class="getCodeBt" @click="getRandCode(4)" style="height:44px;line-height:44px">              <span v-for="(item, index) in codes" :key="index" :style="{color:item.color,transform:item.rotate,fontSize:item.size}">{{ item.num }}</span>            </div>          </el-form-item>          <el-form-item label="角色" prop="loginInRole" class="role">            <el-radio              v-for="item in menus"	      v-if="item.hasBackLogin=='是'"              v-bind:key="item.roleName"              v-model="rulesForm.role"              :label="item.roleName"            >{{item.roleName}}</el-radio>          </el-form-item>          <el-button type="primary" @click="login()" class="loginInBt" style="padding:0;font-size:16px;border-radius:8px;height:44px;line-height:44px;width:100%;backgroundColor:rgba(232, 195, 62, 0.74); borderColor:rgba(232, 195, 62, 0.74); color:rgba(243, 246, 248, 0.95)">{{'2' == '1' ? '登录' : 'login'}}</el-button>          <el-form-item class="setting">            <!-- <div style="color:rgba(232, 195, 62, 0.74)" class="reset">修改密码</div> -->          </el-form-item>          <a href="http://www.java1234.com/a/bysj/javaweb/" target='_blank'><font color=red>Java1234收藏整理</font></a>        </el-form>      </div>    </div>  </div></template><script>import menu from "@/utils/menu";export default {  data() {    return {      rulesForm: {        username: "",        password: "",        role: "",        code: '',      },      menus: [],      tableName: "",      codes: [{        num: 1,        color: '#000',        rotate: '10deg',        size: '16px'      },{        num: 2,        color: '#000',        rotate: '10deg',        size: '16px'      },{        num: 3,        color: '#000',        rotate: '10deg',        size: '16px'      },{        num: 4,        color: '#000',        rotate: '10deg',        size: '16px'      }],    };  },  mounted() {    let menus = menu.list();    this.menus = menus;  },  created() {    this.setInputColor()    this.getRandCode()  },  methods: {    setInputColor(){      this.$nextTick(()=>{        document.querySelectorAll('.loginIn .el-input__inner').forEach(el=>{          el.style.backgroundColor = "rgba(242, 234, 234, 0.5)"          el.style.color = "rgba(14, 14, 13, 0.95)"          el.style.height = "44px"          el.style.lineHeight = "44px"          el.style.borderRadius = "8px"        })        document.querySelectorAll('.loginIn .style3 .el-form-item__label').forEach(el=>{          el.style.height = "44px"          el.style.lineHeight = "44px"        })        document.querySelectorAll('.loginIn .el-form-item__label').forEach(el=>{          el.style.color = "rgba(95, 188, 232, 0.76)"        })        setTimeout(()=>{          document.querySelectorAll('.loginIn .role .el-radio__label').forEach(el=>{            el.style.color = "#fff"          })        },350)      })    },    register(tableName){      this.$storage.set("loginTable", tableName);      this.$router.push({path:'/register'})    },    // 登陆    login() {      let code = ''      for(let i in this.codes) {        code += this.codes[i].num      }	  if ('0' == '1' && !this.rulesForm.code) {	     this.$message.error("请输入验证码");	    return;	  }      if ('0' == '1' && this.rulesForm.code.toLowerCase() != code.toLowerCase()) {         this.$message.error("验证码输入有误");		this.getRandCode()        return;      }      if (!this.rulesForm.username) {         this.$message.error("请输入用户名");        return;      }      if (!this.rulesForm.password) {         this.$message.error("请输入密码");        return;      }      if (!this.rulesForm.role) {         this.$message.error("请选择角色");        return;      }      let menus = this.menus;      for (let i = 0; i < menus.length; i++) {        if (menus[i].roleName == this.rulesForm.role) {          this.tableName = menus[i].tableName;        }      }      this.$http({        url: `${this.tableName}/login?username=${this.rulesForm.username}&password=${this.rulesForm.password}`,        method: "post"      }).then(({ data }) => {        if (data && data.code === 0) {          this.$storage.set("Token", data.token);          this.$storage.set("role", this.rulesForm.role);          this.$storage.set("sessionTable", this.tableName);          this.$storage.set("adminName", this.rulesForm.username);          this.$router.replace({ path: "/index/" });        } else {          this.$message.error(data.msg);        }      });    },    getRandCode(len = 4){      this.randomString(len)    },    randomString(len = 4) {      let chars = [          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",          "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",          "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",          "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",          "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",          "3", "4", "5", "6", "7", "8", "9"      ]      let colors = ["0", "1", "2","3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]      let sizes = ['14', '15', '16', '17', '18']      let output = [];      for (let i = 0; i < len; i++) {        // 随机验证码        let key = Math.floor(Math.random()*chars.length)        this.codes[i].num = chars[key]        // 随机验证码颜色        let code = '#'        for (let j = 0; j < 6; j++) {          let key = Math.floor(Math.random()*colors.length)          code += colors[key]        }        this.codes[i].color = code        // 随机验证码方向        let rotate = Math.floor(Math.random()*60)        let plus = Math.floor(Math.random()*2)        if(plus == 1) rotate = '-'+rotate        this.codes[i].rotate = 'rotate('+rotate+'deg)'        // 随机验证码字体大小        let size = Math.floor(Math.random()*sizes.length)        this.codes[i].size = sizes[size]+'px'      }    },  }};</script><style lang="scss" scoped>.loginIn {  min-height: 100vh;  position: relative;  background-repeat: no-repeat;  background-position: center center;  background-size: cover;  .left {    position: absolute;    left: 0;    top: 0;    width: 360px;    height: 100%;    .login-form {      background-color: transparent;      width: 100%;      right: inherit;      padding: 0 12px;      box-sizing: border-box;      display: flex;      justify-content: center;      flex-direction: column;    }    .title-container {      text-align: center;      font-size: 24px;      .title {        margin: 20px 0;      }    }    .el-form-item {      position: relative;      .svg-container {        padding: 6px 5px 6px 15px;        color: #889aa4;        vertical-align: middle;        display: inline-block;        position: absolute;        left: 0;        top: 0;        z-index: 1;        padding: 0;        line-height: 40px;        width: 30px;        text-align: center;      }      .el-input {        display: inline-block;        height: 40px;        width: 100%;        & /deep/ input {          background: transparent;          border: 0px;          -webkit-appearance: none;          padding: 0 15px 0 30px;          color: #fff;          height: 40px;        }      }    }  }  .center {    position: absolute;    left: 50%;    top: 50%;    width: 360px;    transform: translate3d(-50%,-50%,0);    height: 446px;    border-radius: 8px;  }  .right {    position: absolute;    left: inherit;    right: 0;    top: 0;    width: 360px;    height: 100%;  }  .code {    .el-form-item__content {      position: relative;      .getCodeBt {        position: absolute;        right: 0;        top: 0;        line-height: 40px;        width: 100px;        background-color: rgba(51,51,51,0.4);        color: #fff;        text-align: center;        border-radius: 0 4px 4px 0;        height: 40px;        overflow: hidden;        span {          padding: 0 5px;          display: inline-block;          font-size: 16px;          font-weight: 600;        }      }      .el-input {        & /deep/ input {          padding: 0 130px 0 30px;        }      }    }  }  .setting {    & /deep/ .el-form-item__content {      padding: 0 15px;      box-sizing: border-box;      line-height: 32px;      height: 32px;      font-size: 14px;      color: #999;      margin: 0 !important;      .register {        float: left;        width: 50%;      }      .reset {        float: right;        width: 50%;        text-align: right;      }    }  }  .style2 {    padding-left: 30px;    .svg-container {      left: -30px !important;    }    .el-input {      & /deep/ input {        padding: 0 15px !important;      }    }  }  .code.style2, .code.style3 {    .el-input {      & /deep/ input {        padding: 0 115px 0 15px;      }    }  }  .style3 {    & /deep/ .el-form-item__label {      padding-right: 6px;    }    .el-input {      & /deep/ input {        padding: 0 15px !important;      }    }  }  .role {    & /deep/ .el-form-item__label {      width: 56px !important;    }    & /deep/ .el-radio {      margin-right: 12px;    }  }}</style>

源码下载

CSDN 1积分下载:https://download.csdn.net/download/caofeng891102/89337823

或者免费领取加小锋老师wx:java9266

热门推荐

免费分享一套微信小程序扫码点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~_uniapp微信点餐-CSDN博客

免费分享一套微信小程序投票系统(Uni-App+SpringBoot+Vue3)【至尊版】,帅呆了~~-CSDN博客

免费分享一套微信小程序商城系统(电商系统)(SpringBoot+Vue3)【至尊版】,帅呆了~~-CSDN博客

免费分享一套SpringBoot企业人事管理系统(员工管理,工资管理,档案管理,招聘管理),帅呆了~~-CSDN博客

免费分享一套SpringBoot+Vue在线考试系统(优质版),帅呆了~~-CSDN博客

也许您对下面的内容还感兴趣: