当前位置:   article > 正文

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~_计算机操作系统第三版汤小丹pdf

计算机操作系统第三版汤小丹pdf

大家好,我是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作为本地数据库,微信小程序用到了微信开发者工具,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得智慧旅游平台开发微信小程序管理工作系统化、规范化。

系统展示

部分代码

  1. package com.controller;
  2. import java.util.Arrays;
  3. import java.util.Calendar;
  4. import java.util.Date;
  5. import java.util.Map;
  6. import javax.servlet.http.HttpServletRequest;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.GetMapping;
  10. import org.springframework.web.bind.annotation.PathVariable;
  11. import org.springframework.web.bind.annotation.PostMapping;
  12. import org.springframework.web.bind.annotation.RequestBody;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RequestParam;
  15. import org.springframework.web.bind.annotation.ResponseBody;
  16. import org.springframework.web.bind.annotation.RestController;
  17. import com.annotation.IgnoreAuth;
  18. import com.baomidou.mybatisplus.mapper.EntityWrapper;
  19. import com.entity.TokenEntity;
  20. import com.entity.UserEntity;
  21. import com.service.TokenService;
  22. import com.service.UserService;
  23. import com.utils.CommonUtil;
  24. import com.utils.MD5Util;
  25. import com.utils.MPUtil;
  26. import com.utils.PageUtils;
  27. import com.utils.R;
  28. import com.utils.ValidatorUtils;
  29. /**
  30. * 登录相关
  31. */
  32. @RequestMapping("users")
  33. @RestController
  34. public class UserController{
  35. @Autowired
  36. private UserService userService;
  37. @Autowired
  38. private TokenService tokenService;
  39. /**
  40. * 登录
  41. */
  42. @IgnoreAuth
  43. @PostMapping(value = "/login")
  44. public R login(String username, String password, String captcha, HttpServletRequest request) {
  45. UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
  46. if(user==null || !user.getPassword().equals(password)) {
  47. return R.error("账号或密码不正确");
  48. }
  49. String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
  50. return R.ok().put("token", token);
  51. }
  52. /**
  53. * 注册
  54. */
  55. @IgnoreAuth
  56. @PostMapping(value = "/register")
  57. public R register(@RequestBody UserEntity user){
  58. // ValidatorUtils.validateEntity(user);
  59. if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
  60. return R.error("用户已存在");
  61. }
  62. userService.insert(user);
  63. return R.ok();
  64. }
  65. /**
  66. * 退出
  67. */
  68. @GetMapping(value = "logout")
  69. public R logout(HttpServletRequest request) {
  70. request.getSession().invalidate();
  71. return R.ok("退出成功");
  72. }
  73. /**
  74. * 密码重置
  75. */
  76. @IgnoreAuth
  77. @RequestMapping(value = "/resetPass")
  78. public R resetPass(String username, HttpServletRequest request){
  79. UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
  80. if(user==null) {
  81. return R.error("账号不存在");
  82. }
  83. user.setPassword("123456");
  84. userService.update(user,null);
  85. return R.ok("密码已重置为:123456");
  86. }
  87. /**
  88. * 列表
  89. */
  90. @RequestMapping("/page")
  91. public R page(@RequestParam Map<String, Object> params,UserEntity user){
  92. EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
  93. PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
  94. return R.ok().put("data", page);
  95. }
  96. /**
  97. * 列表
  98. */
  99. @RequestMapping("/list")
  100. public R list( UserEntity user){
  101. EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
  102. ew.allEq(MPUtil.allEQMapPre( user, "user"));
  103. return R.ok().put("data", userService.selectListView(ew));
  104. }
  105. /**
  106. * 信息
  107. */
  108. @RequestMapping("/info/{id}")
  109. public R info(@PathVariable("id") String id){
  110. UserEntity user = userService.selectById(id);
  111. return R.ok().put("data", user);
  112. }
  113. /**
  114. * 获取用户的session用户信息
  115. */
  116. @RequestMapping("/session")
  117. public R getCurrUser(HttpServletRequest request){
  118. Long id = (Long)request.getSession().getAttribute("userId");
  119. UserEntity user = userService.selectById(id);
  120. return R.ok().put("data", user);
  121. }
  122. /**
  123. * 保存
  124. */
  125. @PostMapping("/save")
  126. public R save(@RequestBody UserEntity user){
  127. // ValidatorUtils.validateEntity(user);
  128. if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
  129. return R.error("用户已存在");
  130. }
  131. userService.insert(user);
  132. return R.ok();
  133. }
  134. /**
  135. * 修改
  136. */
  137. @RequestMapping("/update")
  138. public R update(@RequestBody UserEntity user){
  139. // ValidatorUtils.validateEntity(user);
  140. UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
  141. if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
  142. return R.error("用户名已存在。");
  143. }
  144. userService.updateById(user);//全部更新
  145. return R.ok();
  146. }
  147. /**
  148. * 删除
  149. */
  150. @RequestMapping("/delete")
  151. public R delete(@RequestBody Long[] ids){
  152. userService.deleteBatchIds(Arrays.asList(ids));
  153. return R.ok();
  154. }
  155. }
  1. <template>
  2. <div>
  3. <div class="container loginIn" style="backgroundImage: url(http://codegen.caihongy.cn/20210303/67b609077de7473ab18ab95e1fdecac0.jpg)">
  4. <div :class="2 == 1 ? 'left' : 2 == 2 ? 'left center' : 'left right'" style="backgroundColor: rgba(9, 21, 10, 0.05)">
  5. <el-form class="login-form" label-position="left" :label-width="1 == 3 ? '56px' : '0px'">
  6. <div class="title-container"><h3 class="title" style="color: rgba(242, 218, 129, 0.82)">智慧旅游平台小程序登录</h3></div>
  7. <el-form-item :label="1 == 3 ? '用户名' : ''" :class="'style'+1">
  8. <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>
  9. <el-input placeholder="请输入用户名" name="username" type="text" v-model="rulesForm.username" />
  10. </el-form-item>
  11. <el-form-item :label="1 == 3 ? '密码' : ''" :class="'style'+1">
  12. <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>
  13. <el-input placeholder="请输入密码" name="password" type="password" v-model="rulesForm.password" />
  14. </el-form-item>
  15. <el-form-item v-if="0 == '1'" class="code" :label="1 == 3 ? '验证码' : ''" :class="'style'+1">
  16. <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>
  17. <el-input placeholder="请输入验证码" name="code" type="text" v-model="rulesForm.code" />
  18. <div class="getCodeBt" @click="getRandCode(4)" style="height:44px;line-height:44px">
  19. <span v-for="(item, index) in codes" :key="index" :style="{color:item.color,transform:item.rotate,fontSize:item.size}">{{ item.num }}</span>
  20. </div>
  21. </el-form-item>
  22. <el-form-item label="角色" prop="loginInRole" class="role">
  23. <el-radio
  24. v-for="item in menus"
  25. v-if="item.hasBackLogin=='是'"
  26. v-bind:key="item.roleName"
  27. v-model="rulesForm.role"
  28. :label="item.roleName"
  29. >{{item.roleName}}</el-radio>
  30. </el-form-item>
  31. <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>
  32. <el-form-item class="setting">
  33. <!-- <div style="color:rgba(232, 195, 62, 0.74)" class="reset">修改密码</div> -->
  34. </el-form-item>
  35. <a href="http://www.java1234.com/a/bysj/javaweb/" target='_blank'><font color=red>Java1234收藏整理</font></a>
  36. </el-form>
  37. </div>
  38. </div>
  39. </div>
  40. </template>
  41. <script>
  42. import menu from "@/utils/menu";
  43. export default {
  44. data() {
  45. return {
  46. rulesForm: {
  47. username: "",
  48. password: "",
  49. role: "",
  50. code: '',
  51. },
  52. menus: [],
  53. tableName: "",
  54. codes: [{
  55. num: 1,
  56. color: '#000',
  57. rotate: '10deg',
  58. size: '16px'
  59. },{
  60. num: 2,
  61. color: '#000',
  62. rotate: '10deg',
  63. size: '16px'
  64. },{
  65. num: 3,
  66. color: '#000',
  67. rotate: '10deg',
  68. size: '16px'
  69. },{
  70. num: 4,
  71. color: '#000',
  72. rotate: '10deg',
  73. size: '16px'
  74. }],
  75. };
  76. },
  77. mounted() {
  78. let menus = menu.list();
  79. this.menus = menus;
  80. },
  81. created() {
  82. this.setInputColor()
  83. this.getRandCode()
  84. },
  85. methods: {
  86. setInputColor(){
  87. this.$nextTick(()=>{
  88. document.querySelectorAll('.loginIn .el-input__inner').forEach(el=>{
  89. el.style.backgroundColor = "rgba(242, 234, 234, 0.5)"
  90. el.style.color = "rgba(14, 14, 13, 0.95)"
  91. el.style.height = "44px"
  92. el.style.lineHeight = "44px"
  93. el.style.borderRadius = "8px"
  94. })
  95. document.querySelectorAll('.loginIn .style3 .el-form-item__label').forEach(el=>{
  96. el.style.height = "44px"
  97. el.style.lineHeight = "44px"
  98. })
  99. document.querySelectorAll('.loginIn .el-form-item__label').forEach(el=>{
  100. el.style.color = "rgba(95, 188, 232, 0.76)"
  101. })
  102. setTimeout(()=>{
  103. document.querySelectorAll('.loginIn .role .el-radio__label').forEach(el=>{
  104. el.style.color = "#fff"
  105. })
  106. },350)
  107. })
  108. },
  109. register(tableName){
  110. this.$storage.set("loginTable", tableName);
  111. this.$router.push({path:'/register'})
  112. },
  113. // 登陆
  114. login() {
  115. let code = ''
  116. for(let i in this.codes) {
  117. code += this.codes[i].num
  118. }
  119. if ('0' == '1' && !this.rulesForm.code) {
  120. this.$message.error("请输入验证码");
  121. return;
  122. }
  123. if ('0' == '1' && this.rulesForm.code.toLowerCase() != code.toLowerCase()) {
  124. this.$message.error("验证码输入有误");
  125. this.getRandCode()
  126. return;
  127. }
  128. if (!this.rulesForm.username) {
  129. this.$message.error("请输入用户名");
  130. return;
  131. }
  132. if (!this.rulesForm.password) {
  133. this.$message.error("请输入密码");
  134. return;
  135. }
  136. if (!this.rulesForm.role) {
  137. this.$message.error("请选择角色");
  138. return;
  139. }
  140. let menus = this.menus;
  141. for (let i = 0; i < menus.length; i++) {
  142. if (menus[i].roleName == this.rulesForm.role) {
  143. this.tableName = menus[i].tableName;
  144. }
  145. }
  146. this.$http({
  147. url: `${this.tableName}/login?username=${this.rulesForm.username}&password=${this.rulesForm.password}`,
  148. method: "post"
  149. }).then(({ data }) => {
  150. if (data && data.code === 0) {
  151. this.$storage.set("Token", data.token);
  152. this.$storage.set("role", this.rulesForm.role);
  153. this.$storage.set("sessionTable", this.tableName);
  154. this.$storage.set("adminName", this.rulesForm.username);
  155. this.$router.replace({ path: "/index/" });
  156. } else {
  157. this.$message.error(data.msg);
  158. }
  159. });
  160. },
  161. getRandCode(len = 4){
  162. this.randomString(len)
  163. },
  164. randomString(len = 4) {
  165. let chars = [
  166. "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
  167. "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
  168. "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
  169. "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
  170. "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
  171. "3", "4", "5", "6", "7", "8", "9"
  172. ]
  173. let colors = ["0", "1", "2","3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]
  174. let sizes = ['14', '15', '16', '17', '18']
  175. let output = [];
  176. for (let i = 0; i < len; i++) {
  177. // 随机验证码
  178. let key = Math.floor(Math.random()*chars.length)
  179. this.codes[i].num = chars[key]
  180. // 随机验证码颜色
  181. let code = '#'
  182. for (let j = 0; j < 6; j++) {
  183. let key = Math.floor(Math.random()*colors.length)
  184. code += colors[key]
  185. }
  186. this.codes[i].color = code
  187. // 随机验证码方向
  188. let rotate = Math.floor(Math.random()*60)
  189. let plus = Math.floor(Math.random()*2)
  190. if(plus == 1) rotate = '-'+rotate
  191. this.codes[i].rotate = 'rotate('+rotate+'deg)'
  192. // 随机验证码字体大小
  193. let size = Math.floor(Math.random()*sizes.length)
  194. this.codes[i].size = sizes[size]+'px'
  195. }
  196. },
  197. }
  198. };
  199. </script>
  200. <style lang="scss" scoped>
  201. .loginIn {
  202. min-height: 100vh;
  203. position: relative;
  204. background-repeat: no-repeat;
  205. background-position: center center;
  206. background-size: cover;
  207. .left {
  208. position: absolute;
  209. left: 0;
  210. top: 0;
  211. width: 360px;
  212. height: 100%;
  213. .login-form {
  214. background-color: transparent;
  215. width: 100%;
  216. right: inherit;
  217. padding: 0 12px;
  218. box-sizing: border-box;
  219. display: flex;
  220. justify-content: center;
  221. flex-direction: column;
  222. }
  223. .title-container {
  224. text-align: center;
  225. font-size: 24px;
  226. .title {
  227. margin: 20px 0;
  228. }
  229. }
  230. .el-form-item {
  231. position: relative;
  232. .svg-container {
  233. padding: 6px 5px 6px 15px;
  234. color: #889aa4;
  235. vertical-align: middle;
  236. display: inline-block;
  237. position: absolute;
  238. left: 0;
  239. top: 0;
  240. z-index: 1;
  241. padding: 0;
  242. line-height: 40px;
  243. width: 30px;
  244. text-align: center;
  245. }
  246. .el-input {
  247. display: inline-block;
  248. height: 40px;
  249. width: 100%;
  250. & /deep/ input {
  251. background: transparent;
  252. border: 0px;
  253. -webkit-appearance: none;
  254. padding: 0 15px 0 30px;
  255. color: #fff;
  256. height: 40px;
  257. }
  258. }
  259. }
  260. }
  261. .center {
  262. position: absolute;
  263. left: 50%;
  264. top: 50%;
  265. width: 360px;
  266. transform: translate3d(-50%,-50%,0);
  267. height: 446px;
  268. border-radius: 8px;
  269. }
  270. .right {
  271. position: absolute;
  272. left: inherit;
  273. right: 0;
  274. top: 0;
  275. width: 360px;
  276. height: 100%;
  277. }
  278. .code {
  279. .el-form-item__content {
  280. position: relative;
  281. .getCodeBt {
  282. position: absolute;
  283. right: 0;
  284. top: 0;
  285. line-height: 40px;
  286. width: 100px;
  287. background-color: rgba(51,51,51,0.4);
  288. color: #fff;
  289. text-align: center;
  290. border-radius: 0 4px 4px 0;
  291. height: 40px;
  292. overflow: hidden;
  293. span {
  294. padding: 0 5px;
  295. display: inline-block;
  296. font-size: 16px;
  297. font-weight: 600;
  298. }
  299. }
  300. .el-input {
  301. & /deep/ input {
  302. padding: 0 130px 0 30px;
  303. }
  304. }
  305. }
  306. }
  307. .setting {
  308. & /deep/ .el-form-item__content {
  309. padding: 0 15px;
  310. box-sizing: border-box;
  311. line-height: 32px;
  312. height: 32px;
  313. font-size: 14px;
  314. color: #999;
  315. margin: 0 !important;
  316. .register {
  317. float: left;
  318. width: 50%;
  319. }
  320. .reset {
  321. float: right;
  322. width: 50%;
  323. text-align: right;
  324. }
  325. }
  326. }
  327. .style2 {
  328. padding-left: 30px;
  329. .svg-container {
  330. left: -30px !important;
  331. }
  332. .el-input {
  333. & /deep/ input {
  334. padding: 0 15px !important;
  335. }
  336. }
  337. }
  338. .code.style2, .code.style3 {
  339. .el-input {
  340. & /deep/ input {
  341. padding: 0 115px 0 15px;
  342. }
  343. }
  344. }
  345. .style3 {
  346. & /deep/ .el-form-item__label {
  347. padding-right: 6px;
  348. }
  349. .el-input {
  350. & /deep/ input {
  351. padding: 0 15px !important;
  352. }
  353. }
  354. }
  355. .role {
  356. & /deep/ .el-form-item__label {
  357. width: 56px !important;
  358. }
  359. & /deep/ .el-radio {
  360. margin-right: 12px;
  361. }
  362. }
  363. }
  364. </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博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/696331
推荐阅读
相关标签
  

闽ICP备14008679号