<center>全局导航跳转工具类</center>

本文介绍了一个用于页面跳转、返回及重置的导航组件,详细解释了如何使用该组件进行页面间的导航,包括传递参数、返回上一页以及重置到首页等功能。
export default class NavigationUtil {
    /**
     * 跳转到指定页面
     * @param params 要传递的参数
     * @param page 要跳转的页面名
     **/
    static goPage(params, page) {
        const navigation = NavigationUtil.navigation;
        if (!navigation) {
            console.log('NavigationUtil.navigation can not be null')
            return;
        }
        navigation.navigate(
            page,
            {
                ...params
            }
        )
    }

    /**
     * 返回上一页
     * @param navigation
     */
    static goBack(navigation) {
        navigation.goBack();
    }

    /**
     * 重置到首页
     * @param navigation
     */
    static resetToHomPage(params) {
        const {navigation} = params;
        navigation.navigate("Main");
    }

}
package com.hnkj.webdemo.controller; public class AuthController { } package com.hnkj.webdemo.entity; public class User { } package com.hnkj.webdemo.repository; public class UserRepository { } package com.hnkj.webdemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class WebdemoApplication { public static void main(String[] args) { SpringApplication.run(WebdemoApplication.class, args); } } spring.application.name=webdemo spring.datasource.url=jdbc:mysql://localhost:3306/sale_manager_system?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver package com.hnkj.webdemo; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class WebdemoApplicationTests { @Test void contextLoads() { } } <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.hnkj</groupId> <artifactId>webdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>webdemo</name> <description>Demo project for Spring Boot</description> <url/> <licenses> <license/> </licenses> <developers> <developer/> </developers> <scm> <connection/> <developerConnection/> <tag/> <url/> </scm> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>管理员登录界面</title> <!-- 外链式引入css样式 --> <link rel="stylesheet" href="css/login.css" /> </head> <body> <div id="login"> <h2 class="login-title">用户登录</h2> <form id="loginform" name="loginform"> <div class="loginFunc"> <span class="loginFuncApp">二维码登录</span> <span class="loginFuncNormal">账号登录</span> </div> <input type="text" placeholder="账号" class="userName" name="userName" /> <input type="password" placeholder="密码" class="password" name="password" /> <p class="info"> <input type="radio" value="1" name="role" checked /> <span>管理员</span> <input type="radio" value="2" name="role" /> <span>用户</span> <span class="help"><a href="#">忘记密码?</a></span> </p> <input type="submit" value="登 录" class="submit" /> <input type="button" value="注 册" class="button" onclick="register()" /> </form> <div id="loginError" style="color: red; margin-bottom: 10px; text-align: center;"></div> </div> <!-- 确保 DOM 加载完成后再绑定事件监听器 --> <script> document.getElementById('loginform').addEventListener('submit', function (e) { e.preventDefault(); // 阻止表单默认提交行为 // 获取输入的账号和密码 const userName = document.querySelector('.userName').value; const password = document.querySelector('.password').value; const loginError = document.getElementById('loginError'); // 清除之前的错误信息 loginError.textContent = ''; // 进行登录校验 if (userName.trim() === '') { loginError.textContent = '账号不能为空'; return; } if (password.trim() === '') { loginError.textContent = '密码不能为空'; return; } // 如果需要更复杂的校验,可以添加更多规则,例如密码长度等 if (password.length < 6) { loginError.textContent = '密码长度不能少于6位'; return; } // 获取表单数据 const formData = new FormData(this); const data = Object.fromEntries(formData.entries()); console.log('登录数据:', data); // 发送AJAX请求 fetch('http://localhost:8080/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams(data) }) .then(response => { console.log('登录响应:', response); return response.json(); }) .then(result => { console.log('登录成功:', result); if (result.success) { // 根据表单选择的角色跳转 const role = data.role; // 获取表单中的角色值 const redirectPath = role === '1' ? 'AdminSystem/adminHome.html' : 'UserSystem/userHome.html'; window.location.href = redirectPath; } else { // 登录失败,显示错误信息 alert(result.message); } }) .catch(error => { console.error('登录请求出错:', error); alert('登录请求失败,请重试'); }); }); function register() { window.location.href = "register.html"; } </script> </body> </html> 通过这几段代码能否找到问题所在
06-05
@using HengJiuGamesManage.Models; @{ Layout = null; } @{ Users users = new Users(); if (ViewBag.UserModel != null) { users = ViewBag.UserModel; } } <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>恒久游戏管理系统</title> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 引入layui样式 --> <link href="~/Scripts/layui/css/layui.css" rel="stylesheet" /> <!-- 引入jQuery --> <script src="~/Scripts/jquery-3.4.1.js"></script> <style> .layui-footer { display: flex; justify-content: center; } .layui-form-item { margin-bottom: 15px; } </style> </head> <body> <div class="layui-layout layui-layout-admin"> <!-- 头部导航 --> <div class="layui-header"> <div class="layui-logo layui-hide-xs layui-bg-black">恒久游戏管理系统</div> <!-- 头部导航菜单 --> <ul class="layui-nav layui-layout-left"> <li class="layui-nav-item layui-hide-xs"><a href="javascript:;">首页</a></li> <li class="layui-nav-item layui-hide-xs"><a href="javascript:;">数据看板</a></li> <li class="layui-nav-item layui-hide-xs"><a href="javascript:;">运营工具</a></li> <li class="layui-nav-item"> <a href="javascript:;">更多功能</a> <dl class="layui-nav-child"> <dd><a href="javascript:;">公告管理</a></dd> <dd><a href="javascript:;">日志查询</a></dd> <dd><a href="javascript:;">系统设置</a></dd> </dl> </li> </ul> <!-- 用户信息菜单 --> <ul class="layui-nav layui-layout-right"> <li class="layui-nav-item layui-hide layui-show-sm-inline-block"> <a href="javascript:;"> <img src="//unpkg.com/outeres@0.0.10/img/layui/icon-v2.png" class="layui-nav-img"> @users.UserName </a> <dl class="layui-nav-child"> <dd><a href="javascript:;" onclick="ModifyInfo()">修改界面</a></dd> <dd><a href="javascript:;" onclick="ModifyPassword()">修改密码</a></dd> <dd><a href="javascript:;" onclick="Exit()">退出登录</a></dd> </dl> </li> <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect> <a href="javascript:;"> <i class="layui-icon layui-icon-more-vertical"></i> </a> </li> </ul> </div> <!-- 左侧导航 --> <div class="layui-side layui-bg-black"> <div class="layui-side-scroll"> <!-- 游戏分类导航 --> <ul class="layui-nav layui-nav-tree" lay-filter="test"> <li class="layui-nav-item layui-nav-itemed"> <a class="" href="javascript:;">基础信息维护</a> <dl class="layui-nav-child"> <dd><a href="javascript:;">组织结构管理</a></dd> <dd><a href="javascript:;">员工基础信息办理</a></dd> <dd><a href="javascript:;">系统管理</a></dd> <dd><a href="javascript:;">游戏基本信息管理</a></dd> </dl> </li> <li class="layui-nav-item"> <a href="javascript:;">权限管理</a> <dl class="layui-nav-child"> <dd><a href="javascript:;">普通用户</a></dd> <dd><a href="javascript:;">管理员</a></dd> <dd><a href="javascript:;">超级管理员</a></dd> </dl> </li> <li class="layui-nav-item"><a href="javascript:;">帮助中心</a></li> </ul> </div> </div> <!-- 内容区域 --> <div class="layui-body"> <div style="padding: 15px;"> <blockquote class="layui-elem-quote layui-text"> 欢迎使用恒久游戏管理系统 </blockquote> <div class="layui-card layui-panel"> <div class="layui-card-header">系统信息</div> <div class="layui-card-body"> <p>当前版本:v2.1.0</p> <p>更新日期:2023-11-15</p> <p>系统状态:<span class="layui-badge layui-bg-green">正常</span></p> </div> </div> </div> </div> <!-- 底部版权 --> <div class="layui-footer" style="justify-content: center;"> Copyright © 2025 Layui MIT Licensed 免责声明 | 开源协议 | 在线测试 | 广告赞助 </div> </div> <!-- 修改密码弹窗 --> <div id="passwordModal" style="display: none; padding: 20px;"> <form class="layui-form"> <div class="layui-form-item"> <label class="layui-form-label">原密码</label> <div class="layui-input-inline"> <input type="password" name="OldPassword" lay-verify="required|pass" placeholder="请输入原密码" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">新密码</label> <div class="layui-input-inline"> <input type="password" name="NewPassword" id="newPass" lay-verify="required|pass|passcheck" placeholder="请输入新密码" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">确认密码</label> <div class="layui-input-inline"> <input type="password" id="confirmPass" lay-verify="required|passcheck" placeholder="请再次输入新密码" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="changePass">立即修改</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> </div> <!-- 引入layui脚本 --> <script src="~/Scripts/layui/layui.js"></script> <script> // 初始化模块 layui.use(['element', 'layer', 'form', 'util'], function () { var element = layui.element; var layer = layui.layer; var form = layui.form; var util = layui.util; var $ = layui.$; // 头部事件 util.event('lay-header-event', { menuLeft: function (othis) { // 左侧菜单事件 layer.msg('展开左侧菜单的操作', { icon: 0 }); }, menuRight: function () { // 右侧菜单事件 layer.open({ type: 1, title: '公告', content: '<div style="padding: 15px;">公告1</div>', area: ['260px', '100%'], offset: 'rt', // 右上角 anim: 'slideLeft', // 从右侧抽屉滑出 shadeClose: true, scrollbar: false }); } }); // 表单验证规则 form.verify({ pass: [/^[\S]{6,12}$/, '密码必须6-12位且不能包含空格'], passcheck: function (value) { if ($('#newPass').val() && $('#confirmPass').val() && $('#newPass').val() !== $('#confirmPass').val()) { return '两次输入的密码不一致'; } } }); // 密码修改提交 form.on('submit(changePass)', function (data) { // 这里添加实际的密码修改逻辑 console.log('密码修改参数:', data.field); layer.msg('密码修改成功', { icon: 1, time: 1500 }, function () { $('#passwordModal').hide(); // 隐藏弹窗 layer.closeAll(); // 关闭所有弹层 }); return false; // 阻止表单跳转 }); }); // 退出登录 function Exit() { $.ajax({ url: "/Home/ExitSession", type: "post", success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 2000 }, function () { window.location.href = "/Login/Index"; }) } else { layer.msg(res.msg, { icon: 5, time: 2000 }); } } }) } // 修改资料弹窗 function ModifyInfo() { layer.open({ type: 2, // iframe模式 area: ['669px', '500px'], // 窗口尺寸 title: '资料修改', shade: 0.5, // 遮罩透明度 shadeClose: false, // 点击遮罩不可关闭 maxmin: false, // 不显示最大化按钮 anim: 0, // 动画类型 content: '/Home/ModifyBaseInfo', success: function (layero, index) { // 移除iframe中的密码字段(假设子页面有对应name属性) var body = layer.getChildFrame('body', index); body.find('[name="OldPassword"], [name="NewPassword"], [name="ConfirmPassword"]').closest('.layui-form-item').remove(); }, end: function () { location.reload(); // 弹窗关闭后刷新页面 } }); } // 修改密码弹窗 function ModifyPassword() { layer.open({ type: 1, // 页面层 title: '修改密码', area: ['450px', '300px'], // 弹窗大小 content: $('#passwordModal'), // 绑定内容区 success: function () { layui.form.render(); // 渲染表单 } }); } </script> </body> </html>这个是主页面布局代码请你结合两端代码进行优化
07-08
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 --> <template> <div class="min-h-screen bg-gradient-to-b from-blue-50 to-white"> <!-- 顶部导航 --> <header class="bg-blue-600 text-white"> <div class="container mx-auto px-4 flex items-center justify-between h-16"> <div class="flex items-center space-x-2"> <img src="https://ai-public.mastergo.com/ai/img_res/d6eeef870ba388fea0d6f3a9f2d03ae2.jpg" class="h-8 w-8" alt="logo"/> <span class="text-lg font-medium">广东省招投标在线监管平台</span> </div> <div class="flex items-center"> <div class="relative"> <el-input v-model="searchText" placeholder="请输入关键词进行搜索" class="!w-64" > <template #suffix> <el-icon><Search /></el-icon> </template> </el-input> </div> <div class="flex items-center ml-4 space-x-4 text-sm"> <span>操作指南</span> <span>法律法规</span> <span>系统管理</span> <span class="flex items-center"> <el-icon class="mr-1"><User /></el-icon> 登录用户 </span> </div> </div> </div> </header> <!-- 二级导航 --> <nav class="bg-blue-700 text-white"> <div class="container mx-auto px-4"> <div class="flex items-center h-12 space-x-8"> <router-link v-for="(item, index) in navItems" :key="index" :to="item.path" class="flex items-center space-x-1 px-4 h-full hover:bg-blue-600"> <el-icon><component :is="item.icon" /></el-icon> <span>{{ item.name }}</span> </router-link> </div> </div> </nav> <!-- 主体内容 --> <main class="container mx-auto px-4 py-6"> <!-- 筛选栏 --> <div class="bg-white rounded-lg p-4 mb-6 flex items-center space-x-8"> <div class="flex items-center space-x-4"> <span>智能筛选</span> <span>行业分类</span> <span>地市分布</span> <span>项目阶段</span> <span>风险监管</span> <span>规则监管</span> <span>数据环比</span> </div> <div class="flex items-center space-x-2"> <el-date-picker v-model="dateRange" type="month" range-separator="至" start-placeholder="开始月份" end-placeholder="结束月份" size="small" /> </div> </div> <!-- 数据卡片 --> <div class="grid grid-cols-5 gap-4 mb-6"> <div class="bg-indigo-100 rounded-lg p-4 flex items-center justify-between"> <div> <div class="text-2xl font-bold text-indigo-600">93.50%</div> <div class="text-sm text-gray-600">招标计划提前发布占比</div> </div> <el-icon class="text-3xl text-indigo-500"><Document /></el-icon> </div> <div class="bg-blue-100 rounded-lg p-4 flex items-center justify-between"> <div> <div class="text-2xl font-bold text-blue-600">17天</div> <div class="text-sm text-gray-600">开标至中标结果公告平均时长</div> </div> <el-icon class="text-3xl text-blue-500"><Timer /></el-icon> </div> <div class="bg-orange-100 rounded-lg p-4 flex items-center justify-between"> <div> <div class="text-2xl font-bold text-orange-600">68.10%</div> <div class="text-sm text-gray-600">签订合同信息公开率</div> </div> <el-icon class="text-3xl text-orange-500"><Files /></el-icon> </div> <div class="bg-cyan-100 rounded-lg p-4 flex items-center justify-between"> <div> <div class="text-2xl font-bold text-cyan-600">94.65%</div> <div class="text-sm text-gray-600">全流程信息公开率</div> </div> <el-icon class="text-3xl text-cyan-500"><DataLine /></el-icon> </div> <div class="bg-teal-100 rounded-lg p-4 flex items-center justify-between"> <div> <div class="text-2xl font-bold text-teal-600">88.70%</div> <div class="text-sm text-gray-600">项目实施不见面开标率</div> </div> <el-icon class="text-3xl text-teal-500"><TrendCharts /></el-icon> </div> </div> <!-- 图表区域 --> <div class="space-y-6"> <div class="bg-white rounded-lg p-6"> <h3 class="text-lg font-medium mb-4">招标计划提前发布占比</h3> <div ref="chart1" class="h-80"></div> </div> <div class="bg-white rounded-lg p-6"> <h3 class="text-lg font-medium mb-4">各市开标至中标结果公告平均时长(自然天)</h3> <div ref="chart2" class="h-80"></div> </div> <div class="bg-white rounded-lg p-6"> <h3 class="text-lg font-medium mb-4">各市签订合同信息公开率(%)</h3> <div ref="chart3" class="h-80"></div> </div> <div class="bg-white rounded-lg p-6"> <h3 class="text-lg font-medium mb-4">各市招标标段全流程信息公开率(%)</h3> <div ref="chart4" class="h-80"></div> </div> <div class="bg-white rounded-lg p-6"> <h3 class="text-lg font-medium mb-4">实施不见面开标的项目比例</h3> <div ref="chart5" class="h-80"></div> </div> </div> </main> </div> </template> <script lang="ts" setup> import { ref, onMounted } from 'vue'; import * as echarts from 'echarts'; import { Search, User, Document, Timer, Files, DataLine, TrendCharts } from '@element-plus/icons-vue'; const searchText = ref(''); const dateRange = ref([]); const navItems = [ { name: '工作台', path: '/dashboard', icon: 'HomeFilled' }, { name: '专项工作', path: '/special', icon: 'Menu' }, { name: '数据汇', path: '/data', icon: 'DataLine' }, { name: '智慧监管', path: '/monitor', icon: 'Monitor' }, { name: '协同办公', path: '/collaboration', icon: 'Connection' }, { name: '招标代理库', path: '/agency', icon: 'Collection' }, { name: '全程监管', path: '/fullprocess', icon: 'View' }, { name: '智能问答', path: '/qa', icon: 'ChatDotRound' } ]; // 图表实例 const chart1 = ref<HTMLElement | null>(null); const chart2 = ref<HTMLElement | null>(null); const chart3 = ref<HTMLElement | null>(null); const chart4 = ref<HTMLElement | null>(null); const chart5 = ref<HTMLElement | null>(null); onMounted(() => { const cities = ['广州市', '深圳市', '珠海市', '汕头市', '佛山市', '韶关市', '河源市', '梅州市', '惠州市', '汕尾市', '东莞市', '中山市', '江门市', '阳江市', '湛江市', '茂名市', '肇庆市', '清远市', '潮州市', '揭阳市', '云浮市']; // 图表1配置 const chart1Instance = echarts.init(chart1.value as HTMLElement); chart1Instance.setOption({ animation: false, tooltip: { trigger: 'axis' }, xAxis: { type: 'category', data: cities, axisLabel: { interval: 0, rotate: 45 } }, yAxis: { type: 'value', min: 0, max: 100, axisLabel: { formatter: '{value}%' } }, series: [{ data: [88.99, 91.56, 90.34, 90.37, 91.47, 95.14, 84.91, 95.38, 92.89, 93.43, 91.13, 94.17, 92.41, 100, 90.70, 91.26, 95.42, 91.17, 91.42, 91.04], type: 'line', smooth: true, lineStyle: { color: '#6366f1' }, areaStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: 'rgba(99, 102, 241, 0.3)' }, { offset: 1, color: 'rgba(99, 102, 241, 0.1)' } ]) } }] }); // 图表2配置 const chart2Instance = echarts.init(chart2.value as HTMLElement); chart2Instance.setOption({ animation: false, tooltip: { trigger: 'axis' }, xAxis: { type: 'category', data: cities, axisLabel: { interval: 0, rotate: 45 } }, yAxis: { type: 'value', name: '天数' }, series: [{ data: [33.5, 20.5, 32.7, 15.5, 20.6, 15.8, 10.5, 19.6, 15.3, 24.8, 24.5, 17.3, 32.5, 19.5, 23.2, 14.5, 16.6, 16.6, 13.8, 18.8], type: 'line', smooth: true, lineStyle: { color: '#0ea5e9' }, areaStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: 'rgba(14, 165, 233, 0.3)' }, { offset: 1, color: 'rgba(14, 165, 233, 0.1)' } ]) } }] }); // 图表3配置 const chart3Instance = echarts.init(chart3.value as HTMLElement); chart3Instance.setOption({ animation: false, tooltip: { trigger: 'axis' }, xAxis: { type: 'category', data: cities, axisLabel: { interval: 0, rotate: 45 } }, yAxis: { type: 'value', min: 0, max: 100, axisLabel: { formatter: '{value}%' } }, series: [{ data: [54.03, 42.11, 34.31, 77.01, 85.43, 22.59, 60.53, 43.33, 40.39, 33.33, 75.00, 68.83, 44.17, 38.55, 42.35, 65.73, 90.48, 23.47, 0, 0], type: 'line', smooth: true, lineStyle: { color: '#f97316' }, areaStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: 'rgba(249, 115, 22, 0.3)' }, { offset: 1, color: 'rgba(249, 115, 22, 0.1)' } ]) } }] }); // 图表4配置 const chart4Instance = echarts.init(chart4.value as HTMLElement); chart4Instance.setOption({ animation: false, tooltip: { trigger: 'axis' }, legend: { data: ['招标公告', '资格预审', '中标公告', '中标候选人公示', '合同公告'] }, xAxis: { type: 'category', data: cities, axisLabel: { interval: 0, rotate: 45 } }, yAxis: { type: 'value', min: 0, max: 100, axisLabel: { formatter: '{value}%' } }, series: [ { name: '招标公告', type: 'line', stack: 'Total', data: Array(20).fill(0).map(() => Math.random() * 30 + 70), smooth: true }, { name: '资格预审', type: 'line', stack: 'Total', data: Array(20).fill(0).map(() => Math.random() * 30 + 70), smooth: true }, { name: '中标公告', type: 'line', stack: 'Total', data: Array(20).fill(0).map(() => Math.random() * 30 + 70), smooth: true }, { name: '中标候选人公示', type: 'line', stack: 'Total', data: Array(20).fill(0).map(() => Math.random() * 30 + 70), smooth: true }, { name: '合同公告', type: 'line', stack: 'Total', data: Array(20).fill(0).map(() => Math.random() * 30 + 70), smooth: true } ] }); // 图表5配置 const chart5Instance = echarts.init(chart5.value as HTMLElement); chart5Instance.setOption({ animation: false, tooltip: { trigger: 'axis' }, xAxis: { type: 'category', data: cities, axisLabel: { interval: 0, rotate: 45 } }, yAxis: { type: 'value', min: 0, max: 100, axisLabel: { formatter: '{value}%' } }, series: [{ data: [94.87, 100, 91.67, 87.15, 74.61, 92.23, 95.24, 76.54, 96.96, 100, 28.57, 94.02, 91.43, 42.86, 95.29, 85.22, 89.67, 100, 100], type: 'line', smooth: true, lineStyle: { color: '#14b8a6' }, areaStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: 'rgba(20, 184, 166, 0.3)' }, { offset: 1, color: 'rgba(20, 184, 166, 0.1)' } ]) } }] }); // 监听窗口大小变化 window.addEventListener('resize', () => { chart1Instance.resize(); chart2Instance.resize(); chart3Instance.resize(); chart4Instance.resize(); chart5Instance.resize(); }); }); </script> <style scoped> .el-input :deep(.el-input__wrapper) { background-color: rgba(255, 255, 255, 0.1); box-shadow: none; border: 1px solid rgba(255, 255, 255, 0.2); } .el-input :deep(.el-input__inner) { color: white; } .el-input :deep(.el-input__inner::placeholder) { color: rgba(255, 255, 255, 0.7); } .el-input :deep(.el-input__suffix) { color: rgba(255, 255, 255, 0.7); } </style> 帮我这里的ts改为js
09-19
<template> <div class="login-container"> <el-card class="box-card"> <div class="login-body"> <div class="login-title" @click="toIndex"> <img src="@/assets/03.png" style=" width: 40px; height: 40px; margin: 5px 5px -5px 0; -webkit-user-drag: none; -khtml-user-drag: none; -moz-user-drag: none; user-drag: none; " /> <b style="color: black;display: inline-block; margin-bottom: 20px;font-size: 28px;"> 区块链数据溯源平台 </b> </div> <el-form ref="form" :model="userForm" :rules="rules" label-width="0px"> <!-- 手机号输入框 --> <el-input placeholder="请输入手机号码..." v-model="userForm.accountNumber" class="login-input" maxlength="11" > <template slot="prepend"> <div class="iconfont icon-r-user2" style="font-size: 24px;"></div> </template> </el-input> <!-- 密码输入框:参数名改为password,与后端匹配 --> <el-input placeholder="请输入密码..." v-model="userForm.password" <!-- 从userPassword改为password --> class="login-input" @keyup.enter.native="login" show-password > <template slot="prepend"> <div class="iconfont icon-r-lock" style="font-size: 24px;"></div> </template> </el-input> <div class="login-submit"> <el-button type="primary" @click="login"> 登录</el-button> <el-button type="warning" autocomplete="off" @click="$router.push('/sign-in')" style="margin-left: 20px"> 注册</el-button> </div> <div class="other-submit"> <router-link to="/login-admin" class="sign-in-text"> 管理员登录</router-link> </div> </el-form> </div> </el-card> </div> </template> <script> export default { name: "login", data() { return { // 表单数据:密码参数名从userPassword改为password userForm: { accountNumber: '', password: '' // 与后端接口参数名一致 }, // 简单表单验证(可选,增强用户体验) rules: { accountNumber: [ { required: true, message: '请输入手机号', trigger: 'blur' }, { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 6, message: '密码长度不能少于6位', trigger: 'blur' } ] } }; }, methods: { async login() { // 先验证表单(可选) this.$refs.form.validate(async (valid) => { if (!valid) return; try { // 调用登录接口:参数名与后端匹配(accountNumber和password) const res = await this.$api.userLogin({ accountNumber: this.userForm.accountNumber, password: this.userForm.password // 传递正确的参数名 }); console.log("登录响应:", res); // 后端Result类中成功的code是200,而非status_code if (res.code == 200) { // 修正判断条件 // 处理登录时间(如果需要) if (res.data && res.data.signInTime) { res.data.signInTime = res.data.signInTime.substring(0, 10); } // 保存用户信息到全局 this.$globalData.userInfo = res.data; // 跳转到首页 this.$router.replace('/index'); } else { // 后端返回错误信息(如账号密码错误) this.$message.error(res.msg || "登录失败"); } } catch (e) { console.error("登录请求失败:", e); // 网络错误或服务器异常处理 this.$message.error("服务器异常,请稍后重试"); } }); }, toIndex() { this.$router.replace({ path: '/index' }); } } } </script> <style scoped> /* 样式保持不变 */ .login-container { display: flex; justify-content: center; align-items: center; height: 100vh; width: 100%; position: fixed; top: 0; left: 0; width: 100%; overflow-y: auto; height: 100%; background: url("../../assets/background.jpg") center top / cover no-repeat; } .login-body { padding: 30px; width: 300px; height: 100%; } .login-title { padding-bottom: 30px; text-align: center; font-weight: 600; font-size: 20px; color: #409EFF; cursor: pointer; } .login-input { margin-bottom: 20px; } .login-submit { margin-top: 20px; display: flex; justify-content: center; } .sign-in-container { padding: 0 10px; } .sign-in-text { color: #409EFF; font-size: 16px; text-decoration: none; line-height: 28px; } .other-submit { display: flex; justify-content: space-between; margin-top: 30px; margin-left: 200px; } </style> package com.flea.fleabackend.controller; import com.flea.fleabackend.entity.ShUser; import com.flea.fleabackend.service.IShUserService; import com.flea.fleabackend.util.Result; import org.springframework.web.bind.annotation.*; import jakarta.validation.Valid; import org.springframework.validation.BindingResult; // 控制器根路径改为 "/user"(与前端请求的 "/user/sign-in" 匹配) @RestController @RequestMapping("/user") public class ShUserController { private final IShUserService userService; public ShUserController(IShUserService userService) { this.userService = userService; } // 注册接口:路径改为 "/sign-in"(与前端url完全一致) @PostMapping("/sign-in") public Result<?> userRegister( @Valid @RequestBody ShUser user, BindingResult bindingResult ) { // 参数校验失败的反馈 if (bindingResult.hasErrors()) { String errorMsg = bindingResult.getFieldError().getDefaultMessage(); return Result.error("注册失败:" + errorMsg); } // 执行注册逻辑 boolean success = userService.userRegister(user); return success ? Result.success("注册成功") : Result.error("账号已存在或注册信息不完整"); } // 登录接口:同步匹配前端的 "/user/login" 请求 @GetMapping("/login") public Result<?> userLogin( @RequestParam String accountNumber, @RequestParam String userPassword // 参数名从userPassword改为password ) { // 服务层调用时使用修改后的参数名password ShUser user = userService.userLogin(accountNumber, userPassword); return user != null ? Result.success(user, "登录成功") : Result.error("账号或密码错误"); } // 其他接口(如getUserInfo)也需同步调整路径,例如: @GetMapping("/info") public Result<?> getUserInfo(@RequestParam Long id) { ShUser user = userService.getUserById(id); return user != null ? Result.success(user) : Result.error("查询用户信息失败"); } } package com.flea.fleabackend.entity; import lombok.Data; import java.time.LocalDateTime; import jakarta.validation.constraints.NotBlank; @Data public class ShUser { private Long id; // 对应前端的“账号”输入框(字段名:accountNumber) @NotBlank(message = "账号(手机号)不能为空") // @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确") private String accountNumber; // 对应前端的“密码”输入框(字段名:userPassword) @NotBlank(message = "密码不能为空") // @Pattern(regexp = "^[a-zA-Z0-9]{6,16}$", message = "密码需为6-16位数字或字母") private String userPassword; // 对应前端的“昵称”输入框(字段名:nickname) @NotBlank(message = "昵称不能为空") private String nickname; private String avatar; private LocalDateTime signInTime; private Integer userStatus; } package com.flea.fleabackend.mapper; import com.flea.fleabackend.entity.ShUser; import org.apache.ibatis.annotations.*; @Mapper public interface ShUserMapper { // 根据账号(手机号)查询用户 @Select("SELECT * FROM sh_user WHERE account_number = #{accountNumber}") ShUser selectByAccountNumber(String accountNumber); // 根据id查询用户 @Select("SELECT * FROM sh_user WHERE id = #{id}") ShUser selectById(Long id); // 注册用户(修复密码参数映射) @Insert("INSERT INTO sh_user(" + "account_number, " + "user_password, " + // 数据库字段 "nickname, " + "avatar, " + "sign_in_time, " + "user_status" + ") VALUES(" + "#{accountNumber}, " + "#{userPassword}, " + // 匹配实体类字段userPassword "#{nickname}, " + "#{avatar}, " + "#{signInTime}, " + "0" + ")") @Options(useGeneratedKeys = true, keyProperty = "id") // 获取自增ID int insert(ShUser user); // 更新用户信息 @Update("UPDATE sh_user SET nickname = #{nickname}, avatar = #{avatar} WHERE id = #{id}") int updateInfo(ShUser user); // 封禁用户 @Update("UPDATE sh_user SET user_status = 1 WHERE id = #{id}") int banUser(Long id); } package com.flea.fleabackend.service.impl; import com.flea.fleabackend.entity.ShUser; import com.flea.fleabackend.mapper.ShUserMapper; import com.flea.fleabackend.service.IShUserService; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; /** * 用户服务实现类:解决账密错误、空指针问题 */ @Service public class ShUserServiceImpl implements IShUserService { private final ShUserMapper shUserMapper; // 构造函数注入(Spring推荐方式) public ShUserServiceImpl(ShUserMapper shUserMapper) { this.shUserMapper = shUserMapper; } /** * 登录逻辑优化: * 1. 严格参数校验(避免空值/空字符串) * 2. 适配数据库明文密码验证 * 3. 完善空值判断,避免空指针 */ @Override public ShUser userLogin(String accountNumber, String password) { // 1. 严格校验入参(空值/空字符串都拒绝) if (!StringUtils.hasText(accountNumber) || !StringUtils.hasText(password)) { return null; // 入参无效,直接返回null(对应账密错误) } // 2. 根据账号查询用户(确保Mapper的SQL字段正确) ShUser user = shUserMapper.selectByAccountNumber(accountNumber.trim()); // trim去除空格 // 3. 密码验证(多层空值判断,适配明文密码) if (user == null) { return null; // 账号不存在 } if (!StringUtils.hasText(user.getUserPassword())) { return null; // 数据库中密码为空,验证失败 } // 明文密码对比(与数据库存储一致) if (password.trim().equals(user.getUserPassword().trim())) { // 4. 额外校验用户状态(0=正常,1=封禁) if (user.getUserStatus() == 1) { return null; // 账号被封禁,返回null } return user; // 登录成功 } return null; // 密码错误 } @Override public boolean userRegister(ShUser user) { // 注册参数校验 if (user == null || !StringUtils.hasText(user.getAccountNumber()) || !StringUtils.hasText(user.getUserPassword()) || !StringUtils.hasText(user.getNickname())) { return false; } // 检查账号是否已存在 ShUser existingUser = shUserMapper.selectByAccountNumber(user.getAccountNumber().trim()); if (existingUser != null) { return false; // 账号已存在 } // 注册时密码明文存储(与登录逻辑一致) user.setAccountNumber(user.getAccountNumber().trim()); user.setUserPassword(user.getUserPassword().trim()); return shUserMapper.insert(user) > 0; } @Override public ShUser getUserById(Long id) { if (id == null) { return null; } return shUserMapper.selectById(id); } @Override public boolean updateUserInfo(ShUser user) { if (user == null || user.getId() == null || !StringUtils.hasText(user.getNickname())) { return false; } return shUserMapper.updateInfo(user) > 0; } @Override public boolean banUser(Long userId) { if (userId == null) { return false; } return shUserMapper.banUser(userId) > 0; } } // filePath: com/flea/fleabackend/service/IShUserService.java package com.flea.fleabackend.service; import com.flea.fleabackend.entity.ShUser; public interface IShUserService { // 用户登录(手机号+密码) ShUser userLogin(String accountNumber, String password); // 用户注册(账号唯一性校验) boolean userRegister(ShUser user); // 根据ID查询用户 ShUser getUserById(Long id); // 更新用户信息(昵称、头像) boolean updateUserInfo(ShUser user); // 封禁用户(管理员操作) boolean banUser(Long userId); } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace必须和ShUserMapper接口的全路径一致 --> <mapper namespace="com.flea.fleabackend.mapper.ShUserMapper"> <!-- 通用结果集映射:解决数据库字段与实体类属性映射问题 --> <resultMap id="ShUserResultMap" type="com.flea.fleabackend.entity.ShUser"> <id column="id" property="id"/> <result column="account_number" property="accountNumber"/> <!-- 数据库字段→实体类属性 --> <result column="user_password" property="userPassword"/> <result column="nickname" property="nickname"/> <result column="avatar" property="avatar"/> <result column="sign_in_time" property="signInTime"/> <result column="user_status" property="userStatus"/> </resultMap> <!-- 根据账号查询用户(登录核心SQL) --> <select id="selectByAccountNumber" parameterType="String" resultMap="ShUserResultMap"> SELECT id, account_number, user_password, nickname, avatar, sign_in_time, user_status FROM sh_user WHERE account_number = #{accountNumber} <!-- 与数据库字段一致 --> <!-- 假设有逻辑删除字段,没有则删除该条件 --> </select> <!-- 根据ID查询用户 --> <select id="selectById" parameterType="Long" resultMap="ShUserResultMap"> SELECT id, account_number, user_password, nickname, avatar, sign_in_time, user_status FROM sh_user WHERE id = #{id} AND is_deleted = 0 </select> <select id="selectByPage" parameterType="map" resultType="com.flea.fleabackend.entity.ShIdleItem"> SELECT * FROM sh_idle_item WHERE status = 1 <!-- 1=已发布状态 --> LIMIT #{offset}, #{size} </select> <select id="selectTotalCount" resultType="int"> SELECT COUNT(*) FROM sh_idle_item WHERE status = 1 </select> <select id="selectByLabel" parameterType="map" resultType="com.flea.fleabackend.entity.ShIdleItem"> SELECT * FROM sh_idle_item WHERE status = 1 AND idle_label = #{idleLabel} LIMIT #{offset}, #{size} </select> <select id="selectCountByLabel" parameterType="string" resultType="int"> SELECT COUNT(*) FROM sh_idle_item WHERE status = 1 AND idle_label = #{idleLabel} </select> <!-- 新增用户(注册) --> <insert id="insert" parameterType="com.flea.fleabackend.entity.ShUser"> INSERT INTO sh_user ( account_number, user_password, nickname, avatar, sign_in_time, user_status ) VALUES ( #{accountNumber}, #{userPassword}, #{nickname}, #{avatar}, #{signInTime}, #{userStatus} ) </insert> <!-- 更新用户信息 --> <update id="updateInfo" parameterType="com.flea.fleabackend.entity.ShUser"> UPDATE sh_user <set> <if test="nickname != null and nickname != ''">nickname = #{nickname},</if> <if test="avatar != null and avatar != ''">avatar = #{avatar},</if> <if test="userStatus != null">user_status = #{userStatus}</if> </set> WHERE id = #{id} AND is_deleted = 0 </update> <!-- 封禁用户(修改状态) --> <update id="banUser" parameterType="Long"> UPDATE sh_user SET user_status = 1 <!-- 1=封禁状态 --> WHERE id = #{userId} AND is_deleted = 0 </update> </mapper> server: port: 80 spring: # 数据库配置(修改为你的本地数据库信息) datasource: url: jdbc:mysql://localhost:3306/flea_market?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root # 你的MySQL用户名(默认root) password: 123456 # 你的MySQL密码(自己设置的) driver-class-name: com.mysql.cj.jdbc.Driver # MyBatis-Plus配置(可选,优化体验) mybatis-plus: mapper-locations: classpath:mapper/*.xml # 若有XML映射文件,指定路径 type-aliases-package: com.flea.fleabackend.entity # 实体类别名包 configuration: map-underscore-to-camel-case: true # 下划线转驼峰(如数据库字段user_name → 实体类userName) log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志(方便调试) <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- Spring Boot父工程(统一管理版本) --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.10</version> <relativePath/> </parent> <!-- 项目信息 --> <groupId>com.flea</groupId> <artifactId>flea-backend</artifactId> <version>0.0.1-SNAPSHOT</version> <name>flea-backend</name> <description>Flea 二手交易平台后端</description> <!-- 全局属性 --> <properties> <java.version>21</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 【关键】配置国内Maven镜像(阿里云),解决依赖下载失败问题 --> <repositories> <repository> <id>aliyunmaven</id> <url>https://maven.aliyun.com/repository/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>aliyunmaven</id> <url>https://maven.aliyun.com/repository/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> <!-- 核心依赖 --> <dependencies> <!-- Web核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis整合依赖 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.5</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- 参数校验依赖(解决@Valid报错) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <!-- 测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!-- 构建配置 --> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> CREATE DATABASE IF NOT EXISTS flea_market CHARACTER SET utf8 COLLATE utf8_general_ci; USE flea_market; DROP TABLE IF EXISTS `sh_address`; CREATE TABLE `sh_address` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `consignee_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收货人姓名', `consignee_phone` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收货人手机号', `province_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '省', `city_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '市', `region_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '区', `detail_address` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '详细地址', `default_flag` tinyint(0) NOT NULL COMMENT '是否默认地址', `user_id` bigint(0) NOT NULL COMMENT '用户主键id', PRIMARY KEY (`id`) USING BTREE, INDEX `user_id_index`(`user_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of sh_address -- ---------------------------- -- ---------------------------- -- Table structure for sh_admin -- ---------------------------- DROP TABLE IF EXISTS `sh_admin`; CREATE TABLE `sh_admin` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `account_number` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '管理员账号', `admin_password` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码', `admin_name` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '管理员名字', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `account_number`(`account_number`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of sh_admin -- ---------------------------- INSERT INTO `sh_admin` VALUES (1, 'admin', '123456', '管理员'); -- ---------------------------- -- Table structure for sh_favorite -- ---------------------------- DROP TABLE IF EXISTS `sh_favorite`; CREATE TABLE `sh_favorite` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '自增主键id', `create_time` datetime NOT NULL COMMENT '加入收藏的时间', `user_id` bigint(0) NOT NULL COMMENT '用户主键id', `idle_id` bigint(0) NOT NULL COMMENT '物主键id', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `user_id`(`user_id`, `idle_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 48 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of sh_favorite -- ---------------------------- INSERT INTO `sh_favorite` VALUES (48, '2023-12-09 12:32:39', 11, 113); -- ---------------------------- -- Table structure for sh_idle_item -- ---------------------------- DROP TABLE IF EXISTS `sh_idle_item`; CREATE TABLE `sh_idle_item` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `idle_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '物名称', `idle_details` varchar(2048) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '详情', `picture_list` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '图集', `idle_price` decimal(10, 2) NOT NULL COMMENT '价格', `idle_place` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '发货地区', `idle_label` int(0) NOT NULL COMMENT '分类标签', `release_time` datetime NOT NULL COMMENT '发布时间', `idle_status` tinyint(0) NOT NULL COMMENT '状态(发布1、下架2、删除0)', `user_id` bigint(0) NOT NULL COMMENT '用户主键id', PRIMARY KEY (`id`) USING BTREE, INDEX `user_id_index`(`user_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 105 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; DROP TABLE IF EXISTS `sh_message`; CREATE TABLE `sh_message` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `user_id` bigint(0) NOT NULL COMMENT '用户主键id', `idle_id` bigint(0) NOT NULL COMMENT '主键id', `content` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '留言内容', `create_time` datetime NOT NULL COMMENT '留言时间', `to_user` bigint(0) NOT NULL COMMENT '所回复的用户', `to_message` bigint(0) NULL DEFAULT NULL COMMENT '所回复的留言', PRIMARY KEY (`id`) USING BTREE, INDEX `user_id_index`(`user_id`) USING BTREE, INDEX `idle_id_index`(`idle_id`) USING BTREE, INDEX `to_user_index`(`to_user`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 48 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of sh_message -- ---------------------------- -- ---------------------------- -- Table structure for sh_order -- ---------------------------- DROP TABLE IF EXISTS `sh_order`; CREATE TABLE `sh_order` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `order_number` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单编号', `user_id` bigint(0) NOT NULL COMMENT '用户主键id', `idle_id` bigint(0) NOT NULL COMMENT '物品主键id', `order_price` decimal(10, 2) NOT NULL COMMENT '订单总价', `payment_status` tinyint(0) NOT NULL COMMENT '支付状态', `payment_way` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '支付方式', `create_time` datetime NOT NULL COMMENT '创建时间', `payment_time` datetime NULL DEFAULT NULL COMMENT '支付时间', `order_status` tinyint(0) NOT NULL COMMENT '订单状态', `is_deleted` tinyint(0) NULL DEFAULT NULL COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 86 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of sh_order -- ---------------------------- -- ---------------------------- -- Table structure for sh_order_address -- ---------------------------- DROP TABLE IF EXISTS `sh_order_address`; CREATE TABLE `sh_order_address` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '自增id', `order_id` bigint(0) NOT NULL COMMENT '订单id', `consignee_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收货人', `consignee_phone` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电话', `detail_address` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收货地址', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `orderId`(`order_id`) USING BTREE, INDEX `order_id_index`(`order_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of sh_order_address -- ---------------------------- -- Table structure for sh_type -- ---------------------------- DROP TABLE IF EXISTS `sh_type`; CREATE TABLE `sh_type` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '分类名称', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '类别表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sh_type -- ---------------------------- -- ---------------------------- -- Table structure for sh_user -- ---------------------------- DROP TABLE IF EXISTS `sh_user`; CREATE TABLE `sh_user` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `account_number` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '账号(手机号)', `user_password` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录密码', `nickname` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '昵称', `avatar` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '头像', `sign_in_time` datetime NOT NULL COMMENT '注册时间', `user_status` tinyint(0) NULL DEFAULT NULL COMMENT '状态(1代表封禁)', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `account_number`(`account_number`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; 根据代码帮我找出为什么平台登录成功后无法自动跳转至index页面的原因 并且展示修改后能解决报错的完整代码
最新发布
12-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值