提交 99f9990d authored 作者: 王鹏飞's avatar 王鹏飞

页面初始化创建游客用户

上级 fe03411b
...@@ -43,3 +43,7 @@ export function bindVisitor(data) { ...@@ -43,3 +43,7 @@ export function bindVisitor(data) {
export function getIsVip() { export function getIsVip() {
return httpRequest.get('/zy/user/is-vip') return httpRequest.get('/zy/user/is-vip')
} }
// 创建游客用户
export function createGuestUser() {
return httpRequest.get('/zy/user/create-guest-user')
}
...@@ -2,6 +2,7 @@ import axios from 'axios' ...@@ -2,6 +2,7 @@ import axios from 'axios'
import _ from 'lodash' import _ from 'lodash'
import store from '../store' import store from '../store'
import router from '../router' import router from '../router'
export default class API { export default class API {
constructor(config) { constructor(config) {
/* 创建一个 自定义配置axios实例 */ /* 创建一个 自定义配置axios实例 */
...@@ -15,9 +16,6 @@ export default class API { ...@@ -15,9 +16,6 @@ export default class API {
baseURL: config.apiBaseURL || '', baseURL: config.apiBaseURL || '',
/* 即将被发送的自定义请求头 */ /* 即将被发送的自定义请求头 */
headers: { headers: {
// Accept: '*/*',
// cookie: 'VEdULTgxNy1nLW5ULWMwWjlESnNpMGVLaEw4M3VwZFN4SDhJLUZzMHo2aEVPcHJUWHoyTGNCbGhPZWpCR0o2Y1BFTnRBc1hKSHZNLXNlcnZlckBAQDE5Mi4xNjguMTAuMTQ1QEBATW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxM18yXzMgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjAuMyBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMUBAQDY2NDU1NjUyNDc1ODUyNTU0MjQ=',
// 'Accept-Language': '',
'Content-Type': 'application/x-www-form-urlencoded' 'Content-Type': 'application/x-www-form-urlencoded'
} }
}) })
...@@ -34,9 +32,11 @@ export default class API { ...@@ -34,9 +32,11 @@ export default class API {
const beforeSuccess = _config.beforeSuccess ? _config.beforeSuccess : this._reqSuccess const beforeSuccess = _config.beforeSuccess ? _config.beforeSuccess : this._reqSuccess
/* 具体执行请求失败后业务逻辑前,先执行该方法 */ /* 具体执行请求失败后业务逻辑前,先执行该方法 */
const beforeFail = _config.beforeFail ? _config.beforeFail : this._reqFail const beforeFail = _config.beforeFail ? _config.beforeFail : this._reqFail
const guestUser = store.state.guestUser || {}
const headers = { const headers = {
tenant: 'transport' tenant: 'transport',
// 'Content-Type': 'application/x-www-form-urlencoded' userId: guestUser.user_id,
studentId: guestUser.student_id
} }
_config.headers = _.assignIn(_config.headers, headers) _config.headers = _.assignIn(_config.headers, headers)
/* 判别 传输方式 */ /* 判别 传输方式 */
...@@ -114,7 +114,7 @@ export default class API { ...@@ -114,7 +114,7 @@ export default class API {
} }
} }
if (status === 500) { if (status === 500) {
window.alert(res.response.message) window.alert(data.message)
} }
} }
err = new Error(JSON.stringify(res.response)) err = new Error(JSON.stringify(res.response))
......
...@@ -6,15 +6,23 @@ ...@@ -6,15 +6,23 @@
<div class="course-item-content"> <div class="course-item-content">
<div class="course-item__title">{{ data.title }}</div> <div class="course-item__title">{{ data.title }}</div>
<div class="course-item__tools"> <div class="course-item__tools">
<div class="course-item__text course-item__text__course">{{ data.course_num }}节课</div> <div>
<div
class="course-item__text course-item__text__freevideo"
>{{ data.free_video_num }}个免费视频</div>
</div>
<div class="course-item__text course-item__text__video">{{ data.video_num }}节视频课</div> <div class="course-item__text course-item__text__video">{{ data.video_num }}节视频课</div>
<div class="course-item__text course-item__text__course">{{ data.course_num }}节课</div>
</div> </div>
</div> </div>
</div> </div>
<div class="course-item-bottom" v-show="isOpen"> <div class="course-item-bottom" v-show="isOpen">
<div class="course-child" v-for="item in data.child" :key="item.id" @click="onClick(item)"> <div
{{ item.course_name }} class="course-child"
</div> v-for="item in data.child"
:key="item.id"
@click="onClick(item)"
>{{ item.course_name }}</div>
</div> </div>
</div> </div>
</template> </template>
...@@ -65,7 +73,7 @@ export default { ...@@ -65,7 +73,7 @@ export default {
.course-item-pic { .course-item-pic {
width: 3.15rem; width: 3.15rem;
height: 2rem; height: 2rem;
margin-right: 10px; margin-right: 0.15rem;
overflow: hidden; overflow: hidden;
} }
.course-item-content { .course-item-content {
...@@ -86,22 +94,31 @@ export default { ...@@ -86,22 +94,31 @@ export default {
.course-item__text { .course-item__text {
display: inline-block; display: inline-block;
height: 0.48rem; height: 0.48rem;
margin-left: 0.15rem;
padding: 0 0.2rem; padding: 0 0.2rem;
font-size: 0.24rem; font-size: 0.24rem;
line-height: 0.48rem; line-height: 0.48rem;
text-align: center;
box-sizing: border-box;
} }
.course-item__text:first-child { .course-item__text + .course-item__text {
margin-left: 0; margin-left: 0.1rem;
} }
.course-item__text__course { .course-item__text__course {
color: #fff; color: #fff;
background-color: #75b0ff; background-color: #75b0ff;
} }
.course-item__text__video { .course-item__text__video {
min-width: 1.8rem;
color: #fff; color: #fff;
background-color: #5ad0b2; background-color: #5ad0b2;
} }
.course-item__text__freevideo {
min-width: 1.8rem;
margin-bottom: 0.1rem;
color: #fff;
background-color: #d05a5a;
}
.course-child { .course-child {
font-size: 13px; font-size: 13px;
color: #666; color: #666;
......
...@@ -5,6 +5,9 @@ export default class Before { ...@@ -5,6 +5,9 @@ export default class Before {
} }
async update(to, from, next) { async update(to, from, next) {
// 创建游客用户
await store.dispatch('createGuestUser')
if (to.meta.requiredLogin) { if (to.meta.requiredLogin) {
const isLogin = store.state.isLogin || (await store.dispatch('checkLogin')) const isLogin = store.state.isLogin || (await store.dispatch('checkLogin'))
if (isLogin) { if (isLogin) {
......
import Vue from 'vue' // 引入vue框架 import Vue from 'vue' // 引入vue框架
import VueRouter from 'vue-router' // 使用 vue-router
import router from './router' // router定义 import router from './router' // router定义
import store from '@/store' import store from './store'
import VueI18n from 'vue-i18n' // 使用 国际化 import VueI18n from 'vue-i18n' // 使用 国际化
import createI18n from './assets/languages' // 国际化定义 import createI18n from './assets/languages' // 国际化定义
import App from './app.vue' // 初始化 vue页面 import App from './app.vue' // 初始化 vue页面
import './style.scss' // 公共样式 import './style.scss' // 公共样式
import './assets/rem/rem.js' import './assets/rem/rem.js'
...@@ -24,7 +22,6 @@ Vue.use(Vant) ...@@ -24,7 +22,6 @@ Vue.use(Vant)
require('promise.prototype.finally').shim() require('promise.prototype.finally').shim()
/* 兼容处理 end */ /* 兼容处理 end */
Vue.use(VueRouter)
Vue.use(VueI18n) Vue.use(VueI18n)
const i18n = createI18n() const i18n = createI18n()
...@@ -57,6 +54,3 @@ window.G.$instance_vue = new Vue({ ...@@ -57,6 +54,3 @@ window.G.$instance_vue = new Vue({
i18n, i18n,
render: h => h(App) render: h => h(App)
}).$mount('#app') }).$mount('#app')
// 获取环境
store.dispatch('getEnv')
...@@ -7,7 +7,10 @@ ...@@ -7,7 +7,10 @@
</template> </template>
<ul> <ul>
<li v-for="subItem in item.children" :key="subItem.id" @click="onClick(subItem)"> <li v-for="subItem in item.children" :key="subItem.id" @click="onClick(subItem)">
<div class="name">{{subItem.name}}</div> <div class="name">
{{subItem.name}}
<template v-if="subItem.free">(免费)</template>
</div>
<!-- <div class="progress">{{subItem.video_progress | progressText}}</div> --> <!-- <div class="progress">{{subItem.video_progress | progressText}}</div> -->
</li> </li>
</ul> </ul>
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
</template> </template>
<script> <script>
import { random } from 'lodash'
import CourseChapter from './components/courseChapter.vue' import CourseChapter from './components/courseChapter.vue'
import CourseTag from '../tag/index.vue' import CourseTag from '../tag/index.vue'
import * as api from '@/api/course.js' import * as api from '@/api/course.js'
...@@ -46,9 +45,6 @@ export default { ...@@ -46,9 +45,6 @@ export default {
computed: { computed: {
courseId() { courseId() {
return this.$route.params.id return this.$route.params.id
},
isVip() {
return this.$store.state.isVip
} }
}, },
methods: { methods: {
...@@ -68,16 +64,7 @@ export default { ...@@ -68,16 +64,7 @@ export default {
} }
}, },
beforeMount() { beforeMount() {
// 检测是否是付费用户 this.getCourse()
this.$store.dispatch('checkIsVip').then(isVip => {
if (isVip) {
this.getCourse()
} else {
const routes = { 0: '/pay', 1: '/payPage' }
const path = routes[random(1)] || '/pay'
this.$router.replace(path)
}
})
} }
} }
</script> </script>
......
...@@ -4,12 +4,12 @@ ...@@ -4,12 +4,12 @@
<div class="alarm-form"> <div class="alarm-form">
<div class="alarm-form-time"> <div class="alarm-form-time">
<div class="alarm-form-time__lable">提醒时间</div> <div class="alarm-form-time__lable">提醒时间</div>
<van-picker <van-datetime-picker
v-model="ruleForm.time" v-model="ruleForm.time"
:columns="timeColumns" type="time"
:filter="filter"
:item-height="30" :item-height="30"
:default-index="defaultIndex" :show-toolbar="false"
@change="onChangeTime"
/> />
</div> </div>
<div class="alarm-form-item"> <div class="alarm-form-item">
...@@ -35,12 +35,7 @@ export default { ...@@ -35,12 +35,7 @@ export default {
name: 'AlarmUpdate', name: 'AlarmUpdate',
props: { props: {
isUpdate: { type: Boolean, default: false }, isUpdate: { type: Boolean, default: false },
data: { data: { type: Object, default: () => ({}) }
type: Object,
default() {
return {}
}
}
}, },
data() { data() {
return { return {
...@@ -50,7 +45,6 @@ export default { ...@@ -50,7 +45,6 @@ export default {
status: 1 status: 1
}, },
weeks: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'], weeks: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
defaultIndex: 13,
submitLoading: false submitLoading: false
} }
}, },
...@@ -62,7 +56,6 @@ export default { ...@@ -62,7 +56,6 @@ export default {
return return
} }
const weeks = data.week_json ? JSON.parse(data.week_json) : [] const weeks = data.week_json ? JSON.parse(data.week_json) : []
this.defaultIndex = this.timeColumns.findIndex(item => item === data.time)
this.ruleForm = Object.assign({}, this.ruleForm, data, { this.ruleForm = Object.assign({}, this.ruleForm, data, {
week_json: weeks week_json: weeks
}) })
...@@ -73,10 +66,6 @@ export default { ...@@ -73,10 +66,6 @@ export default {
title() { title() {
return this.isUpdate ? '修改提醒时间' : '新增提醒时间' return this.isUpdate ? '修改提醒时间' : '新增提醒时间'
}, },
// 时间选择项
timeColumns() {
return this.genTimeColumns()
},
// 重复类型 // 重复类型
selectedResultType() { selectedResultType() {
const weeks = this.ruleForm.week_json.sort() const weeks = this.ruleForm.week_json.sort()
...@@ -155,22 +144,9 @@ export default { ...@@ -155,22 +144,9 @@ export default {
}, },
filter(type, options) { filter(type, options) {
if (type === 'minute') { if (type === 'minute') {
return options.filter(option => option % 30 === 0) return options.filter(option => option % 5 === 0)
} }
return options return options
},
// 生成提醒时间数据
genTimeColumns() {
const columns = []
for (let i = 0; i <= 23; i++) {
const temp = i < 10 ? `0${i}` : i
columns.push(`${temp}:00`)
columns.push(`${temp}:30`)
}
return columns
},
onChangeTime(picker, value, index) {
this.ruleForm.time = value
} }
} }
} }
...@@ -193,6 +169,7 @@ export default { ...@@ -193,6 +169,7 @@ export default {
.alarm-form-time { .alarm-form-time {
position: relative; position: relative;
margin-bottom: 20px; margin-bottom: 20px;
padding: 0 60px;
} }
.alarm-form-time__lable { .alarm-form-time__lable {
position: absolute; position: absolute;
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
</template> </template>
<van-empty description="暂无内容" v-else /> <van-empty description="暂无内容" v-else />
<div class="add-button"> <div class="add-button">
<div class="inner" @click="popupVisible = true"></div> <div class="inner" @click="onAdd"></div>
</div> </div>
<!-- 添加/修改 --> <!-- 添加/修改 -->
<van-popup v-model="popupVisible" position="bottom" @closed="onClosed"> <van-popup v-model="popupVisible" position="bottom" @closed="onClosed">
...@@ -49,6 +49,7 @@ export default { ...@@ -49,6 +49,7 @@ export default {
popupVisible: false, popupVisible: false,
isUpdate: false, isUpdate: false,
activeItem: null, activeItem: null,
hasFollow: false,
followPopupVisible: false followPopupVisible: false
} }
}, },
...@@ -56,7 +57,8 @@ export default { ...@@ -56,7 +57,8 @@ export default {
// 检查是否关注公众号 // 检查是否关注公众号
checkFollowWechat() { checkFollowWechat() {
api.checkFollowWechat().then(response => { api.checkFollowWechat().then(response => {
this.followPopupVisible = !response.flag this.hasFollow = response.flag
this.followPopupVisible = !this.hasFollow
}) })
}, },
// 获取提醒列表 // 获取提醒列表
...@@ -85,6 +87,13 @@ export default { ...@@ -85,6 +87,13 @@ export default {
onClosed() { onClosed() {
this.isUpdate = false this.isUpdate = false
this.activeItem = null this.activeItem = null
},
onAdd() {
if (this.hasFollow) {
this.popupVisible = true
} else {
this.followPopupVisible = true
}
} }
}, },
beforeMount() { beforeMount() {
......
import Vue from 'vue'
import Router from 'vue-router' import Router from 'vue-router'
import routes from './routes' import routes from './routes'
Vue.use(Router)
export default new Router({ export default new Router({
routes, routes,
mode: 'history', // 还有一个 hash 默认 mode: 'history', // 还有一个 hash 默认
......
...@@ -79,22 +79,19 @@ export default [ ...@@ -79,22 +79,19 @@ export default [
{ {
path: '/course/learn/:id', path: '/course/learn/:id',
name: 'courseLearnItem', name: 'courseLearnItem',
component: () => import('../pages/course/learn/item.vue'), component: () => import('../pages/course/learn/item.vue')
meta: { requiredLogin: true }
}, },
// 课程学习详情 // 课程学习详情
{ {
path: '/course/learn/:id/tag', path: '/course/learn/:id/tag',
name: 'courseLearnTag', name: 'courseLearnTag',
component: () => import('../pages/course/tag/index.vue'), component: () => import('../pages/course/tag/index.vue')
meta: { requiredLogin: true }
}, },
// 课程知识点 // 课程知识点
{ {
path: '/course/learn/:courseId/tag/:chapterId', path: '/course/learn/:courseId/tag/:chapterId',
name: 'courseTag', name: 'courseTag',
component: () => import('../pages/course/tag/list.vue'), component: () => import('../pages/course/tag/list.vue')
meta: { requiredLogin: true }
}, },
// 课程知识点详情 // 课程知识点详情
{ {
...@@ -106,8 +103,7 @@ export default [ ...@@ -106,8 +103,7 @@ export default [
{ {
path: '/course/tag/:id', path: '/course/tag/:id',
name: 'courseTagItem', name: 'courseTagItem',
component: () => import('../pages/course/tag/item.vue'), component: () => import('../pages/course/tag/item.vue')
meta: { requiredLogin: true }
}, },
// 登录 // 登录
{ {
......
...@@ -2,15 +2,17 @@ import Vue from 'vue' ...@@ -2,15 +2,17 @@ import Vue from 'vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import { getUser, logout, getIsVip } from '@/api/account' import { getUser, logout, getIsVip, createGuestUser } from '@/api/account'
Vue.use(Vuex) Vue.use(Vuex)
export default new Vuex.Store({
const store = new Vuex.Store({
state: { state: {
user: {}, user: {},
token: '', token: '',
isVip: false, isVip: false,
isLogin: false, isLogin: false,
isWeapp: /miniProgram/.test(navigator.userAgent) isWeapp: /miniProgram/.test(navigator.userAgent),
guestUser: { user_id: '', student_id: '' }
}, },
mutations: { mutations: {
setToken(state, token) { setToken(state, token) {
...@@ -27,6 +29,10 @@ export default new Vuex.Store({ ...@@ -27,6 +29,10 @@ export default new Vuex.Store({
}, },
setIsVip(state, isVip) { setIsVip(state, isVip) {
state.isVip = isVip state.isVip = isVip
},
setGuestUser(state, user) {
state.guestUser = user
window.localStorage.setItem('guestUser', JSON.stringify(user))
} }
}, },
actions: { actions: {
...@@ -40,6 +46,15 @@ export default new Vuex.Store({ ...@@ -40,6 +46,15 @@ export default new Vuex.Store({
commit('setUser', response) commit('setUser', response)
}) })
}, },
// 退出登录
logout({ commit }) {
return logout().then(response => {
commit('setUser', {})
commit('setIsLogin', false)
return response
})
},
// 检测登录状态
async checkLogin({ commit }) { async checkLogin({ commit }) {
const isLogin = await getUser() const isLogin = await getUser()
.then(response => { .then(response => {
...@@ -55,22 +70,39 @@ export default new Vuex.Store({ ...@@ -55,22 +70,39 @@ export default new Vuex.Store({
commit('setIsLogin', isLogin) commit('setIsLogin', isLogin)
return isLogin return isLogin
}, },
logout({ commit }) { // 检测是否付费
return logout().then(response => {
commit('setUser', {})
commit('setIsLogin', false)
return response
})
},
async checkIsVip({ commit, state }) { async checkIsVip({ commit, state }) {
if (state.isVip) { if (!state.isVip) {
return state.isVip await getIsVip().then(response => commit('setIsVip', response.is_vip))
} }
const isVip = await getIsVip() return state.isVip
.then(response => response.is_vip) },
.catch(() => false) // 创建游客用户
commit('setIsVip', isVip) async createGuestUser({ commit, state }) {
return isVip const { user_id: userId, student_id: studentId } = state.guestUser
if (!userId || !studentId) {
await createGuestUser().then(response => commit('setGuestUser', response))
}
return state.guestUser
},
// 加载本地游客信息
loadGuestUser({ commit, state }) {
const localGuestUser = window.localStorage.getItem('guestUser')
let guestUser = { user_id: '', student_id: '' }
if (localGuestUser) {
try {
guestUser = JSON.parse(localGuestUser)
} catch (error) {
console.log(error)
}
}
commit('setGuestUser', guestUser)
} }
} }
}) })
export default store
// 获取环境
store.dispatch('getEnv')
store.dispatch('loadGuestUser')
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论