<template> <header class="app-header"> <div class="header-content"> <div class="logo"> <img src="@/assets/logo.png" alt="Logo"> <h1>学习路径规划系统</h1> </div> <nav class="main-nav"> <router-link to="/dashboard">仪表盘</router-link> <router-link to="/learning-path">学习路径</router-link> <router-link to="/learning-resources">学习资源</router-link> <router-link to="/analysis">学习分析</router-link> <router-link to="/reports">报告生成</router-link> <!-- 动态显示用户相关链接 --> <div v-if="isLoggedIn" class="user-menu"> <router-link to="/profile">个人资料</router-link> <button @click="logout">退出登录</button> </div> <div v-else class="auth-links"> <router-link to="/login">登录</router-link> <router-link to="/register">注册</router-link> </div> </nav> </div> </header> </template> <script setup> import { computed } from 'vue'; import { useStore } from 'vuex'; // 初始化 Vuex Store const store = useStore(); // 计算属性:判断用户是否已登录 const isLoggedIn = computed(() => store.getters.isLoggedIn); // 方法:触发登出事件 const logout = () => { store.dispatch('logout'); // 假设 Vuex 中有 logout action }; </script> 报错
时间: 2025-05-29 17:54:35 浏览: 25
从你的问题中可以看出,Vue 应用在运行时遇到了错误。以下是可能的报错原因以及解决方法。
---
### 解决方法
1. **检查 Vuex 配置**:
- 确保 Vuex 的 `store` 已正确配置,并且 `isLoggedIn` 和 `logout` 方法已定义。
```javascript
// src/store/index.js
import { createStore } from 'vuex';
export default createStore({
state: {
isAuthenticated: false, // 用户登录状态
user: null // 当前用户信息
},
getters: {
isLoggedIn(state) {
return state.isAuthenticated; // 返回登录状态
}
},
mutations: {
SET_AUTH(state, isAuthenticated) {
state.isAuthenticated = isAuthenticated;
},
SET_USER(state, user) {
state.user = user;
}
},
actions: {
logout({ commit }) {
commit('SET_AUTH', false); // 设置为未登录状态
commit('SET_USER', null); // 清空用户信息
}
}
});
```
2. **确保 Vuex 正确挂载到应用**:
- 在 `main.js` 中正确引入并挂载 Vuex。
```javascript
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store'; // 引入 Vuex Store
const app = createApp(App);
app.use(router);
app.use(store); // 挂载 Vuex Store
app.mount('#app');
```
3. **检查模板中的逻辑**:
- 确保 `v-if` 和 `v-else` 的逻辑没有冲突。
- 如果 `isLoggedIn` 返回值有问题,可能会导致渲染异常。
```vue
<template>
<header class="app-header">
<div class="header-content">
<div class="logo">
<img src="@/assets/logo.png" alt="Logo">
<h1>学习路径规划系统</h1>
</div>
<nav class="main-nav">
<router-link to="/dashboard">仪表盘</router-link>
<router-link to="/learning-path">学习路径</router-link>
<router-link to="/learning-resources">学习资源</router-link>
<router-link to="/analysis">学习分析</router-link>
<router-link to="/reports">报告生成</router-link>
<!-- 动态显示用户相关链接 -->
<div v-if="isLoggedIn" class="user-menu">
<router-link to="/profile">个人资料</router-link>
<button @click="logout">退出登录</button>
</div>
<div v-else class="auth-links">
<router-link to="/login">登录</router-link>
<router-link to="/register">注册</router-link>
</div>
</nav>
</div>
</header>
</template>
<script setup>
import { computed } from 'vue';
import { useStore } from 'vuex';
// 初始化 Vuex Store
const store = useStore();
// 计算属性:判断用户是否已登录
const isLoggedIn = computed(() => store.getters.isLoggedIn);
// 方法:触发登出事件
const logout = () => {
store.dispatch('logout'); // 调用 Vuex 的 logout action
};
</script>
```
4. **调试步骤**:
- 打印 `isLoggedIn` 的值以确认其返回值是否正确。
```javascript
console.log('Is logged in:', isLoggedIn.value);
```
5. **完整示例代码**:
```javascript
// src/store/index.js
import { createStore } from 'vuex';
export default createStore({
state: {
isAuthenticated: false,
user: null
},
getters: {
isLoggedIn(state) {
return state.isAuthenticated;
}
},
mutations: {
SET_AUTH(state, isAuthenticated) {
state.isAuthenticated = isAuthenticated;
},
SET_USER(state, user) {
state.user = user;
}
},
actions: {
login({ commit }, user) {
commit('SET_AUTH', true);
commit('SET_USER', user);
},
logout({ commit }) {
commit('SET_AUTH', false);
commit('SET_USER', null);
}
}
});
```
```javascript
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
const app = createApp(App);
app.use(router);
app.use(store);
app.mount('#app');
```
---
### 给出解释
1. **问题产生的原因**:
- 错误可能是由于 Vuex 的 `store` 未正确配置或未挂载到应用。
- 或者 `isLoggedIn` 和 `logout` 方法未定义,导致调用时抛出错误。
2. **如何避免类似问题**:
- 始终确保 Vuex 的 `store` 已正确配置,并且所有使用的 getter 和 action 都已定义。
- 使用 Vue 的调试工具(如 Vue DevTools)来检查 Vuex 的状态。
3. **Vuex 的工作原理**:
- Vuex 是 Vue 的状态管理库,通过集中式存储管理应用的所有组件的状态。
- 它提供了 `state`、`getters`、`mutations` 和 `actions` 来操作和管理状态。
---
###
阅读全文
相关推荐






<%--
Created by IntelliJ IDEA.
User: vili
Date: 2019/8/23
Time: 13:56
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@page isELIgnored="false" %>
<html>
<head>
<title>商品列表</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="layer/layer.js"></script>
<script type="text/javascript" src="js/cart.js"></script>
</head>
<body>
<jsp:include page="/header.jsp">
<jsp:param name="flag" value="1"></jsp:param>
</jsp:include>
${scrollBook.bname}
今日精选推荐
立刻购买
热销推荐
<c:forEach items="${hotList}" var="book">
查看详情
立刻购买
${book.btname} > ${book.bname}
¥ ${book.bprice}
</c:forEach>
新品推荐
<c:forEach items="${newList}" var="book">
查看详情
立刻购买
${book.btname} > ${book.bname}
¥ ${book.bprice}
</c:forEach>
<jsp:include page="/footer.jsp"></jsp:include>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: vili
Date: 2019/8/24
Time: 17:09
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@page isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
<title>后台管理</title>
</head>
<body>
<jsp:include page="header.jsp"></jsp:include>
欢迎进入叮当书城后台管理系统!
</body>
</html>
如何使后台管理页面能从主页进行跳转,直接输出修改后的代码





<template>
<el-button
class="practice-management"
@click="handlePracticeClick"
:plain="false"
:round="false"
:disabled="false"
>
实习管理
</el-button>
<hamburger
id="hamburger-container"
:is-active="appStore.sidebar.opened"
class="hamburger-container"
@toggleClick="toggleSideBar"
/>
<breadcrumb
v-if="!settingsStore.topNav"
id="breadcrumb-container"
class="breadcrumb-container"
/>
<top-nav
v-if="settingsStore.topNav"
id="topmenu-container"
class="topmenu-container"
/>
<template v-if="appStore.device !== 'mobile'">
<header-search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom">
<ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
</el-tooltip>
<el-tooltip content="文档地址" effect="dark" placement="bottom">
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
</el-tooltip>
<screenfull id="screenfull" class="right-menu-item hover-effect" />
<el-tooltip content="主题模式" effect="dark" placement="bottom">
<svg-icon v-if="settingsStore.isDark" icon-class="sunny" />
<svg-icon v-if="!settingsStore.isDark" icon-class="moon" />
</el-tooltip>
<el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip>
<el-dropdown
class="main-menu-item"
trigger="hover"
placement="bottom"
>
学生
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>学生</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<el-dropdown
class="main-menu-item"
trigger="hover"
placement="bottom"
>
消息通知
<template #dropdown>
<el-dropdown-menu class="message-dropdown">
欢迎进入工学云:
1. 如果您是学校的师生,请在"我的"-"身份认证"中完成身份认证。
2. 如果您是企业(HR),请使用微信小程序"蘑菇丁招聘"或者在电脑浏览器访问网址:
https://zhaopin.moguding.net
上传企业资料,平台审核通过后可发布职位。
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
<el-dropdown @command="handleCommand" class="avatar-container right-menu-item hover-effect" trigger="hover">
{{ userStore.nickName }}
<template #dropdown>
<el-dropdown-menu>
<router-link to="/user/profile">
<el-dropdown-item command="profile">个人中心</el-dropdown-item>
</router-link>
<el-dropdown-item command="changePwd">修改密码</el-dropdown-item>
<el-dropdown-item command="cancelAccount" divided>注销账号</el-dropdown-item>
<el-dropdown-item command="logout" divided>退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<svg-icon icon-class="more-up" />
</template>
<script setup>
import { ElMessageBox } from 'element-plus'
import { useRouter } from 'vue-router'
// 组件引入
import Breadcrumb from '@/components/Breadcrumb'
import TopNav from '@/components/TopNav'
import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import HeaderSearch from '@/components/HeaderSearch'
import RuoYiGit from '@/components/RuoYi/Git'
import RuoYiDoc from '@/components/RuoYi/Doc'
import SvgIcon from '@/components/SvgIcon'
// 状态管理引入
import useAppStore from '@/store/modules/app'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
// 状态实例
const appStore = useAppStore()
const userStore = useUserStore()
const settingsStore = useSettingsStore()
const router = useRouter()
// 侧边栏切换
function toggleSideBar() {
appStore.toggleSideBar()
}
// 实习管理按钮点击事件
function handlePracticeClick() {
console.log('点击了实习管理');
}
// 处理下拉菜单命令
function handleCommand(command) {
switch (command) {
case "profile":
router.push('/user/profile')
break
case "changePwd":
router.push('/user/change-pwd')
break
case "cancelAccount":
cancelAccount()
break
case "logout":
logout()
break
default:
break
}
}
// 注销账号确认
function cancelAccount() {
ElMessageBox.confirm('确定要注销账号吗?此操作不可恢复!', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'error'
}).then(() => {
if (userStore.cancelAccount) {
userStore.cancelAccount().then(() => {
location.href = '/index'
})
} else {
location.href = '/index'
}
}).catch(() => { })
}
// 退出登录
function logout() {
ElMessageBox.confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
userStore.logOut().then(() => {
location.href = '/index'
})
}).catch(() => { })
}
// emits声明
const emits = defineEmits(['setLayout'])
function setLayout() {
emits('setLayout')
}
// 主题切换
function toggleTheme() {
settingsStore.toggleTheme()
}
</script>
<style lang='scss' scoped>
.navbar {
height: 50px;
overflow: hidden;
position: relative;
background: #000;
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
display: flex;
align-items: center;
/* 解决flex布局下子元素溢出问题 */
width: 100%;
box-sizing: border-box;
// 实习管理按钮样式(强化穿透优先级)
:deep(.practice-management.el-button) {
/* 基础布局 - 确保占满导航栏高度 */
height: 50px !important; /* 直接指定高度,避免100%可能的继承问题 */
min-width: 100px;
margin: 0 !important;
padding: 0 20px !important;
order: -1; /* 强制居左 */
flex-shrink: 0; /* 避免被压缩 */
/* 样式覆盖 - 完全清除Element默认样式 */
border: none !important;
border-radius: 0 !important;
background-color: #409EFF !important; /* 主蓝色 */
color: #fff !important;
font-size: 14px !important;
font-weight: 500 !important;
text-align: center !important;
box-shadow: none !important; /* 清除默认阴影 */
box-sizing: border-box !important;
/* 内容居中 - 解决文字偏移问题 */
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
line-height: 1 !important; /* 重置行高,避免文字垂直偏移 */
/* 交互状态强化 */
&:hover {
background-color: #66b1ff !important; /* 亮蓝色hover */
color: #fff !important;
border-color: transparent !important;
box-shadow: none !important;
}
&:active {
background-color: #3a8ee6 !important; /* 深蓝光晕active */
color: #fff !important;
border-color: transparent !important;
}
&:focus {
outline: none !important;
box-shadow: none !important;
}
/* 禁用状态(如果需要) */
&.is-disabled {
background-color: #a0cfff !important;
color: #fff !important;
}
}
.hamburger-container {
line-height: 46px;
height: 100%;
padding: 0 15px;
cursor: pointer;
transition: background 0.3s;
-webkit-tap-highlight-color: transparent;
&:hover {
background: rgba(255, 255, 255, 0.1);
}
}
.breadcrumb-container {
padding: 0 15px;
/* 避免面包屑挤压按钮 */
flex-shrink: 1;
overflow: hidden;
}
.topmenu-container {
flex: 1;
padding-left: 15px;
}
.right-menu {
margin-left: auto;
height: 100%;
line-height: 50px;
display: flex;
align-items: center;
flex-shrink: 0;
&:focus {
outline: none;
}
.right-menu-item {
display: inline-block;
padding: 0 8px;
height: 100%;
font-size: 18px;
color: #fff;
vertical-align: text-bottom;
&.hover-effect {
cursor: pointer;
transition: background 0.3s;
&:hover {
background: rgba(255, 255, 255, 0.1);
}
}
&.theme-switch-wrapper {
display: flex;
align-items: center;
svg {
transition: transform 0.3s;
&:hover {
transform: scale(1.15);
}
}
}
}
.main-menu {
display: flex;
align-items: center;
height: 100%;
margin: 0 8px;
.main-menu-item {
margin: 0 5px;
padding: 0 8px;
height: 100%;
display: flex;
align-items: center;
cursor: pointer;
color: #fff;
font-size: 14px;
&:hover {
background: rgba(255, 255, 255, 0.1);
}
}
}
.message-dropdown {
.message-content {
padding: 15px;
min-width: 350px;
line-height: 1.6;
font-size: 14px;
p {
margin: 0 0 10px 0;
color: #333;
}
.external-link {
color: #409EFF;
text-decoration: underline;
}
}
}
.avatar-container {
margin-right: 0px;
padding-right: 0px;
.avatar-wrapper {
margin-top: 10px;
right: 5px;
position: relative;
display: flex;
align-items: center;
padding: 0 10px;
.user-avatar {
cursor: pointer;
width: 30px;
height: 30px;
border-radius: 50%;
}
.user-nickname{
margin-left: 8px;
font-size: 14px;
color: #fff;
white-space: nowrap;
}
}
}
}
}
</style>
要怎么修改才能把实习管理弄成button的样式,并且是蓝色的,不需要跳转

将以下代码修改为响应式布局修改页面分辨率时布局仍然保持原样,不出现滚动条<template>
XX公司
XX云综合管理平台
<el-row :gutter="20">
<el-col v-for="(app, index) in apps" :key="index" :xs="24" :sm="12" :md="6" :lg="6">
{{ app.name }}
{{ app.name }}
</el-col>
</el-row>
</template>
<script>
export default {
name: "Home",
data() {
return {
hoverIndex: -1,
apps: [{
name: '智慧应用',
icon: 'el-icon-cpu',
url: 'index'
},
{
name: '运行监测',
icon: 'el-icon-monitor',
url: ''
},
{
name: 'AI仿真',
icon: 'el-icon-data-analysis',
url: ''
},
{
name: '数据中台',
icon: 'el-icon-data-board',
url: ''
}
],
redirect: undefined,
devicePixelRatio: null,
contentStyle: {}
}
},
methods: {
goIndex() {
this.$router.replace({
path: "Index"
})
}
}
}
</script>
<style scoped>
.energy-platform {
box-sizing: border-box;
padding: 8rem 10rem;
width: 100%;
/* height: 100vh; */
min-height: 100vh;
background-image: url('../assets/image/bg.png');
/* 背景图片设置 */
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
filter: brightness(1);
}
.header {
text-align: left;
font-style: italic;
color: #fff;
font-size: 40px;
}
.company-name {
margin-bottom: 30px;
}
.company-name,
.platform-name {
text-align: left;
font-weight: bold;
margin-bottom: 20px;
color: #fff;
}
.gradient-bar {
height: 4px;
background: linear-gradient(to right, #29b0dd, #2aaed9, #ffffff);
width: 260px;
margin-bottom: 90px;
}
.app-container {
margin: 0 auto;
}
.app-card {
height: 260px;
width: 80%;
background: #fff;
border-radius: 8px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
}
.img-item2 {
width: 100%;
}
.app-card:hover {
transform: translateY(-5px);
box-shadow: 0 6px 18px 0 rgba(0, 0, 0, 0.15);
}
.app-icon {
font-size: 50px;
color: #333;
margin-bottom: 40px;
transition: all 0.3s ease;
}
.app-card:hover .app-icon {
color: #fff;
}
.app-title {
font-size: 22px;
font-weight: bold;
color: #333;
transition: all 0.3s ease;
}
.app-card:hover .app-title {
color: #000;
}
/* 响应式调整 */
@media (max-width: 768px) {
.company-name {
font-size: 40px;
}
.platform-name {
font-size: 20px;
}
.app-card {
height: 120px;
width: 100%;
}
.app-icon {
font-size: 30px;
margin-bottom: 10px;
}
.app-title {
font-size: 16px;
}
.gradient-bar {
margin-bottom: 40px;
}
}
/* 响应式调整 */
@media (max-width: 1366px) {
.energy-platform {
padding: 150px 100px;
}
.app-card {
width: 90%;
}
}
/* 响应式调整 */
@media (max-width: 1024px) {
.energy-platform {
padding: 150px 200px;
}
.app-card {
width: 100%;
}
}
</style>


<template>
<logo-svg class="logo-svg" />
<router-link :to="{name:'home'}" class="logo-text">
{{appStore.title}}
</router-link>
<template v-for="m in menus">
{{m.text}}
<router-link v-else :to="{name: m.code}"
@click="play"
class="menu-item nav-ab t" :class="m.code">
{{m.text}}
</router-link>
</template>
欢迎你,超级管理员
<el-button size="small" type="primary" plain class="is-square" icon="Sunny" @click="appStore.toggleTheme()"></el-button>
<el-button size="small" type="primary" plain class="is-square" icon="FullScreen" @click="toggleFullscreen()"></el-button>
<el-button size="small" type="primary" plain class="is-square" icon="MoreFilled"></el-button>
<el-button size="small" type="danger" plain>退出</el-button>
</template>
<script setup lang="ts">
import _ from "lodash"
import {computed, onMounted, ref, onUnmounted} from "vue";
import {useAppStore} from "@/services/store/app";
import {Howl} from 'howler';
import menuSound from "@/assets/medias/menu.mp3"
import {useNow, useDateFormat, useDark} from '@vueuse/core'
import animate1Image from "./images/animate-1.png"
import animate2Image from "./images/animate-2.png"
import logoSvg from "@/assets/images/logo.svg"
const appStore = useAppStore();
const now = useNow();
const nowTime = ref('')
const timer = ref()
const isDark = useDark();
//region sound
var sound = new Howl({
src: [menuSound],
volume: .4
});
const play = () => {
sound.play();
};
//endregion
const menus = [
{code:'home', text:'首页', icon:'mdi-home'},
{code:'network', text:'网络', icon:'mdi-lan'},
{code:'transfer', text:'数据', icon:'mdi-transfer'}/*,
{code:'stat', text:'检索统计', icon:'mdi-chart-bar-stacked', href: headerQueryMenuUrl},
{code:'manage', text:'后台管理', icon:'mdi-monitor-dashboard', href:headerManageMenuUrl}*/
];
import {usePageAnimate} from "@/services/hook/usePageAnimate";
import axios from "axios";
usePageAnimate("nav-ab");
onMounted(() => {
});
onUnmounted(()=> {
})
import { useFullscreen } from '@vueuse/core'
import {headerManageMenuUrl, headerQueryMenuUrl} from "@/services/config";
const { isFullscreen, enter, exit, toggle: toggleFullscreen } = useFullscreen()
</script>
<style lang="scss" scoped>
@use "sass:math";
@import "@/assets/css/_var";
$padding: 36px;
.nav {
position:absolute;
left:$padding;right:$padding;top:$padding;
z-index:10;
height:80px;
backdrop-filter: blur(3px);
//box-shadow: 0 1px 10px rgba(0,0,0,.3)
//background-color: rgba(red,.5);
}
.header-bg {
//height: 90px;
width:100%;
//background: url(./images/header-bg.png) no-repeat bottom center;
//background-size: contain;
position: absolute;
z-index:0;
top:0;left:0;right:0;bottom:0;
border-top: transparent solid 6px;
border-bottom: transparent solid 1px;
background: rgba($-primary-color, 0.3);
border-top-color:$-primary-color;
border-bottom-color: $-primary-color;
box-shadow: 0 0 6px #035f71;
&:after {
content:"";
position: absolute;top:0;bottom:0;left:0;right:0;
//background: linear-gradient(45deg , rgba($-primary-color , .5) 60%, $-primary-color);
}
}
.right-side {
position: relative;
}
.logo-con {
display: flex; align-items: center; justify-content: center;
}
.logo-border {
//background:rgba(255,255,255,.1);
padding:0 25px;display:flex;align-items:center;
height:100%;
position:relative;z-index:1;
border-top:transparent solid 6px;
border-bottom:transparent solid 6px;
box-shadow: 1px 0 10px rgba(0,0,0,.2);
border-color: rgba($-primary-color, 1);;
}
.logo-svg {
width:60px;margin-left1:10px;
//filter: drop-shadow( 0px 0px 6px rgba(#bcffff, .3));
//fill: #00c8e1;
:deep {
path {fill:#253223}
path.lightning {
fill:#ffcc00;
stroke-width: 0;
}
//.circle-middle {
// fill: #ffcc00;
//}
.dot {fill:#ffcc00;}
.circle-bg {fill:transparent}
}
}
.logo-text {
padding-left:20px;
font-family: shuhei;font-size:42px;
margin-top:3px;
text-shadow1: 5px 5px 1px rgba(255,255,255,.1);
filter: drop-shadow( 1px 1px 2px #253223);
background-image: -webkit-linear-gradient(90deg, rgb(245, 255, 250) , $-primary-color );
//background-image: linear-gradient(180deg,#fff,#2af1f8);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.menu-con {
display: flex;
flex:1;
justify-content: center;
position:relative;z-index:1;
margin-top:6px;
}
.menu-item {
display: flex;
align-items: center;justify-content: center;
border:rgba(#253223,.9) solid 1px;
background: rgba($-primary-color,.4);
color:rgba(#253223, .8);
border-radius:2px;
width:150px;height:44px;
margin:0 15px;
background-size:cover;
text-align:center;
font-size:20px;
font-family: fzzzh;
font-weight: normal;
letter-spacing: 5px;
transition: all .3s;
span.mdi {opacity: .9}
&:after, &:before {
transition: all .3s;
content:'';
position: absolute;
width:3px;height:24px;
background: rgba(#253223,.6)
}
&:before {left:0;}
&:after {
right:0;
}
&:hover {
border-color:#253223;
color:#253223;
background: rgba(#fff, .8);
&:after, &:before {
height:28px;
background: rgba(#253223,.9)
}
&:after {right:3px}
&:before {left:3px}
}
&.router-link-active {
span.mdi {opacity: 1}
color: $-primary-color;
border-width:2px;
border-radius:4px;
border-color:$-primary-color;
background: rgba(14, 31, 14,.9);
font-weight:bold;
box-shadow: 0 0 8px #253223;
&:after, &:before {
width:4px;
background: rgba($-primary-color,.8)
}
}
&.job, &.live, &.vehicle{
text-decoration: line-through;
}
}
.animate-blocks {
width: 55px;
height: 25px;
left: 662px;
top: 74px;
position: absolute;
visibility: visible;
pointer-events: none;
transition: transform 600ms;
display: flex;
align-items: center;
justify-content: space-evenly;
}
.animate-block-item {
width:8px;height:10px;
background: linear-gradient(to right , rgba(120, 255, 255, .8) , transparent);
transform: skewX(-40deg);
border-radius:1px;
}
.animate-1-con {
position: absolute;
pointer-events: none;
left: 399px;
top: 0;
width: 120px;
height: 100%;
opacity:.3;
}
.animate-1-img {
width:100%;height:100%;
border-radius: unset;
cursor: pointer;
pointer-events: none;
animation-name: animate-1;
animation-iteration-count: infinite;
animation-timing-function: linear;
animation-duration: 5s;
animation-delay: 0s;
-webkit-user-drag: none;
filter: none;
}
@keyframes animate-1 {
0% {
opacity: 0;
transform: none;
}
15% {
opacity: 0.75;
transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg) scaleX(1) scaleY(1) translate3d(150px, 0px, 0px);
}
30% {
opacity: 1;
transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg) scaleX(1) scaleY(1) translate3d(300px, 0px, 0px);
}
45% {
opacity: 0.75;
transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg) scaleX(1) scaleY(1) translate3d(450px, 0px, 0px);
}
60% {
opacity: 0;
transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg) scaleX(1) scaleY(1) translate3d(600px, 0px, 0px);
}
100% {
opacity: 0;
transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg) scaleX(1) scaleY(1) translate3d(600px, 0px, 0px);
}
}
.animate-2-con {
position: absolute;
pointer-events: none;
left: 646px;
bottom: 0;
width: 120px;
height: 60%;
opacity:.3;
}
.animate-2-img {
width:100%;height:100%;
border-radius: unset;
cursor: pointer;
pointer-events: none;
animation-name: animate-2;
animation-iteration-count: infinite;
animation-timing-function: linear;
animation-duration: 4s;
animation-delay: 0s;
-webkit-user-drag: none;
filter: none;
}
@keyframes animate-2 {
0% {
opacity: 0;
transform: none;
}
50% {
opacity: .78;
transform: translateX(450px);
}
100% {
opacity: 0;
transform: translateX(900px);
}
}
$star-width: math.div(1120px, 1.5);
$star-height: math.div(660px, 1.5);
.star {
position:absolute;top:-113px;left:-10px;
width:$star-width;height:$star-height;
background: url(./images/star.png) no-repeat bottom center;
background-size: cover;
animation-name: star-animate;
animation-iteration-count: infinite;
animation-timing-function: linear;
animation-duration: 10s;
animation-delay: 10s;
-webkit-user-drag: none;
//filter: brightness(150%);
}
@keyframes star-animate {
0% {
opacity: 1;
}
50% {
opacity: .5;
}
100% {
opacity: 1;
}
}
div.nav.dark {
.header-bg {
border-top-color:rgb(71, 128, 76);
border-bottom-color:rgba(6, 253, 253, .15);
background: rgba($-primary-color, 0.3);
//background-color: rgba(106, 211, 137, 0.12);
&:after {
background: linear-gradient(-45deg , rgba(0,0,0,.4), transparent);
}
}
.logo-border {
border-color: rgb(71, 128, 76);
}
.logo-text {
background-image: -webkit-linear-gradient(90deg, rgb(150, 248, 140) 0%, rgb(245, 255, 250) 90%);
}
.logo-svg {
:deep {
path {fill:rgba(113, 228, 102,.6)}
path.lightning {
fill:#ffcc00;
stroke-width: 0;
}
//.dot {fill:rgba(#fff,.7);}
.circle-bg {fill:transparent}
}
}
$-menu-color: #71e466; //7cffff
.menu-item {
border:rgba($-menu-color,.3) solid 1px;
background: rgba(0,0,0,.2);
color:rgba($-menu-color, .5);
&:after, &:before {
background: rgba($-menu-color,.3)
}
&:hover {
border-color:$-menu-color;
color:$-menu-color;
background: rgba($-menu-color, .1);
&:after, &:before {
background: rgba($-menu-color,.6)
}
}
&.router-link-active {
color: $-menu-color;
border-color:$-menu-color;
&:after, &:before {
background: rgba($-menu-color,.8)
}
}
}
}
</style>

<template>
<group class="items">
高级
</group>
<scroller class="date-content">
<inline-calendar
ref="calendar"
@on-change="onChange"
@on-view-change="onViewChange"
class="inline-calendar-demo"
:end-date="this.endDate"
:show.sync="show"
v-model="value"
:range="range"
:show-last-month="showLastMonth"
:show-next-month="showNextMonth"
:highlight-weekend="highlightWeekend"
:return-six-rows="return6Rows"
:hide-header="hideHeader"
:hide-week-list="hideWeekList"
:replace-text-list="replaceTextList"
:weeks-list="weeksList"
:render-function="buildSlotFn"
:disable-past="disablePast"
:disable-future="disableFuture"
:disable-weekend="disableWeekend">
</inline-calendar>
<group class="items">
<cell class="booklist-wrap">
已预订列表
</cell>
</group>
<group class="items choosetime">
<cell v-for="(event, index) in demoEvents" :key = "index"
primary="content" :title="event.startTime+'-'+event.endTime"
align-items="flex-start" >
{{event.userId}}
{{event.userPhone}}
{{event.title}}
</cell>
</group>
</scroller>
<x-button plain @click.native="goRoom" type="default" style="border-radius:99px;">预订</x-button>
<alert v-model="show" @on-show="onShow" @on-hide="onHide">
{{bookTip}}
确认
</alert>
</template>
<script>
// import Calendar from './base/CCalendar.vue'
import axios from 'axios'
// import $ from "jquery"
import moment from 'moment' // 格式化时间
import { Flexbox, FlexboxItem,Cell,CellBox,Group,Datetime, PopupPicker,Picker,XInput,XButton, InlineCalendar,Radio,Alert } from 'vux'
let selectTime = '' // 选中的时间变量
let selectRoom = '' // 选中的会议室
let selectArea = '' // 选中的地区
export default {
// components: {
// calendar: Calendar
// },
data () {
return {
show: true,
value: '',
listValue: '',
range: false,
showLastMonth: true,
showNextMonth: true,
highlightWeekend: false,
return6Rows: true,
hideHeader: false,
hideWeekList: false,
replaceTextList: {},
replace: false,
changeWeeksList: false,
weeksList: [],
useCustomFn: false,
buildSlotFn: () => '',
disablePast: true,
disableFuture: false,
disableWeekend: false,
showTimeSpace:false,
value3: [],
endDate:'',
startTime: '',
endTime: '',
demoEvents: [],// 预定列表
selectArea: '',// 选中的地区
selectRoom: '',// 选中的会议室
DepartList: [],// 地区列表
MeetingRoomList: [],// 会议室列表
show:false,
bookTip:''//预定失败提示信息
}
},
components: {
Flexbox,
FlexboxItem,
Cell,
CellBox,
Group,
Datetime,
PopupPicker,
Picker,
XInput,
XButton,
InlineCalendar,
Radio,
Alert
},
beforeMount (to,from, next){
window.com.setTitle('预订会议室')
},
computed: {
sporsorTitle: {
get () {
return this.$store.state.form.sporsorTitle
},
set (val) {
this.$store.dispatch('FORM_SporsorTitle',val)
}
},
sporsorType: {
get () {
return this.$store.state.form.sporsorType
},
set (val) {
this.$store.dispatch('FORM_SporsorType',val)
}
},
conferRoomId: {
get () {
return this.$store.state.form.conferRoomId
},
set (val) {
this.$store.dispatch('FORM_ConferRoomId',val)
}
},
flagUpSporsor: {
get () {
return this.$store.state.form.flagUpSporsor
},
set (val) {
this.$store.dispatch('FORM_FlagUpSporsor',val)
}
},
sporsorId: {
get () {
return this.$store.state.form.sporsorId
},
set (val) {
this.$store.dispatch('FORM_SporsorId',val)
}
}
},
watch: {
replace (val) {
this.replaceTextList = val ? {
'TODAY': '今'
} : {}
},
useCustomFn (val) {
this.buildSlotFn = val ? (line, index, data) => {
return /8/.test(data.date) ? '' : ''
} : () => ''
},
changeWeeksList (val) {
this.weeksList = val ? ['日', '一', '二', '三', '四', '五', '六 '] : ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
}
},
methods: {
onHide () {
this.show=false;
},
onShow () {
this.show=true;
},
//会议地点改变
changePicker() {
var urlPath = ''
if(this.value != '') {
urlPath = config.serverUrl + '/microinformation/zy/mi/obtainConferenceroomOrderList?conferenceroomId='+this.value3[1]+'&orderDate='+this.value
} else {
let date = new Date
let nowDate = moment(date).format('YYYY-MM-DD')
urlPath = config.serverUrl + '/microinformation/zy/mi/obtainConferenceroomOrderList?conferenceroomId='+this.value3[1]+'&orderDate='+nowDate
}
// console.log('urlPath:'+urlPath)
axios.get(urlPath).then((data) => {
var temp = data.data
if(temp.code === '0') {
var opArry = []
for(var i in temp.data) {
temp.data[i].userPhone=temp.data[i].userPhone==''?'无':temp.data[i].userPhone
temp.data[i].title=temp.data[i].title==null?'无':temp.data[i].title
opArry.push({
userId:temp.data[i].userId,
title:temp.data[i].title,
startTime:moment(temp.data[i].startTime).format('HH:mm'),
endTime:moment(temp.data[i].endTime).format('HH:mm'),
userPhone:temp.data[i].userPhone
});
}
this.demoEvents = opArry
} else {
this.bookTip = '获取列表失败'
this.show = true;
// app.toast("获取列表失败!")
}
});
},
onViewChange (val, count) {
// alert('on view change:'+val + ',' + count)
},
onChange (val) {
selectTime = val
if(this.value3[1] != undefined) {
// console.log('url:' + config.serverUrl + '/microinformation/zy/mi/obtainConferenceroomOrderList?conferenceroomId='+this.value3[1]+'&orderDate='+selectTime)
axios.get(config.serverUrl + '/microinformation/zy/mi/obtainConferenceroomOrderList?conferenceroomId='+this.value3[1]+'&orderDate='+selectTime).then((data) => {
var temp = data.data
if(temp.code === '0') {
var opArry = []
for(var i in temp.data) {
temp.data[i].userPhone=temp.data[i].userPhone==''?'无':temp.data[i].userPhone
temp.data[i].title=temp.data[i].title==null?'无':temp.data[i].title
opArry.push({
userId:temp.data[i].userId,
title:temp.data[i].title,
startTime:moment(temp.data[i].startTime).format('HH:mm'),
endTime:moment(temp.data[i].endTime).format('HH:mm'),
userPhone:temp.data[i].userPhone
});
}
this.demoEvents = opArry
} else {
this.bookTip = '获取列表失败'
this.show = true;
// app.toast("获取列表失败!")
}
});
}
},
chooseDepartment (paramkey) { // 根据地区编号获取会议室列表
selectArea = paramkey
axios.get(config.serverUrl + '/microinformation/zy/mi/obtainConferenceroomListByAreaId?areaId='+paramkey).then((data) => {
var temp = data.data
if(temp.code === '0') {
this.MeetingRoomList = temp.data
} else {
this.bookTip = '获取会议室列表失败'
this.show = true;
// app.toast('获取会议室列表!')
}
});
},
chooseBookingRoom (eventroomId) { //根据会议室编号和选定日期获取预定列表
selectRoom = eventroomId
if(selectTime === '') {// 选定了会议室,没选定日期
let date = new Date
let nowDate = moment(date).format('YYYY-MM-DD')
axios.get(config.serverUrl + '/microinformation/zy/mi/obtainConferenceroomOrderList?conferenceroomId='+eventroomId+'&orderDate='+nowDate).then((data) => {
var temp = data.data
if(temp.code === '0') {
var opArry = []
for(var i in temp.data) {
// var ss = ''
// if(temp.data[i].stateShow == '1') {
// ss = '进行中'
// } else if(temp.data[i].stateShow == '2') {
// ss = '正常'
// }
temp.data[i].userPhone=temp.data[i].userPhone==''?'无':temp.data[i].userPhone
temp.data[i].title=temp.data[i].title==null?'无':temp.data[i].title
opArry.push({userName:temp.data[i].userName,
userPhone:temp.data[i].userPhone,
// stateShow:ss,// 状态
title:temp.data[i].title,
startTime:moment(temp.data[i].startTime).format('HH:mm'),
endTime:moment(temp.data[i].endTime).format('HH:mm')
});
}
this.demoEvents = opArry
} else {
this.bookTip = '获取会议室列表失败'
this.show = true;
// app.toast('获取会议室失败!')
}
});
} else {// 选定了会议室,选定日期
// alert("value: " + obj.value + ',selectTime:' + selectTime)
}
},
//跳转到会议室预定
goRoom () {
var choice_time = ''
if(this.value != '') {
var dateObj = new Date()
choice_time = this.value + ' ' + dateObj.getHours()
} else {
let date = new Date
let nowDate = moment(date).format('YYYY-MM-DD HH')
choice_time = nowDate
}
var timeString = moment(window.com.convertDateFromStrings(choice_time + ':00:00')).format('YYYY-MM-DD HH:mm')
if(this.value3.length != 0) {
this.$router.push({path:'bookingRoom',query:{roomId:this.value3[1],conferenceRoomId:this.$route.query.conferenceRoomId,timeStart:timeString,timeEnd:timeString}})
} else {
this.bookTip = '请点击选择会议室'
this.show = true;
// app.toast('请选择会议室!')
}
},
//跳到高级搜索
goSearchPage: function() {
this.$router.push({path:'conferenceRoomSearch'})
}
},
mounted () {
let dq=new Date();
let dqtime=dq.getFullYear()+'-'+(dq.getMonth()+2)+'-'+dq.getDate();
this.endDate=dqtime;
if(window.localStorage.getItem('userId') != null && window.localStorage.getItem('userId') != undefined) {
// 获取地区和会议室名称数据
// console.log('url:'+config.serverUrl + '/microinformation/zy/mi/obtainAreaAndConferenceroomList')
axios.get(config.serverUrl + '/microinformation/zy/mi/obtainAreaAndConferenceroomList').then((data) => {
var temp = data.data
if(temp.code === '0') {
this.DepartList = temp.data
} else {
this.bookTip = '获取地区列表失败'
this.show = true;
// app.toast('获取地区列表失败!')
}
});
} else {
window.location.href = "http://dwz.cn/1IooUbPb"
}
}
}
</script>
<style lang="less" src="./booking.less"></style> 这块代码我需要优化一个功能点,即如9:00-18:00之间会议室有空闲时间的就在日期底部显示一个小绿点



