Commit aec557e9 authored by Junling Bu's avatar Junling Bu
Browse files

chore[litemall-vue]: 参考litemall-admin结构,重新调整litemall-vue的src结构

parent 8d262f8b
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash';
export const dateFormat = (value, format = 'YYYY-MM-DD') => export const dateFormat = (value, format = 'YYYY-MM-DD') =>
value ? dayjs(value * 1000).format(format) : ''; value ? dayjs(value * 1000).format(format) : '';
export const yuan = value => export const yuan = value =>
isNumber(value) ? ${(value / 100).toFixed(2)}` : value; isNumber(value) ? ${(value / 100).toFixed(2)}` : value;
export default { export default {
install(Vue) { install(Vue) {
Vue.filter('yuan', yuan); Vue.filter('yuan', yuan);
Vue.filter('dateFormat', dateFormat); Vue.filter('dateFormat', dateFormat);
} }
}; };
import Vue from 'vue'; import Vue from 'vue';
import App from './App.vue'; import App from './App.vue';
import router from './vue/router'; import router from './router';
import store from './store'
import './assets/scss/global.scss'; import './assets/scss/global.scss';
import '@/assets/scss/iconfont/iconfont.css'; import '@/assets/scss/iconfont/iconfont.css';
import VeeValidate, { Validator } from 'vee-validate'; import VeeValidate, { Validator } from 'vee-validate';
import VueCountdown from '@/vue/plugins/vue-countdown'; import VueCountdown from '@/plugins/vue-countdown';
import zhCN from 'vee-validate/dist/locale/zh_CN'; import zhCN from 'vee-validate/dist/locale/zh_CN';
import axios from '@/vue/plugins/axios'; import axios from '@/plugins/axios';
import filters from '@/vue/filter'; import filters from '@/filter';
Vue.use(VueCountdown); Vue.use(VueCountdown);
Vue.use(axios); Vue.use(axios);
...@@ -41,5 +42,6 @@ Vue.config.productionTip = false; ...@@ -41,5 +42,6 @@ Vue.config.productionTip = false;
new Vue({ new Vue({
router, router,
store,
render: h => h(App) render: h => h(App)
}).$mount('#app'); }).$mount('#app');
export default { export default {
props: { props: {
goods: { goods: {
type: Object, type: Object,
default: () => ({}) default: () => ({})
} }
}, },
computed: { computed: {
goodsStatusToMe() { goodsStatusToMe() {
const is_buy = this.goods.is_buy; const is_buy = this.goods.is_buy;
const is_collect = this.goods.is_collect; const is_collect = this.goods.is_collect;
return is_buy ? '我购买过' : is_collect ? '我收藏过' : ''; return is_buy ? '我购买过' : is_collect ? '我收藏过' : '';
} }
}, },
methods: { methods: {
OnClick() { OnClick() {
this.$emit('click'); this.$emit('click');
} }
} }
}; };
export default { export default {
data() { data() {
return { return {
pages: { pages: {
perPage: 8, perPage: 8,
currPage: 1, currPage: 1,
pageCount: 1 pageCount: 1
}, },
loading: false, loading: false,
finished: false, finished: false,
isEmpty: false isEmpty: false
}; };
}, },
methods: { methods: {
async resetInit() { async resetInit() {
this.resetData(); this.resetData();
const page = await this.initData(); const page = await this.initData();
this.$nextTick(() => { this.$nextTick(() => {
this.setPages(page); this.setPages(page);
}); });
}, },
isFinished() { isFinished() {
this.finished = true; this.finished = true;
this.loading = false; this.loading = false;
}, },
async loadMore() { async loadMore() {
console.log('loadmore'); console.log('loadmore');
const { const {
pages: { pageCount, currPage } pages: { pageCount, currPage }
} = this; } = this;
const finish = pageCount < currPage; const finish = pageCount < currPage;
if (finish) { if (finish) {
this.isFinished(); this.isFinished();
} else { } else {
this.setPages(await this.initData(true)); this.setPages(await this.initData(true));
} }
this.loading = false; this.loading = false;
}, },
nextPage(pageCount = 1) { nextPage(pageCount = 1) {
this.pages.currPage += 1; this.pages.currPage += 1;
this.pages.pageCount = pageCount; this.pages.pageCount = pageCount;
this.loading = false; this.loading = false;
}, },
setPages(page = {}) { setPages(page = {}) {
this.isEmpty = page.totalCount === 0; this.isEmpty = page.totalCount === 0;
if (page.totalCount <= this.pages.perPage) { if (page.totalCount <= this.pages.perPage) {
// 不满一页 // 不满一页
this.isFinished(); this.isFinished();
} else { } else {
// 下一页 // 下一页
this.nextPage(page.pageCount); this.nextPage(page.pageCount);
} }
}, },
resetData() { resetData() {
this.pages = { this.pages = {
perPage: 8, perPage: 8,
currPage: 1, currPage: 1,
pageCount: 1 pageCount: 1
}; };
this.loading = true; this.loading = true;
this.finished = false; this.finished = false;
this.isEmpty = false; this.isEmpty = false;
} }
} }
}; };
import axios from 'axios'; import axios from 'axios';
import _ from 'lodash'; import _ from 'lodash';
import qs from 'qs'; import qs from 'qs';
import { Dialog, Toast } from 'vant'; import { Dialog, Toast } from 'vant';
import Vue from 'vue'; import Vue from 'vue';
Vue.use(Toast); Vue.use(Toast);
const instance = axios.create({ const instance = axios.create({
timeout: 5000, timeout: 5000,
baseURL: '' baseURL: ''
}); });
instance.interceptors.request.use( instance.interceptors.request.use(
config => { config => {
if (!config.headers['X-Litemall-Token']) { if (!config.headers['X-Litemall-Token']) {
config.headers['X-Litemall-Token'] = `${window.localStorage.getItem( config.headers['X-Litemall-Token'] = `${window.localStorage.getItem(
'Authorization' 'Authorization'
) || ''}`; ) || ''}`;
} }
return config; return config;
}, },
err => Promise.reject(err) err => Promise.reject(err)
); );
instance.interceptors.response.use( instance.interceptors.response.use(
res => { res => {
let litemall = _.has(res.data, 'errno') && res.data.errno !== 0; let litemall = _.has(res.data, 'errno') && res.data.errno !== 0;
let oldmall = _.has(res.data, 'success') && !res.data.success; let oldmall = _.has(res.data, 'success') && !res.data.success;
if (litemall || oldmall) { if (litemall || oldmall) {
switch (res.data.code || res.data.errno) { switch (res.data.code || res.data.errno) {
case 422: { case 422: {
const flag = Array.isArray(res.data.data) && res.data.data.length; const flag = Array.isArray(res.data.data) && res.data.data.length;
Dialog.alert({ Dialog.alert({
message: flag ? res.data.data[0].message : res.data.message message: flag ? res.data.data[0].message : res.data.message
}); });
break; break;
} }
case 401: case 401:
break; break;
case 404: case 404:
break; break;
case 740: { case 740: {
Toast.fail('优惠券已经领取过'); Toast.fail('优惠券已经领取过');
break; break;
} }
case 501: { case 501: {
Toast.fail('请登录'); Toast.fail('请登录');
setTimeout(() => { setTimeout(() => {
window.location = '#/login/' window.location = '#/login/'
}, 1500) }, 1500)
break; break;
} }
default: default:
Toast.fail(res.data.errmsg) Toast.fail(res.data.errmsg)
} }
return Promise.reject(res); return Promise.reject(res);
} }
return res; return res;
}, },
error => { error => {
Dialog.alert({ Dialog.alert({
title: '警告', title: '警告',
message: error.message message: error.message
}); });
return Promise.reject(error); return Promise.reject(error);
} }
); );
const post = (url, data, config = {}) => instance.post(url, data, config); const post = (url, data, config = {}) => instance.post(url, data, config);
const put = (url, data, config = {}) => instance.put(url, data, config); const put = (url, data, config = {}) => instance.put(url, data, config);
const get = (url, params, config = {}) => const get = (url, params, config = {}) =>
instance.get(url, { instance.get(url, {
params, params,
...config ...config
}); });
const deleteMethod = (url, config = {}) => const deleteMethod = (url, config = {}) =>
instance({ instance({
url, url,
method: 'delete', method: 'delete',
...config ...config
}); });
export default { export default {
install(Vue) { install(Vue) {
Vue.prototype.$reqGet = get; Vue.prototype.$reqGet = get;
Vue.prototype.$reqPost = post; Vue.prototype.$reqPost = post;
Vue.prototype.$reqPut = put; Vue.prototype.$reqPut = put;
Vue.prototype.$reqDel = deleteMethod; Vue.prototype.$reqDel = deleteMethod;
} }
}; };
import VueCountdown from '@xkeshi/vue-countdown'; import VueCountdown from '@xkeshi/vue-countdown';
export default { export default {
install(Vue) { install(Vue) {
Vue.component('countdown', VueCountdown); Vue.component('countdown', VueCountdown);
} }
}; };
const Tabbar = () => const Tabbar = () => import('@/components/Tabbar/');
import(/* webpackChunkName: "Tabbar" */ '@/vue/components/Tabbar/');
import asyncLoader from 'core/async-loader'; export default [
{
export default [ path: '/',
{ name: 'home',
path: '/', components: {
name: 'home', default: () => import('@/views/home/tabbar-home'),
components: { tabbar: Tabbar
default: asyncLoader('home/tabbar-home'), },
tabbar: Tabbar meta: {
}, keepAlive: true
meta: { }
keepAlive: true },
} {
}, path: '*',
{ redirect: {
path: '*', name: 'home'
redirect: { }
name: 'home' }
} ];
}
];
import Vue from 'vue'; import Vue from 'vue';
import Router from 'vue-router'; import Router from 'vue-router';
import { getLocalStorage } from '@/core/utils/local-storage'; import { getLocalStorage } from '@/utils/local-storage';
import home from './home'; import home from './home';
import items from './items'; import items from './items';
import user from './user'; import user from './user';
import order from './order'; import order from './order';
import login from './login'; import login from './login';
Vue.use(Router); Vue.use(Router);
const RouterModel = new Router({ const RouterModel = new Router({
routes: [...home, ...items, ...user, ...order, ...login] routes: [...home, ...items, ...user, ...order, ...login]
}); });
RouterModel.beforeEach((to, from, next) => { RouterModel.beforeEach((to, from, next) => {
const { Authorization, user_id } = getLocalStorage( const { Authorization, user_id } = getLocalStorage(
'Authorization', 'Authorization',
'user_id' 'user_id'
); );
if (!Authorization && !user_id) { if (!Authorization && !user_id) {
if (to.meta.login) { if (to.meta.login) {
next({ name: 'login', query: { redirect: to.name } }); next({ name: 'login', query: { redirect: to.name } });
return; return;
} }
} }
next(); next();
}); });
export default RouterModel; export default RouterModel;
import asyncLoader from 'core/async-loader'; const Tabbar = () =>
import(/* webpackChunkName: "Tabbar" */ '@/components/Tabbar/');
const Tabbar = () =>
import(/* webpackChunkName: "Tabbar" */ '@/vue/components/Tabbar/'); export default [
{
export default [ path: '/items',
{ name: 'class',
path: '/items', meta: {
name: 'class', keepAlive: true
meta: { },
keepAlive: true components: {
}, default: () => import('@/views/items/tabbar-class'),
components: { tabbar: Tabbar
default: asyncLoader('items/tabbar-class'), }
tabbar: Tabbar },
} {
}, path: '/items/search',
{ name: 'search',
path: '/items/search', meta: {
name: 'search', keepAlive: true
meta: { },
keepAlive: true component: () => import('@/views/items/search')
}, },
component: asyncLoader('items/search') {
}, path: '/items/search/result',
{ name: 'search-result',
path: '/items/search/result', meta: {
name: 'search-result', keepAlive: true
meta: { },
keepAlive: true component: () => import('@/views/items/search-result'),
}, props: route => route.query
component: asyncLoader('items/search-result'), },
props: route => route.query {
}, path: '/items/detail/:itemId',
{ name: 'detail',
path: '/items/detail/:itemId', props: true,
name: 'detail', component: () => import('@/views/items/detail')
props: true, },
component: asyncLoader('items/detail') {
}, path: '/items/list',
{ name: 'list',
path: '/items/list', component: () => import('@/views/items/list'),
name: 'list', props: route => ({
component: asyncLoader('items/list'), itemClass: +route.query.itemClass
props: route => ({ })
itemClass: +route.query.itemClass }
}) ];
}
];
import asyncLoader from 'core/async-loader'; export default [
const login = asyncLoader('login/login'); {
const registerGetCode = asyncLoader('login/register-getCode'); path: '/login',
const registerSubmit = asyncLoader('login/register-submit'); name: 'login',
const registerStatus = asyncLoader('login/register-status'); component: () => import('@/views/login/login')
const forget = asyncLoader('login/forget'); },
const forgetReset = asyncLoader('login/forget-reset'); {
const forgetStatus = asyncLoader('login/forget-status'); path: '/login/registerGetCode',
name: 'registerGetCode',
export default [ component: () => import('@/views/login/register-getCode')
{ },
path: '/login', {
name: 'login', path: '/login/registerSubmit',
component: login name: 'registerSubmit',
}, component: () => import('@/views/login/register-submit')
{ },
path: '/login/registerGetCode', {
name: 'registerGetCode', path: '/login/registerStatus/:status',
component: registerGetCode name: 'registerStatus',
}, props: true,
{ component: () => import('@/views/login/register-status')
path: '/login/registerSubmit', },
name: 'registerSubmit', {
component: registerSubmit path: '/login/forget',
}, name: 'forget',
{ component: () => import('@/views/login/forget')
path: '/login/registerStatus/:status', },
name: 'registerStatus', {
props: true, path: '/login/forget/reset',
component: registerStatus name: 'forgetReset',
}, component: () => import('@/views/login/forget-reset')
{ },
path: '/login/forget', {
name: 'forget', path: '/login/forget/reset/:status',
component: forget name: 'forgetStatus',
}, props: true,
{ component: () => import('@/views/login/forget-status')
path: '/login/forget/reset', }
name: 'forgetReset', ];
component: forgetReset
},
{
path: '/login/forget/reset/:status',
name: 'forgetStatus',
props: true,
component: forgetStatus
}
];
import asyncLoader from 'core/async-loader'; const Tabbar = () => import('@/components/Tabbar/');
const tab_cart = asyncLoader('order/tabbar-cart');
const PlaceOrderEntity = asyncLoader('order/place-order-entity'); export default [
const orderDetail = asyncLoader('order/orderDetail'); {
const PlaceOrderVirtual = asyncLoader('order/place-order-virtual'); path: '/order',
const Payment = asyncLoader('order/payment'); name: 'cart',
const PaymentStatus = asyncLoader('order/payment-status'); meta: {
login: true
const Tabbar = () => },
import(/* webpackChunkName: "Tabbar" */ '@/vue/components/Tabbar/'); components: {
default: () => import('@/views/order/tabbar-cart'),
export default [ tabbar: Tabbar
{ }
path: '/order', },
name: 'cart', {
meta: { path: '/order/placeOrderEntity',
login: true name: 'placeOrderEntity',
}, component: () => import('@/views/order/place-order-entity')
components: { default: tab_cart, tabbar: Tabbar } },
}, {
{ path: '/order/orderDetail',
path: '/order/placeOrderEntity', name: 'orderDetail',
name: 'placeOrderEntity', component: () => import('@/views/order/orderDetail')
component: PlaceOrderEntity },
}, {
{ path: '/order/placeOrderVirtual',
path: '/order/orderDetail', name: 'placeOrderVirtual',
name: 'orderDetail', component: () => import('@/views/order/place-order-virtual')
component: orderDetail },
}, {
{ path: '/order/payment',
path: '/order/placeOrderVirtual', name: 'payment',
name: 'placeOrderVirtual', component: () => import('@/views/order/payment')
component: PlaceOrderVirtual },
}, {
{ path: '/order/payment/:status',
path: '/order/payment', name: 'paymentStatus',
name: 'payment', component: () => import('@/views/order/payment-status'),
component: Payment props: true
}, }
{ ];
path: '/order/payment/:status',
name: 'paymentStatus',
component: PaymentStatus,
props: true
}
];
import asyncLoader from 'core/async-loader'; const tab_user = () => import('@/views/user/tabbar-user');
const UserCollect = () => import('@/views/user/module-collect');
const UserInvitation = () => import('@/views/user/module-invitation');
const UserAddress = () => import('@/views/user/module-address');
const UserAddressEdit = () => import('@/views/user/module-address-edit');
const UserServer = () => import('@/views/user/module-server');
const tab_user = asyncLoader('user/tabbar-user'); const UserInformation = () => import('@/views/user/user-information-set');
const UserCollect = asyncLoader('user/module-collect'); const UserInfo_SetBg = () => import('@/views/user/user-information-set/set-bg');
const UserInvitation = asyncLoader('user/module-invitation'); const UserInfo_SetMobile = () => import('@/views/user/user-information-set/set-mobile');
const UserAddress = asyncLoader('user/module-address'); const UserInfo_SetNickname = () => import('@/views/user/user-information-set/set-nickname');
const UserAddressEdit = asyncLoader('user/module-address-edit'); const UserInfo_SetPassword = () => import('@/views/user/user-information-set/set-password');
const UserServer = asyncLoader('user/module-server');
const UserInformation = asyncLoader('user/user-information-set'); const UserOrderEntityList = () => import('@/views/user/order-entity-list');
const UserInfo_SetBg = asyncLoader('user/user-information-set/set-bg'); const UserOrderEleList = () => import('@/views/user/order-ele-list');
const UserInfo_SetMobile = asyncLoader('user/user-information-set/set-mobile'); const UserRefundList = () => import('@/views/user/refund-list');
const UserInfo_SetNickname = asyncLoader(
'user/user-information-set/set-nickname'
);
const UserInfo_SetPassword = asyncLoader(
'user/user-information-set/set-password'
);
const UserOrderEntityList = asyncLoader('user/order-entity-list'); const Tabbar = () => import('@/components/Tabbar/');
const UserOrderEleList = asyncLoader('user/order-ele-list');
const UserRefundList = asyncLoader('user/refund-list');
const Tabbar = () =>
import(/* webpackChunkName: "Tabbar" */ '@/vue/components/Tabbar/');
export default [ export default [
{ {
......
const getters = {
sidebar: state => state.app.sidebar,
language: state => state.app.language,
size: state => state.app.size,
device: state => state.app.device,
token: state => state.user.token,
avatar: state => state.user.avatar,
name: state => state.user.name,
introduction: state => state.user.introduction,
status: state => state.user.status,
roles: state => state.user.roles,
perms: state => state.user.perms,
setting: state => state.user.setting
}
export default getters
import Vue from 'vue'
import Vuex from 'vuex'
import app from './modules/app'
import user from './modules/user'
import getters from './getters'
Vue.use(Vuex)
const store = new Vuex.Store({
modules: {
app,
user
},
getters
})
export default store
import Cookies from 'js-cookie'
const app = {
state: {
sidebar: {
opened: !+Cookies.get('sidebarStatus'),
withoutAnimation: false
},
device: 'desktop',
language: Cookies.get('language') || 'en',
size: Cookies.get('size') || 'medium'
},
mutations: {
TOGGLE_SIDEBAR: state => {
if (state.sidebar.opened) {
Cookies.set('sidebarStatus', 1)
} else {
Cookies.set('sidebarStatus', 0)
}
state.sidebar.opened = !state.sidebar.opened
state.sidebar.withoutAnimation = false
},
CLOSE_SIDEBAR: (state, withoutAnimation) => {
Cookies.set('sidebarStatus', 1)
state.sidebar.opened = false
state.sidebar.withoutAnimation = withoutAnimation
},
TOGGLE_DEVICE: (state, device) => {
state.device = device
},
SET_LANGUAGE: (state, language) => {
state.language = language
Cookies.set('language', language)
},
SET_SIZE: (state, size) => {
state.size = size
Cookies.set('size', size)
}
},
actions: {
toggleSideBar({ commit }) {
commit('TOGGLE_SIDEBAR')
},
closeSideBar({ commit }, { withoutAnimation }) {
commit('CLOSE_SIDEBAR', withoutAnimation)
},
toggleDevice({ commit }, device) {
commit('TOGGLE_DEVICE', device)
},
setLanguage({ commit }, language) {
commit('SET_LANGUAGE', language)
},
setSize({ commit }, size) {
commit('SET_SIZE', size)
}
}
}
export default app
import { loginByUsername, logout, getUserInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
const user = {
state: {
user: '',
status: '',
code: '',
token: getToken(),
name: '',
avatar: '',
introduction: '',
roles: [],
perms: [],
setting: {
articlePlatform: []
}
},
mutations: {
SET_CODE: (state, code) => {
state.code = code
},
SET_TOKEN: (state, token) => {
state.token = token
},
SET_INTRODUCTION: (state, introduction) => {
state.introduction = introduction
},
SET_SETTING: (state, setting) => {
state.setting = setting
},
SET_STATUS: (state, status) => {
state.status = status
},
SET_NAME: (state, name) => {
state.name = name
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
SET_ROLES: (state, roles) => {
state.roles = roles
},
SET_PERMS: (state, perms) => {
state.perms = perms
}
},
actions: {
// 用户名登录
LoginByUsername({ commit }, userInfo) {
const username = userInfo.username.trim()
return new Promise((resolve, reject) => {
loginByUsername(username, userInfo.password).then(response => {
const token = response.data.data
commit('SET_TOKEN', token)
setToken(token)
resolve()
}).catch(error => {
reject(error)
})
})
},
// 获取用户信息
GetUserInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getUserInfo(state.token).then(response => {
const data = response.data.data
if (data.perms && data.perms.length > 0) { // 验证返回的perms是否是一个非空数组
commit('SET_PERMS', data.perms)
} else {
reject('getInfo: perms must be a non-null array !')
}
commit('SET_ROLES', data.roles)
commit('SET_NAME', data.name)
commit('SET_AVATAR', data.avatar)
commit('SET_INTRODUCTION', data.introduction)
resolve(response)
}).catch(error => {
reject(error)
})
})
},
// 第三方验证登录
// LoginByThirdparty({ commit, state }, code) {
// return new Promise((resolve, reject) => {
// commit('SET_CODE', code)
// loginByThirdparty(state.status, state.email, state.code).then(response => {
// commit('SET_TOKEN', response.data.token)
// setToken(response.data.token)
// resolve()
// }).catch(error => {
// reject(error)
// })
// })
// },
// 登出
LogOut({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
commit('SET_PERMS', [])
removeToken()
resolve()
}).catch(error => {
reject(error)
})
})
},
// 前端 登出
FedLogOut({ commit }) {
return new Promise(resolve => {
commit('SET_TOKEN', '')
removeToken()
resolve()
})
},
// 动态修改权限
ChangeRoles({ commit, dispatch }, role) {
return new Promise(resolve => {
commit('SET_TOKEN', role)
setToken(role)
getUserInfo(role).then(response => {
const data = response.data
commit('SET_ROLES', data.roles)
commit('SET_PERMS', data.perms)
commit('SET_NAME', data.name)
commit('SET_AVATAR', data.avatar)
commit('SET_INTRODUCTION', data.introduction)
dispatch('GenerateRoutes', data) // 动态修改权限后 重绘侧边菜单
resolve()
})
})
}
}
}
export default user
import Cookies from 'js-cookie'
const TokenKey = 'X-Litemall-Admin-Token'
export function getToken() {
return Cookies.get(TokenKey)
}
export function setToken(token) {
return Cookies.set(TokenKey, token)
}
export function removeToken() {
return Cookies.remove(TokenKey)
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment