├── static ├── .gitkeep └── reset.css ├── src ├── store │ ├── getters.js │ ├── state.js │ ├── actions.js │ ├── mutations.js │ ├── mutations-types.js │ ├── index.js │ └── modules │ │ ├── prompt.js │ │ └── liveRoom.js ├── pages │ ├── goods │ │ ├── goodsDetails │ │ │ ├── private │ │ │ │ ├── README.md │ │ │ │ ├── shop.vue │ │ │ │ └── goodsSpec.vue │ │ │ └── goodsDetails.vue │ │ └── goodsList │ │ │ └── goodsList.vue │ ├── home │ │ ├── private │ │ │ ├── README.md │ │ │ ├── goodsClass.vue │ │ │ └── recommend.vue │ │ └── home.vue │ ├── notfind │ │ └── notfind.vue │ ├── liveRoom │ │ ├── private │ │ │ ├── myVideo.vue │ │ │ ├── roomBottom.vue │ │ │ ├── inputModel.vue │ │ │ ├── liveTop.vue │ │ │ ├── liveGoods.vue │ │ │ └── gift.vue │ │ └── liveRoom.vue │ ├── live │ │ ├── private │ │ │ └── liveClass.vue │ │ └── live.vue │ ├── shoppingCar │ │ ├── private │ │ │ ├── invalid.vue │ │ │ └── recommend.vue │ │ └── shoppingCar.vue │ ├── order │ │ ├── orderDetails │ │ │ ├── private │ │ │ │ └── orderState.vue │ │ │ └── orderDetails.vue │ │ ├── confirmOrder │ │ │ ├── private │ │ │ │ └── confirm_address.vue │ │ │ └── confirmOrder.vue │ │ ├── orderOperate │ │ │ └── orderOperate.vue │ │ └── orderList │ │ │ └── orderList.vue │ ├── author │ │ └── author.vue │ ├── me │ │ ├── me.vue │ │ └── private │ │ │ ├── meItem.vue │ │ │ └── orderTab.vue │ ├── shop │ │ └── shopDetails │ │ │ └── shopDetails.vue │ ├── myAddress │ │ └── myAddress.vue │ └── userDetails │ │ └── userDetails.vue ├── assets │ ├── icon │ │ ├── error.png │ │ ├── man@2x.png │ │ ├── loading.png │ │ ├── loginImg.jpg │ │ ├── wode1@2x.png │ │ ├── wode@2x.png │ │ ├── zhibo@2x.png │ │ ├── daohang@2x.png │ │ ├── fenlei@2x.png │ │ ├── fenxiang@2x.png │ │ ├── gouwuche@2x.png │ │ ├── jiangefu@2x.png │ │ ├── paizhao@2x.png │ │ ├── tongyi@2x.png │ │ ├── zhibo1@2x.png │ │ ├── zuanshi@2x.png │ │ ├── fanhui-bai@2x.png │ │ ├── fanhui-hei@2x.png │ │ ├── gouwuche1@2x.png │ │ ├── icon_woman@2x.png │ │ ├── shangcheng@2x.png │ │ ├── tongyi-hui@2x.png │ │ ├── wode_dizhi@2x.png │ │ ├── wode_xian@2x.png │ │ ├── Shopping-Cart@2x.png │ │ ├── arrow_yellow@2x.png │ │ ├── dianpu_shouqi@2x.png │ │ ├── dianpu_sousuo@2x.png │ │ ├── fasongxiaoxi@2x.png │ │ ├── gouwuche_kong@2x.png │ │ ├── shangcheng1@2x.png │ │ ├── wode_bangzhu@2x.png │ │ ├── wode_daifahuo@2x.png │ │ ├── wode_guanzhu@2x.png │ │ ├── wode_shezhi@2x.png │ │ ├── wode_shoucang@2x.png │ │ ├── wode_xiaoxi@2x.png │ │ ├── wode_zhanghao@2x.png │ │ ├── xiangzuo-hui@2x.png │ │ ├── zengsongliwu@2x.png │ │ ├── dianpu_gendui_1@2x.png │ │ ├── dianpu_zhankai@2x.png │ │ ├── kanzhibo_guanbi@2x.png │ │ ├── shangpinxq-gou@2x.png │ │ ├── shouhou-guanbi@2x.png │ │ ├── wode_daifukuan@2x.png │ │ ├── wode_daipingjia@2x.png │ │ ├── wode_daishouhuo@2x.png │ │ ├── wode_youhuiquan@2x.png │ │ ├── xiangqing_kefu@2x.png │ │ ├── wode_dizhi_bianji@2x.png │ │ ├── wode_dizhi_shanchu@2x.png │ │ ├── wode_guanyuwomen@2x.png │ │ ├── wode_tuikuanshou@2x.png │ │ ├── xiangqing_dianpu@2x.png │ │ ├── xinzendizhi-guanbi@2x.png │ │ ├── dianpu_gengduo_kefu@2x.png │ │ ├── dinapu_zhibo_zaixin@2x.png │ │ ├── fabupingjia_xing_hui@2x.png │ │ ├── kanzhibo_shangpingku@2x.png │ │ ├── querendingdan-dizhi@2x.png │ │ ├── wode_chengweimaijia@2x.png │ │ ├── Sales-volume_unselected@2x.png │ │ ├── To-examine_Success_red@2x.png │ │ ├── dianpu_gengduo_jianjie@2x.png │ │ ├── dianpu_gengduo_shouye@2x.png │ │ ├── dianpu_gengduo_xiaoxi@2x.png │ │ ├── dinapu_zhibo_zhuangtai@2x.png │ │ ├── fabupingjia_xing_cheng@2x.png │ │ ├── wode_dizhi_shezhimoren@2x.png │ │ ├── xiangqing_qrdd_caidai@2x.png │ │ ├── xiangqing_shoucang_hong@2x.png │ │ ├── xiangqing_shoucang_hui@2x.png │ │ ├── Sales-volume_High-to-low@2x.png │ │ ├── Sales-volume_Low-to-high@2x.png │ │ ├── dinapu_zhibo_zhuangtai_hui@2x.png │ │ ├── querendingdan-wudizhi-tianjia@2x.png │ │ └── direct-seeding_play_Button@2x@2x@2x.png │ ├── images │ │ └── wode_beijin@2x.png │ └── css │ │ └── main.css ├── tmp.vue ├── components │ ├── README.md │ ├── banner │ │ └── banner.vue │ ├── header │ │ └── header.vue │ ├── count │ │ └── count.vue │ ├── promptModel │ │ └── promptModel.vue │ ├── countDown │ │ └── countDown.vue │ ├── loading │ │ └── loading.vue │ ├── footer │ │ └── footer.vue │ ├── goodsItem │ │ └── goodsItem.vue │ ├── addAddress │ │ └── addAddress.vue │ └── loadMord │ │ └── loadMord.vue ├── App.vue ├── common │ ├── storage.js │ └── util.js ├── api │ ├── config.js │ ├── live.js │ └── api.js ├── main.js └── router │ └── index.js ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── mall ├── app │ ├── img │ │ ├── loginImg.5374531.jpg │ │ ├── gouwuche_kong@2x.baf12ca.png │ │ ├── wode_beijin@2x.c09ba58.png │ │ ├── Sales-volume_High-to-low@2x.1422501.png │ │ └── Sales-volume_Low-to-high@2x.abeaa0f.png │ ├── js │ │ └── manifest.3a0ae9bbcbc6ebd80ec9.js │ └── reset.css └── index.html ├── .editorconfig ├── .gitignore ├── .babelrc ├── .postcssrc.js ├── README.md ├── index.html └── package.json /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/store/getters.js: -------------------------------------------------------------------------------- 1 | export const loadingState = state => state.loadingState -------------------------------------------------------------------------------- /src/pages/goods/goodsDetails/private/README.md: -------------------------------------------------------------------------------- 1 | shop.vue (店铺信息组件) 2 | 3 | goodsSpec.vue (规格组件) -------------------------------------------------------------------------------- /src/pages/home/private/README.md: -------------------------------------------------------------------------------- 1 | goodsClass.vue (商城首页分类组件) 2 | 3 | recommend.vue (商城首页推荐信息组件) -------------------------------------------------------------------------------- /src/store/state.js: -------------------------------------------------------------------------------- 1 | const state = { 2 | loadingState: false 3 | } 4 | export default state -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /src/assets/icon/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/error.png -------------------------------------------------------------------------------- /src/assets/icon/man@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/man@2x.png -------------------------------------------------------------------------------- /src/assets/icon/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/loading.png -------------------------------------------------------------------------------- /src/assets/icon/loginImg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/loginImg.jpg -------------------------------------------------------------------------------- /src/assets/icon/wode1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode1@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode@2x.png -------------------------------------------------------------------------------- /src/assets/icon/zhibo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/zhibo@2x.png -------------------------------------------------------------------------------- /src/assets/icon/daohang@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/daohang@2x.png -------------------------------------------------------------------------------- /src/assets/icon/fenlei@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/fenlei@2x.png -------------------------------------------------------------------------------- /src/assets/icon/fenxiang@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/fenxiang@2x.png -------------------------------------------------------------------------------- /src/assets/icon/gouwuche@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/gouwuche@2x.png -------------------------------------------------------------------------------- /src/assets/icon/jiangefu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/jiangefu@2x.png -------------------------------------------------------------------------------- /src/assets/icon/paizhao@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/paizhao@2x.png -------------------------------------------------------------------------------- /src/assets/icon/tongyi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/tongyi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/zhibo1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/zhibo1@2x.png -------------------------------------------------------------------------------- /src/assets/icon/zuanshi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/zuanshi@2x.png -------------------------------------------------------------------------------- /mall/app/img/loginImg.5374531.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/mall/app/img/loginImg.5374531.jpg -------------------------------------------------------------------------------- /src/assets/icon/fanhui-bai@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/fanhui-bai@2x.png -------------------------------------------------------------------------------- /src/assets/icon/fanhui-hei@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/fanhui-hei@2x.png -------------------------------------------------------------------------------- /src/assets/icon/gouwuche1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/gouwuche1@2x.png -------------------------------------------------------------------------------- /src/assets/icon/icon_woman@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/icon_woman@2x.png -------------------------------------------------------------------------------- /src/assets/icon/shangcheng@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/shangcheng@2x.png -------------------------------------------------------------------------------- /src/assets/icon/tongyi-hui@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/tongyi-hui@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_dizhi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_dizhi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_xian@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_xian@2x.png -------------------------------------------------------------------------------- /src/assets/icon/Shopping-Cart@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/Shopping-Cart@2x.png -------------------------------------------------------------------------------- /src/assets/icon/arrow_yellow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/arrow_yellow@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dianpu_shouqi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dianpu_shouqi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dianpu_sousuo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dianpu_sousuo@2x.png -------------------------------------------------------------------------------- /src/assets/icon/fasongxiaoxi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/fasongxiaoxi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/gouwuche_kong@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/gouwuche_kong@2x.png -------------------------------------------------------------------------------- /src/assets/icon/shangcheng1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/shangcheng1@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_bangzhu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_bangzhu@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_daifahuo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_daifahuo@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_guanzhu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_guanzhu@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_shezhi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_shezhi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_shoucang@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_shoucang@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_xiaoxi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_xiaoxi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_zhanghao@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_zhanghao@2x.png -------------------------------------------------------------------------------- /src/assets/icon/xiangzuo-hui@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/xiangzuo-hui@2x.png -------------------------------------------------------------------------------- /src/assets/icon/zengsongliwu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/zengsongliwu@2x.png -------------------------------------------------------------------------------- /src/assets/images/wode_beijin@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/images/wode_beijin@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dianpu_gendui_1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dianpu_gendui_1@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dianpu_zhankai@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dianpu_zhankai@2x.png -------------------------------------------------------------------------------- /src/assets/icon/kanzhibo_guanbi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/kanzhibo_guanbi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/shangpinxq-gou@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/shangpinxq-gou@2x.png -------------------------------------------------------------------------------- /src/assets/icon/shouhou-guanbi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/shouhou-guanbi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_daifukuan@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_daifukuan@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_daipingjia@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_daipingjia@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_daishouhuo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_daishouhuo@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_youhuiquan@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_youhuiquan@2x.png -------------------------------------------------------------------------------- /src/assets/icon/xiangqing_kefu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/xiangqing_kefu@2x.png -------------------------------------------------------------------------------- /mall/app/img/gouwuche_kong@2x.baf12ca.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/mall/app/img/gouwuche_kong@2x.baf12ca.png -------------------------------------------------------------------------------- /mall/app/img/wode_beijin@2x.c09ba58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/mall/app/img/wode_beijin@2x.c09ba58.png -------------------------------------------------------------------------------- /src/assets/icon/wode_dizhi_bianji@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_dizhi_bianji@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_dizhi_shanchu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_dizhi_shanchu@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_guanyuwomen@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_guanyuwomen@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_tuikuanshou@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_tuikuanshou@2x.png -------------------------------------------------------------------------------- /src/assets/icon/xiangqing_dianpu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/xiangqing_dianpu@2x.png -------------------------------------------------------------------------------- /src/assets/icon/xinzendizhi-guanbi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/xinzendizhi-guanbi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dianpu_gengduo_kefu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dianpu_gengduo_kefu@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dinapu_zhibo_zaixin@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dinapu_zhibo_zaixin@2x.png -------------------------------------------------------------------------------- /src/assets/icon/fabupingjia_xing_hui@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/fabupingjia_xing_hui@2x.png -------------------------------------------------------------------------------- /src/assets/icon/kanzhibo_shangpingku@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/kanzhibo_shangpingku@2x.png -------------------------------------------------------------------------------- /src/assets/icon/querendingdan-dizhi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/querendingdan-dizhi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_chengweimaijia@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_chengweimaijia@2x.png -------------------------------------------------------------------------------- /src/assets/icon/Sales-volume_unselected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/Sales-volume_unselected@2x.png -------------------------------------------------------------------------------- /src/assets/icon/To-examine_Success_red@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/To-examine_Success_red@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dianpu_gengduo_jianjie@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dianpu_gengduo_jianjie@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dianpu_gengduo_shouye@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dianpu_gengduo_shouye@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dianpu_gengduo_xiaoxi@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dianpu_gengduo_xiaoxi@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dinapu_zhibo_zhuangtai@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dinapu_zhibo_zhuangtai@2x.png -------------------------------------------------------------------------------- /src/assets/icon/fabupingjia_xing_cheng@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/fabupingjia_xing_cheng@2x.png -------------------------------------------------------------------------------- /src/assets/icon/wode_dizhi_shezhimoren@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/wode_dizhi_shezhimoren@2x.png -------------------------------------------------------------------------------- /src/assets/icon/xiangqing_qrdd_caidai@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/xiangqing_qrdd_caidai@2x.png -------------------------------------------------------------------------------- /src/assets/icon/xiangqing_shoucang_hong@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/xiangqing_shoucang_hong@2x.png -------------------------------------------------------------------------------- /src/assets/icon/xiangqing_shoucang_hui@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/xiangqing_shoucang_hui@2x.png -------------------------------------------------------------------------------- /src/assets/icon/Sales-volume_High-to-low@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/Sales-volume_High-to-low@2x.png -------------------------------------------------------------------------------- /src/assets/icon/Sales-volume_Low-to-high@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/Sales-volume_Low-to-high@2x.png -------------------------------------------------------------------------------- /src/assets/icon/dinapu_zhibo_zhuangtai_hui@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/dinapu_zhibo_zhuangtai_hui@2x.png -------------------------------------------------------------------------------- /mall/app/img/Sales-volume_High-to-low@2x.1422501.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/mall/app/img/Sales-volume_High-to-low@2x.1422501.png -------------------------------------------------------------------------------- /mall/app/img/Sales-volume_Low-to-high@2x.abeaa0f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/mall/app/img/Sales-volume_Low-to-high@2x.abeaa0f.png -------------------------------------------------------------------------------- /src/assets/icon/querendingdan-wudizhi-tianjia@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/querendingdan-wudizhi-tianjia@2x.png -------------------------------------------------------------------------------- /src/assets/icon/direct-seeding_play_Button@2x@2x@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/songgl/vue-mall-live/HEAD/src/assets/icon/direct-seeding_play_Button@2x@2x@2x.png -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /src/store/actions.js: -------------------------------------------------------------------------------- 1 | import * as types from './mutations-types' 2 | 3 | // 设置loadingState 4 | export const setLoading = function ({commit,state}, loadingState) { 5 | commit(types.SET_LOADINGSTATE,loadingState) 6 | } 7 | 8 | -------------------------------------------------------------------------------- /src/tmp.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /src/store/mutations.js: -------------------------------------------------------------------------------- 1 | import * as types from './mutations-types' 2 | 3 | const mutations = { 4 | [types.SET_LOADINGSTATE](state,loadingState) { 5 | state.loadingState = loadingState 6 | } 7 | } 8 | 9 | export default mutations -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Editor directories and files 9 | .idea 10 | .vscode 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /src/components/README.md: -------------------------------------------------------------------------------- 1 | banner (轮播图组件) 2 | 3 | count (数量加减组件) 4 | 5 | footer (底部导航栏组件) 6 | 7 | goodsItem (商品列表组件) 8 | 9 | header (头部组件) 10 | 11 | loadMord (上拉加载,下拉刷新组件) 12 | 13 | promptModel (提示model) 14 | 15 | addAddress (新增地址) -------------------------------------------------------------------------------- /src/pages/notfind/notfind.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false 5 | }], 6 | "stage-2" 7 | ], 8 | "plugins": ["transform-runtime"], 9 | "env": { 10 | "test": { 11 | "presets": ["env", "stage-2"] } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "postcss-import": {}, 7 | "autoprefixer": {} 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vue-mall 2 | 3 | > A Vue.js project 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | 17 | # build for production and view the bundle analyzer report 18 | npm run build --report 19 | ``` 20 | 21 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 22 | -------------------------------------------------------------------------------- /src/store/mutations-types.js: -------------------------------------------------------------------------------- 1 | // loading 2 | export const SET_LOADINGSTATE = 'SET_LOADINGSTATE' 3 | 4 | /* 5 | * promptInfo 6 | */ 7 | export const SET_PROMPTDATA = 'SET_PROMPTDATA' 8 | 9 | export const SET_PROMPTSTATE = 'SET_PROMPTSTATE' 10 | 11 | /* 12 | * liveRoom 13 | */ 14 | export const SET_LIVEINFO = 'SET_LIVEINFO' 15 | 16 | export const SET_LIVEUSERINFO = 'SET_LIVEUSERINFO' 17 | 18 | export const SET_TOPGOODS = 'SET_TOPGOODS' 19 | 20 | export const SET_GIFTNUM = 'SET_GIFTNUM' 21 | 22 | export const SET_PEOPLENUM = 'SET_PEOPLENUM' 23 | 24 | export const SET_ISFOLLOW = 'SET_ISFOLLOW' -------------------------------------------------------------------------------- /src/pages/liveRoom/private/myVideo.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 25 | 26 | 29 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import state from './state' 4 | import * as actions from './actions' 5 | import * as getters from './getters' 6 | import mutations from './mutations' 7 | import prompt from './modules/prompt' 8 | import liveRoom from './modules/liveRoom' 9 | import createLogger from 'vuex/dist/logger' 10 | 11 | Vue.use(Vuex) 12 | 13 | const debug = process.env.NODE_ENV !== 'production' 14 | 15 | export default new Vuex.Store({ 16 | state, 17 | getters, 18 | mutations, 19 | actions, 20 | modules: { 21 | prompt, 22 | liveRoom 23 | }, 24 | strict: debug, 25 | plugins: debug ? [createLogger()] : [] 26 | }) -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 23 | 24 | 27 | -------------------------------------------------------------------------------- /src/store/modules/prompt.js: -------------------------------------------------------------------------------- 1 | import * as types from '../mutations-types' 2 | 3 | const state = { 4 | promptData:{}, 5 | promptState:false // 状态 6 | } 7 | 8 | const getters = { 9 | promptData : state => state.promptData, 10 | promptState : state => state.promptState, 11 | } 12 | 13 | const actions = { 14 | // 设置提示文本 15 | setPromptTxt ({commit}, obj) { 16 | commit(types.SET_PROMPTDATA,obj) 17 | }, 18 | // 设置提示model状态 19 | setPromptState ({commit}, state){ 20 | commit(types.SET_PROMPTSTATE, state) 21 | } 22 | } 23 | 24 | const mutations = { 25 | [types.SET_PROMPTDATA](state,promptData){ 26 | state.promptData = promptData 27 | }, 28 | 29 | [types.SET_PROMPTSTATE](state,promptState){ 30 | state.promptState = promptState 31 | } 32 | } 33 | 34 | export default { 35 | state, 36 | getters, 37 | actions, 38 | mutations 39 | } -------------------------------------------------------------------------------- /src/components/banner/banner.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 35 | 36 | 39 | -------------------------------------------------------------------------------- /src/components/header/header.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | 21 | 54 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | vue-mall 7 | 8 | 9 | 10 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/components/count/count.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 44 | 45 | 62 | -------------------------------------------------------------------------------- /src/pages/live/private/liveClass.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 40 | 41 | 64 | -------------------------------------------------------------------------------- /src/components/promptModel/promptModel.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 29 | 30 | 58 | -------------------------------------------------------------------------------- /src/pages/home/home.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 57 | -------------------------------------------------------------------------------- /src/pages/home/private/goodsClass.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 38 | 39 | 60 | -------------------------------------------------------------------------------- /mall/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | vue-mall 7 | 8 | 9 | 10 | 28 | 29 | 30 | 31 |
32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/common/storage.js: -------------------------------------------------------------------------------- 1 | /**************** 2 | * 封装sessionStorage 3 | * 封装localStorage 4 | ****************/ 5 | 6 | const ss = window.sessionStorage 7 | const ls = window.localStorage 8 | 9 | export default { 10 | /*------------- sessionStorage 操作 start -------------*/ 11 | // 获取 12 | s_getItem(key) { 13 | try { 14 | return JSON.parse(ss.getItem(key)) 15 | } catch (err) { 16 | return null 17 | } 18 | }, 19 | 20 | // 设置 21 | s_setItem(key, val) { 22 | ss.setItem(key, JSON.stringify(val)) 23 | }, 24 | 25 | // 清空所有 26 | s_clear() { 27 | ss.clear() 28 | }, 29 | 30 | s_keys() { 31 | return ss.keys() 32 | }, 33 | 34 | // 删除 35 | s_removeItem(key) { 36 | ss.removeItem(key) 37 | }, 38 | /*------------- sessionStorage 操作 start -------------*/ 39 | 40 | /*------------- localStorage 操作 start -------------*/ 41 | // 获取 42 | l_getItem(key) { 43 | try { 44 | return JSON.parse(ls.getItem(key)) 45 | } catch (err) { 46 | return null 47 | } 48 | }, 49 | 50 | // 设置 51 | l_setItem(key, val) { 52 | ls.setItem(key, JSON.stringify(val)) 53 | }, 54 | 55 | // 清空所有 56 | l_clear() { 57 | ls.clear() 58 | }, 59 | 60 | l_keys() { 61 | return ls.keys() 62 | }, 63 | 64 | // 删除 65 | l_removeItem(key) { 66 | ls.removeItem(key) 67 | } 68 | /*------------- localStorage 操作 end -------------*/ 69 | } -------------------------------------------------------------------------------- /mall/app/js/manifest.3a0ae9bbcbc6ebd80ec9.js: -------------------------------------------------------------------------------- 1 | !function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,a,c){for(var u,i,f,p=0,s=[];p 2 |
3 |
4 |
5 |
6 |
7 | 8 |
9 |
10 |
11 |
12 | 13 | 14 | 23 | 24 | 56 | -------------------------------------------------------------------------------- /src/pages/shoppingCar/private/invalid.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 59 | 60 | 63 | -------------------------------------------------------------------------------- /src/store/modules/liveRoom.js: -------------------------------------------------------------------------------- 1 | import * as types from '../mutations-types' 2 | 3 | const state = { 4 | liveInfo: {}, // 直播间信息 5 | liveUserInfo: [], // 直播间用户信息 6 | topGoods: {}, // 直播间商品列表 7 | giftNum: null, // 直播间礼物数量 8 | peopleNum: null, // 直播间人数 9 | isFollow: null // 关注状态 10 | } 11 | 12 | const getters = { 13 | liveInfo : state => state.liveInfo, 14 | liveUserInfo : state => state.liveUserInfo, 15 | topGoods : state => state.topGoods, 16 | giftNum : state => state.giftNum, 17 | peopleNum : state => state.peopleNum, 18 | isFollow : state => state.isFollow 19 | } 20 | 21 | const actions = { 22 | // 设置直播间信息 23 | setLiveInfo ({commit}, obj) { 24 | commit(types.SET_LIVEINFO,obj) 25 | }, 26 | // 设置直播间用户信息 27 | setLiveUserInfo ({commit}, arr) { 28 | commit(types.SET_LIVEUSERINFO, arr) 29 | }, 30 | // 设置直播间商品列表 31 | setTopGoods ({commit}, obj) { 32 | commit(types.SET_TOPGOODS, obj) 33 | }, 34 | // 设置礼物数量 35 | setGiftNum ({commit}, num){ 36 | commit(types.SET_GIFTNUM, num) 37 | }, 38 | // 设置直播间人数 39 | setPeopleNum ({commit}, num){ 40 | commit(types.SET_PEOPLENUM, num) 41 | }, 42 | // 设置关注状态 43 | setIsFollow ({commit}, type){ 44 | commit(types.SET_ISFOLLOW, type) 45 | } 46 | } 47 | 48 | const mutations = { 49 | [types.SET_LIVEINFO](state,liveInfo){ 50 | state.liveInfo = liveInfo 51 | }, 52 | 53 | [types.SET_LIVEUSERINFO](state,liveUserInfo){ 54 | state.liveUserInfo = liveUserInfo 55 | }, 56 | 57 | [types.SET_TOPGOODS](state,topGoods){ 58 | state.topGoods = topGoods 59 | }, 60 | 61 | [types.SET_GIFTNUM](state,giftNum){ 62 | state.giftNum = giftNum 63 | }, 64 | 65 | [types.SET_PEOPLENUM](state,peopleNum){ 66 | state.peopleNum = peopleNum 67 | }, 68 | 69 | [types.SET_ISFOLLOW](state, type){ 70 | state.isFollow = type 71 | } 72 | } 73 | 74 | export default { 75 | state, 76 | getters, 77 | actions, 78 | mutations 79 | } -------------------------------------------------------------------------------- /src/components/countDown/countDown.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/pages/goods/goodsDetails/private/shop.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 54 | -------------------------------------------------------------------------------- /src/pages/liveRoom/private/inputModel.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 54 | 55 | 93 | -------------------------------------------------------------------------------- /src/components/loading/loading.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 23 | 24 | 84 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-mall", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "build": "node build/build.js" 11 | }, 12 | "dependencies": { 13 | "axios": "^0.17.1", 14 | "vue": "^2.5.2", 15 | "vue-awesome-swiper": "^2.6.7", 16 | "vue-lazyload": "^1.1.4", 17 | "vue-router": "^3.0.1", 18 | "vuex": "^3.0.1", 19 | "vux": "^2.7.4" 20 | }, 21 | "devDependencies": { 22 | "autoprefixer": "^7.1.2", 23 | "babel-core": "^6.22.1", 24 | "babel-loader": "^7.1.1", 25 | "babel-plugin-transform-runtime": "^6.22.0", 26 | "babel-preset-env": "^1.3.2", 27 | "babel-preset-stage-2": "^6.22.0", 28 | "babel-register": "^6.22.0", 29 | "chalk": "^2.0.1", 30 | "copy-webpack-plugin": "^4.0.1", 31 | "css-loader": "^0.28.0", 32 | "eventsource-polyfill": "^0.9.6", 33 | "extract-text-webpack-plugin": "^3.0.0", 34 | "file-loader": "^1.1.4", 35 | "friendly-errors-webpack-plugin": "^1.6.1", 36 | "html-webpack-plugin": "^2.30.1", 37 | "less": "^2.7.3", 38 | "less-loader": "^4.0.5", 39 | "node-notifier": "^5.1.2", 40 | "optimize-css-assets-webpack-plugin": "^3.2.0", 41 | "ora": "^1.2.0", 42 | "portfinder": "^1.0.13", 43 | "postcss-import": "^11.0.0", 44 | "postcss-loader": "^2.0.8", 45 | "rimraf": "^2.6.0", 46 | "semver": "^5.3.0", 47 | "shelljs": "^0.7.6", 48 | "url-loader": "^0.5.8", 49 | "vue-loader": "^13.3.0", 50 | "vue-style-loader": "^3.0.1", 51 | "vue-template-compiler": "^2.5.2", 52 | "vux-loader": "^1.1.27", 53 | "webpack": "^3.6.0", 54 | "webpack-bundle-analyzer": "^2.9.0", 55 | "webpack-dev-server": "^2.9.1", 56 | "webpack-merge": "^4.1.0" 57 | }, 58 | "engines": { 59 | "node": ">= 4.0.0", 60 | "npm": ">= 3.0.0" 61 | }, 62 | "browserslist": [ 63 | "> 1%", 64 | "last 2 versions", 65 | "not ie <= 8" 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /src/pages/order/orderDetails/private/orderState.vue: -------------------------------------------------------------------------------- 1 | 43 | 44 | 73 | 74 | 77 | -------------------------------------------------------------------------------- /src/pages/shoppingCar/private/recommend.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 68 | 69 | 72 | -------------------------------------------------------------------------------- /src/pages/home/private/recommend.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 75 | -------------------------------------------------------------------------------- /src/components/footer/footer.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 61 | -------------------------------------------------------------------------------- /src/common/util.js: -------------------------------------------------------------------------------- 1 | /**************** 2 | * 封装vue全局操作方法 3 | ****************/ 4 | import store from '../store' 5 | 6 | export default{ 7 | install(Vue,options){ 8 | /*------------- cookie 操作 start -------------*/ 9 | //获取cookie 10 | Vue.prototype.getCookie = function (name) { 11 | let arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)"); 12 | if (arr = document.cookie.match(reg)) 13 | return (arr[2]); 14 | else 15 | return null; 16 | } 17 | 18 | //设置cookie 19 | Vue.prototype.setCookie = function (c_name, value, expiredays) { 20 | let exdate = new Date(); 21 | exdate.setDate(exdate.getDate() + expiredays); 22 | document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString()); 23 | } 24 | 25 | //删除cookie 26 | Vue.prototype.removeCookie = function (name) { 27 | let exp = new Date(); 28 | exp.setTime(exp.getTime() - 1); 29 | let cval = getCookie(name); 30 | if (cval != null) 31 | document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString(); 32 | } 33 | /*------------- cookie 操作 end -------------*/ 34 | 35 | /*------------- 提示操作 start -------------*/ 36 | Vue.prompt = function(obj){ 37 | store.dispatch('setPromptState', true) 38 | store.dispatch('setPromptTxt', obj) 39 | setTimeout(() => { 40 | store.dispatch('setPromptState', false) 41 | },1500); 42 | } 43 | Vue.prototype.promptFun = function(obj) { // obj(提示文本,类型等) 44 | store.dispatch('setPromptState', true) 45 | store.dispatch('setPromptTxt', obj) 46 | setTimeout(() => { 47 | store.dispatch('setPromptState', false) 48 | },1500); 49 | } 50 | // 提示后返回上一页 51 | Vue.prototype.promptBackFun = function(obj) { 52 | store.dispatch('setPromptState', true) 53 | store.dispatch('setPromptTxt', obj) 54 | setTimeout(() => { 55 | store.dispatch('setPromptState', false) 56 | history.back() 57 | },1500); 58 | } 59 | /*------------- 提示操作 end -------------*/ 60 | 61 | // loading 操作 62 | Vue.prototype.setLoading = function (state) { 63 | if(state){ 64 | store.dispatch('setLoading', state) 65 | }else{ 66 | setTimeout(function() { 67 | store.dispatch('setLoading', state) 68 | }, 800); 69 | } 70 | 71 | } 72 | 73 | //返回上一页 74 | Vue.prototype.backFun = function () { 75 | history.back() 76 | } 77 | 78 | //返回上上一页 79 | Vue.prototype.backTwoFun = function () { 80 | history.go(-2) 81 | } 82 | } 83 | } -------------------------------------------------------------------------------- /src/pages/author/author.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 64 | 65 | 86 | -------------------------------------------------------------------------------- /src/components/goodsItem/goodsItem.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 35 | 36 | 102 | -------------------------------------------------------------------------------- /src/api/config.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import axios from 'axios' 3 | import qs from 'qs' 4 | 5 | let url = location.href.split(".com")[0] + '.com/' 6 | // axios 配置 7 | axios.defaults.baseURL = 'http://dspx.tstmobile.com/' 8 | axios.defaults.withCredentials = false 9 | axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8' 10 | 11 | // 请求时的拦截 12 | axios.interceptors.request.use(function (config) { 13 | return config; 14 | }, function (error) { // 当请求异常时做一些处理 15 | Vue.prompt({ 16 | content: '错误的传参', 17 | type: 'error' 18 | }) 19 | return Promise.reject(error); 20 | }); 21 | 22 | // 响应时拦截 23 | axios.interceptors.response.use((res) => { 24 | if(res.data.status === 'pending') { 25 | Vue.loginInvalid() // 调用登录失效的方法 26 | } 27 | return res; 28 | },(err) => { // 当响应异常时做一些处理 29 | if (err && err.response) { 30 | switch (err.response.status) { 31 | case 400: 32 | err.message = '请求错误' 33 | break 34 | 35 | case 401: 36 | err.message = '未授权,请登录' 37 | break 38 | 39 | case 403: 40 | err.message = '拒绝访问' 41 | break 42 | 43 | case 404: 44 | err.message = `请求地址出错: ${err.response.config.url}` 45 | break 46 | 47 | case 408: 48 | err.message = '请求超时' 49 | break 50 | 51 | case 500: 52 | err.message = '服务器内部错误' 53 | break 54 | 55 | case 501: 56 | err.message = '服务未实现' 57 | break 58 | 59 | case 502: 60 | err.message = '网关错误' 61 | break 62 | 63 | case 503: 64 | err.message = '服务不可用' 65 | break 66 | 67 | case 504: 68 | err.message = '网关超时' 69 | break 70 | 71 | case 505: 72 | err.message = 'HTTP版本不受支持' 73 | break 74 | 75 | default: 76 | } 77 | } 78 | Vue.prompt({ 79 | content: err.message, 80 | type: 'error' 81 | }) 82 | return Promise.reject(err); 83 | }); 84 | 85 | // 封装post 86 | export function post(url, params) { 87 | return new Promise((resolve, reject) => { 88 | axios.post(url, qs.stringify(params)) // 将参数序列化 89 | .then(res => { 90 | resolve(res.data); 91 | }, err => { 92 | reject(err); 93 | }) 94 | .catch((error) => { 95 | reject(error) 96 | }) 97 | }) 98 | } 99 | 100 | // 封装get方法 101 | export function get(url){ 102 | return new Promise((resolve,reject) => { 103 | axios.get(url) 104 | .then(response => { 105 | resolve(response.data); 106 | }) 107 | .catch(err => { 108 | reject(err) 109 | }) 110 | }) 111 | } -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | import store from './store' 7 | import VueLazyload from 'vue-lazyload' 8 | import util from './common/util' 9 | import storage from './common/storage' 10 | 11 | import errorImg from './assets/icon/error.png' 12 | import loadingImg from './assets/icon/loading.png' 13 | 14 | Vue.config.productionTip = false 15 | 16 | // 公用操作方法插件 17 | Vue.use(util); 18 | 19 | // 图片懒加载 20 | Vue.use(VueLazyload, { 21 | error: errorImg, // 图片路径错误时加载图片 22 | loading: loadingImg // 预加载图片 23 | }) 24 | 25 | // 实现登录后跳转方法 26 | Vue.prototype.goBeforeLoginUrl = () => { 27 | let url = storage.s_getItem('beforeLoginUrl') 28 | if(!url || url.indexOf('/author') != -1){ 29 | router.push('/home') 30 | }else{ 31 | if(url == '/'){ 32 | url = '/home' 33 | } 34 | router.push(url) 35 | storage.s_setItem('beforeLoginUrl', '') 36 | } 37 | } 38 | 39 | // 登录失效方法 40 | Vue.loginInvalid = () => { 41 | storage.s_clear() // 清空所有sessionStorage 42 | storage.s_setItem('beforeLoginUrl',router.history.current.path) // 保存用户进入的url 43 | router.push('/author') 44 | return false 45 | } 46 | 47 | /* 48 | * 路由钩子函数 49 | * url进入网站都会先触发router.beforeEach钩子 50 | */ 51 | router.beforeEach((to, from, next) => { 52 | if(to.path == '/author' && storage.s_getItem('uid') && storage.s_getItem('token')){ 53 | // 用户使用后退返回到授权页,则默认回到首页 54 | next('/home') 55 | return false 56 | } 57 | /* 58 | * 判断sessionStorage里有没有用户信息 59 | * 并且是否是微信授权页 60 | */ 61 | if(!storage.s_getItem('uid') && !storage.s_getItem('token') && to.path !='/author'){ 62 | storage.s_setItem('beforeLoginUrl', to.fullPath) // 保存用户进入的url 63 | next('/author') // 进入到微信授权页 64 | return false 65 | }else { 66 | next() 67 | } 68 | }) 69 | 70 | // 判断数组中有没有某个属性 71 | Array.prototype.contains = function(obj) { 72 | console.log(this); 73 | for (var i = 0; i < this.length + 1; i++) { 74 | if (this[i] == obj) { 75 | return true; 76 | } 77 | } 78 | return false; 79 | } 80 | 81 | /** 82 | * 删除数组指定下标或指定对象 83 | **/ 84 | Array.prototype.remove=function(obj){ 85 | for(var i =0;i ', 106 | components: { App } 107 | }) 108 | -------------------------------------------------------------------------------- /src/pages/order/confirmOrder/private/confirm_address.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 82 | 83 | 99 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | import notFind from '@/pages/notfind/notfind' 5 | import Author from '@/pages/author/author' 6 | 7 | import Home from '@/pages/home/home' 8 | import Live from '@/pages/live/live' 9 | import ShoppingCar from '@/pages/shoppingCar/shoppingCar' 10 | import Me from '@/pages/me/me' 11 | 12 | import LiveRoom from '@/pages/liveRoom/liveRoom' 13 | 14 | import GoodsList from '@/pages/goods/goodsList/goodsList' 15 | import GoodsDetails from '@/pages/goods/goodsDetails/goodsDetails' 16 | import ShopDetails from '@/pages/shop/shopDetails/shopDetails' 17 | 18 | import ConfirmOrder from '@/pages/order/confirmOrder/confirmOrder' 19 | import OrderList from '@/pages/order/orderList/orderList' 20 | import OrderDetails from '@/pages/order/orderDetails/orderDetails' 21 | 22 | import UserDetails from '@/pages/userDetails/userDetails' 23 | import MyAddress from '@/pages/myAddress/myAddress' 24 | 25 | Vue.use(Router) 26 | 27 | export default new Router({ 28 | // mode: 'history', 29 | routes: [ 30 | { 31 | path: '*', 32 | meta: { 33 | title: '404', 34 | }, 35 | component: notFind 36 | },{ 37 | path: '/author', // 微信授权登录页 38 | name: 'author', 39 | component: Author 40 | },{ 41 | path: '/', 42 | redirect: "/home", // 重定向 43 | name: '/', 44 | component: Home 45 | },{ 46 | path: '/home', 47 | name: 'home', 48 | component: Home 49 | },{ 50 | path: '/live', // 直播首页 51 | name: 'live', 52 | component: Live 53 | },{ 54 | path: '/shoppingCar', // 购物车 55 | name: 'shoppingCar', 56 | component: ShoppingCar 57 | },{ 58 | path: '/me', // 个人中心 59 | name: 'me', 60 | component: Me 61 | },{ 62 | path: '/liveRoom', // 直播间 63 | name: 'liveRoom', 64 | component: LiveRoom 65 | },{ 66 | path: '/goodsList', // 商品列表 67 | name: 'goodsList', 68 | component: GoodsList 69 | },{ 70 | path: '/goodsDetails', // 商品详情 71 | name: 'goodsDetails', 72 | component: GoodsDetails 73 | },{ 74 | path: '/shopDetails', // 店铺详情 75 | name: 'shopDetails', 76 | component: ShopDetails 77 | },{ 78 | path: '/confirmOrder', // 确认订单 79 | name: 'confirmOrder', 80 | component: ConfirmOrder 81 | },{ 82 | path: '/orderList', // 订单列表 83 | name: 'orderList', 84 | component: OrderList 85 | },{ 86 | path: '/orderDetails', // 订单详情 87 | name: 'orderDetails', 88 | component: OrderDetails 89 | },{ 90 | path: '/userDetails', // 个人信息 91 | name: 'userDetails', 92 | component: UserDetails 93 | },{ 94 | path: '/myAddress', // 我的地址列表 95 | name: 'myAddress', 96 | component: MyAddress 97 | } 98 | ] 99 | }) 100 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.2.3 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: { 14 | // '/api': { 15 | // target: 'http://dspx.tstmobile.com', 16 | // changeOrigin: true, 17 | // } 18 | }, 19 | 20 | // Various Dev Server settings 21 | host: 'localhost', // can be overwritten by process.env.HOST 22 | port: 8080, // can be overwritten by process.env.HOST, if port is in use, a free one will be determined 23 | autoOpenBrowser: false, 24 | errorOverlay: true, 25 | notifyOnErrors: true, 26 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 27 | 28 | // Use Eslint Loader? 29 | // If true, your code will be linted during bundling and 30 | // linting errors and warnings will be shown in the console. 31 | useEslint: true, 32 | // If true, eslint errors and warnings will also be shown in the error overlay 33 | // in the browser. 34 | showEslintErrorsInOverlay: false, 35 | 36 | /** 37 | * Source Maps 38 | */ 39 | 40 | // https://webpack.js.org/configuration/devtool/#development 41 | devtool: 'eval-source-map', 42 | 43 | // If you have problems debugging vue-files in devtools, 44 | // set this to false - it *may* help 45 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 46 | cacheBusting: true, 47 | 48 | // CSS Sourcemaps off by default because relative paths are "buggy" 49 | // with this option, according to the CSS-Loader README 50 | // (https://github.com/webpack/css-loader#sourcemaps) 51 | // In our experience, they generally work as expected, 52 | // just be aware of this issue when enabling this option. 53 | cssSourceMap: false, 54 | }, 55 | 56 | build: { 57 | // Template for index.html 58 | index: path.resolve(__dirname, '../mall/index.html'), 59 | 60 | // Paths 61 | assetsRoot: path.resolve(__dirname, '../mall'), 62 | assetsSubDirectory: 'app', 63 | assetsPublicPath: './', 64 | 65 | /** 66 | * Source Maps 67 | */ 68 | 69 | productionSourceMap: true, 70 | // https://webpack.js.org/configuration/devtool/#production 71 | devtool: '#source-map', 72 | 73 | // Gzip off by default as many popular static hosts such as 74 | // Surge or Netlify already gzip all static assets for you. 75 | // Before setting to `true`, make sure to: 76 | // npm install --save-dev compression-webpack-plugin 77 | productionGzip: false, 78 | productionGzipExtensions: ['js', 'css'], 79 | 80 | // Run the build command with an extra argument to 81 | // View the bundle analyzer report after build finishes: 82 | // `npm run build --report` 83 | // Set to `true` or `false` to always turn it on or off 84 | bundleAnalyzerReport: process.env.npm_config_report 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/pages/liveRoom/private/liveTop.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 69 | 70 | 123 | -------------------------------------------------------------------------------- /src/api/live.js: -------------------------------------------------------------------------------- 1 | import { post, get } from './config' 2 | import storage from '../common/storage' 3 | 4 | export default { 5 | // 获取直播分类 6 | getLiveClass () { 7 | return get('api/live/live_class') 8 | }, 9 | 10 | // 获取直播列表 11 | getLiveList (type,p) { 12 | return post( 13 | 'api/live/anchor_list', 14 | { 15 | uid : storage.s_getItem("uid"), 16 | token : storage.s_getItem("token"), 17 | p, 18 | type 19 | } 20 | ) 21 | }, 22 | // 进入/退出直播间 23 | intoLiveRoom (live_id) { 24 | return post( 25 | 'api/live/into_live', 26 | { 27 | uid : storage.s_getItem("uid"), 28 | token : storage.s_getItem("token"), 29 | live_id 30 | } 31 | ) 32 | }, 33 | // 退出直播间 34 | outLiveRoom (live_id) { 35 | return post( 36 | 'api/live/into_live', 37 | { 38 | uid : storage.s_getItem("uid"), 39 | token : storage.s_getItem("token"), 40 | live_id 41 | } 42 | ) 43 | }, 44 | // 获取直播信息 45 | getLiveInfo (live_id) { 46 | return post( 47 | 'api/live/live_info', 48 | { 49 | live_id 50 | } 51 | ) 52 | }, 53 | // 获取主播信息 54 | getAnchorInfo (live_id,user_id){ 55 | return post( 56 | 'api/live/get_live_info', 57 | { 58 | uid : storage.s_getItem("uid"), 59 | token : storage.s_getItem("token"), 60 | live_id, 61 | user_id 62 | } 63 | ) 64 | }, 65 | // 直播间用户列表 66 | getRoomUser (live_id) { 67 | return post( 68 | 'api/live/show_viewer', 69 | { 70 | uid : storage.s_getItem("uid"), 71 | token : storage.s_getItem("token"), 72 | page: 1, 73 | pagesize: 5, 74 | live_id 75 | } 76 | ) 77 | }, 78 | // 关注与取消关注 79 | isFollow (user_id2,type) { 80 | return post( 81 | 'api/live/follow', 82 | { 83 | uid : storage.s_getItem("uid"), 84 | token : storage.s_getItem("token"), 85 | user_id2, 86 | type 87 | } 88 | ) 89 | }, 90 | // 获取直播商品列表 91 | getLiveGoods (live_id) { 92 | return post( 93 | 'api/merchant/live_goods', 94 | { 95 | uid : storage.s_getItem("uid"), 96 | token : storage.s_getItem("token"), 97 | live_id 98 | } 99 | ) 100 | }, 101 | // 用户的余额 102 | getUserMoney () { 103 | return post( 104 | 'api/live/get_money', 105 | { 106 | uid : storage.s_getItem("uid"), 107 | token : storage.s_getItem("token") 108 | } 109 | ) 110 | }, 111 | // 获取礼物列表 112 | getGift () { 113 | return post( 114 | 'api/live/gift_list', 115 | { 116 | uid : storage.s_getItem("uid"), 117 | token : storage.s_getItem("token") 118 | } 119 | ) 120 | }, 121 | // 主播收到的礼物数量 122 | getGiftCount (user_id) { 123 | return post( 124 | 'api/live/get_get_money', 125 | { 126 | uid : storage.s_getItem("uid"), 127 | token : storage.s_getItem("token"), 128 | user_id 129 | } 130 | ) 131 | }, 132 | // 送礼 133 | sendGift (data) { 134 | return post( 135 | 'api/live/give_gift', 136 | { 137 | uid : storage.s_getItem("uid"), 138 | token : storage.s_getItem("token"), 139 | ...data 140 | } 141 | ) 142 | } 143 | } -------------------------------------------------------------------------------- /src/pages/me/me.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 108 | -------------------------------------------------------------------------------- /mall/app/reset.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | /***************************************** 3 | * @Author: Song 4 | * @Date: 2017-04-11 5 | * @Last Modified by: Song 6 | * @Last Modified time: 2017-04-11 7 | ********************************************/ 8 | *{ 9 | -webkit-box-sizing: border-box; 10 | -moz-box-sizing: border-box; 11 | -ms-box-sizing: border-box; 12 | box-sizing: border-box; 13 | } 14 | 15 | html{ 16 | font-family: sans-serif; 17 | -webkit-text-size-adjust:100%; 18 | -ms-text-size-adjust:100% 19 | } 20 | 21 | html,body{ 22 | position: relative; 23 | width: 100%; 24 | height: 100%; 25 | } 26 | body{background:#eef3f5;} 27 | html,body,h1,h2,h3,h4,h5,h6,hr,p,iframe, 28 | dl,dt,dd,ul,ol,li,pre,form,button,input, 29 | textarea,th,td,fieldset{margin:0;padding:0} 30 | ul,ol,dl{list-style-type:none} 31 | 32 | address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:400} 33 | input,button,textarea,select,optgroup, 34 | option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit} 35 | input,button{overflow: visible;vertical-align:middle;outline:none} 36 | button,input{border:none;} 37 | body,th,td,button,input,select, 38 | textarea{color: #333;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing:grayscale} 39 | body{margin: auto;} 40 | th,td,button,input, 41 | select,textarea{font-family:"Microsoft Yahei","Hiragino Sans GB","Helvetica Neue",Helvetica,tahoma,arial,Verdana,sans-serif,"WenQuanYi Micro Hei","\5B8B\4F53";} 42 | div,p{word-wrap:break-word} 43 | a,area{outline:none;blr:expression(this.onFocus=this.blur())} 44 | a{text-decoration:none;cursor: pointer;color: #333} 45 | a:hover{text-decoration:underline;outline:none;} 46 | a:focus{outline:none} 47 | a:hover,a:active{outline:none;text-decoration: none;}:focus{outline:none} 48 | sub,sup{vertical-align:baseline} 49 | /*button,input[type="button"], input[type="submit"] {line-height:normal!important;}*/ 50 | input:focus{border: none;} 51 | img{border:0;width: 100%;height: 100%;} 52 | a img,img{-ms-interpolation-mode:bicubic} 53 | *html{overflow:-moz-scrollbars-vertical;zoom:expression(function(ele){ele.style.zoom = "1";document.execCommand("BackgroundImageCache",false,true)}(this))} 54 | /*HTML5 reset*/ 55 | header,footer,section,aside,details, 56 | menu,article,section,nav,address, 57 | hgroup,figure,figcaption,legend{display:block;margin:0;padding:0} 58 | time{display:inline} 59 | audio,canvas,video{display:inline-block;*display:inline;*zoom:1} 60 | audio:not([controls]){display:none} 61 | legend{width:100%;margin-bottom:20px;font-size:21px;line-height:40px;border:0;border-bottom:1px solid #e5e5e5} 62 | legend small{font-size:15px;color:#999} 63 | svg:not(:root){overflow: hidden} 64 | fieldset {border-width:0;padding: 0.35em 0.625em 0.75em;margin: 0 2px;border: 1px solid #c0c0c0} 65 | input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button {height: auto} 66 | input[type="search"] {-webkit-appearance: textfield; /* 1 */-moz-box-sizing: content-box;-webkit-box-sizing: content-box; /* 2 */box-sizing: content-box} 67 | input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration {-webkit-appearance: none} 68 | input::-ms-clear{display: none;} 69 | textarea{resize: none;} 70 | /*去掉苹果对textarea的默认样式*/ 71 | textarea ,input{/*-webkit-appearance: none;*/border-radius:0px;font-family:Microsoft YaHei} 72 | /*清除a,button,input手机端的点击效果*/ 73 | a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0);} 74 | /*将设备自动添加的播放按钮隐藏*/ 75 | video::-webkit-media-controls { 76 | display:none !important; 77 | } 78 | video{width: 100%;height: 100%;background:#000;} 79 | 80 | -------------------------------------------------------------------------------- /static/reset.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | /***************************************** 3 | * @Author: Song 4 | * @Date: 2017-04-11 5 | * @Last Modified by: Song 6 | * @Last Modified time: 2017-04-11 7 | ********************************************/ 8 | *{ 9 | -webkit-box-sizing: border-box; 10 | -moz-box-sizing: border-box; 11 | -ms-box-sizing: border-box; 12 | box-sizing: border-box; 13 | } 14 | 15 | html{ 16 | font-family: sans-serif; 17 | -webkit-text-size-adjust:100%; 18 | -ms-text-size-adjust:100% 19 | } 20 | 21 | html,body{ 22 | position: relative; 23 | width: 100%; 24 | height: 100%; 25 | } 26 | body{background:#eef3f5;} 27 | html,body,h1,h2,h3,h4,h5,h6,hr,p,iframe, 28 | dl,dt,dd,ul,ol,li,pre,form,button,input, 29 | textarea,th,td,fieldset{margin:0;padding:0} 30 | ul,ol,dl{list-style-type:none} 31 | 32 | address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:400} 33 | input,button,textarea,select,optgroup, 34 | option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit} 35 | input,button{overflow: visible;vertical-align:middle;outline:none} 36 | button,input{border:none;} 37 | body,th,td,button,input,select, 38 | textarea{color: #333;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing:grayscale} 39 | body{margin: auto;} 40 | th,td,button,input, 41 | select,textarea{font-family:"Microsoft Yahei","Hiragino Sans GB","Helvetica Neue",Helvetica,tahoma,arial,Verdana,sans-serif,"WenQuanYi Micro Hei","\5B8B\4F53";} 42 | div,p{word-wrap:break-word} 43 | a,area{outline:none;blr:expression(this.onFocus=this.blur())} 44 | a{text-decoration:none;cursor: pointer;color: #333} 45 | a:hover{text-decoration:underline;outline:none;} 46 | a:focus{outline:none} 47 | a:hover,a:active{outline:none;text-decoration: none;}:focus{outline:none} 48 | sub,sup{vertical-align:baseline} 49 | /*button,input[type="button"], input[type="submit"] {line-height:normal!important;}*/ 50 | input:focus{border: none;} 51 | img{border:0;width: 100%;height: 100%;} 52 | a img,img{-ms-interpolation-mode:bicubic} 53 | *html{overflow:-moz-scrollbars-vertical;zoom:expression(function(ele){ele.style.zoom = "1";document.execCommand("BackgroundImageCache",false,true)}(this))} 54 | /*HTML5 reset*/ 55 | header,footer,section,aside,details, 56 | menu,article,section,nav,address, 57 | hgroup,figure,figcaption,legend{display:block;margin:0;padding:0} 58 | time{display:inline} 59 | audio,canvas,video{display:inline-block;*display:inline;*zoom:1} 60 | audio:not([controls]){display:none} 61 | legend{width:100%;margin-bottom:20px;font-size:21px;line-height:40px;border:0;border-bottom:1px solid #e5e5e5} 62 | legend small{font-size:15px;color:#999} 63 | svg:not(:root){overflow: hidden} 64 | fieldset {border-width:0;padding: 0.35em 0.625em 0.75em;margin: 0 2px;border: 1px solid #c0c0c0} 65 | input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button {height: auto} 66 | input[type="search"] {-webkit-appearance: textfield; /* 1 */-moz-box-sizing: content-box;-webkit-box-sizing: content-box; /* 2 */box-sizing: content-box} 67 | input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration {-webkit-appearance: none} 68 | input::-ms-clear{display: none;} 69 | textarea{resize: none;} 70 | /*去掉苹果对textarea的默认样式*/ 71 | textarea ,input{/*-webkit-appearance: none;*/border-radius:0px;font-family:Microsoft YaHei} 72 | /*清除a,button,input手机端的点击效果*/ 73 | a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0);} 74 | /*将设备自动添加的播放按钮隐藏*/ 75 | video::-webkit-media-controls { 76 | display:none !important; 77 | } 78 | video{width: 100%;height: 100%;background:#000;} 79 | 80 | -------------------------------------------------------------------------------- /src/pages/shop/shopDetails/shopDetails.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 91 | 92 | 106 | -------------------------------------------------------------------------------- /src/pages/liveRoom/private/liveGoods.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 69 | 70 | 144 | -------------------------------------------------------------------------------- /src/pages/me/private/meItem.vue: -------------------------------------------------------------------------------- 1 | 59 | 60 | 103 | -------------------------------------------------------------------------------- /src/assets/css/main.css: -------------------------------------------------------------------------------- 1 | 2 | @charset "utf-8"; 3 | /***************************************** 4 | * @Author: StoryPeanut 5 | * @Date: 2017-11-08 6 | * @Last Modified by: StoryPeanut 7 | * @Last Modified time: 2017-11-08 8 | ********************************************/ 9 | body{font-size: 0.2rem;background:#eef3f5;} 10 | 11 | .pageBox { 12 | width: 100%; 13 | height: 100%; 14 | overflow: hidden; 15 | display: flex; 16 | flex-direction: column; 17 | position: relative; 18 | } 19 | .box_touch{ 20 | -webkit-overflow-scrolling: touch; 21 | z-index: 1; 22 | overflow: auto; 23 | overflow-x: hidden; 24 | flex: 1; 25 | position: relative; 26 | } 27 | 28 | .nav_act { border-bottom: 0.04rem solid red } 29 | 30 | /* 公用icon */ 31 | .left_white_icon { background: url(../icon/fanhui-bai@2x.png) no-repeat center; background-size: cover; } 32 | .left_icon { background: url(../icon/fanhui-hei@2x.png) no-repeat center; background-size: cover; } 33 | .right_icon { background: url(../icon/xiangzuo-hui@2x.png) no-repeat center;background-size: cover; } 34 | .msg_white_icon { background: url(../icon/wode_xiaoxi@2x.png) no-repeat center;background-size: cover; } 35 | .man_icon { background: url(../icon/man@2x.png) no-repeat center;background-size: cover; } 36 | .woman_icon { background: url(../icon/icon_woman@2x.png) no-repeat center;background-size: cover; } 37 | .check_icon{background:url(../icon/tongyi-hui@2x.png) no-repeat center;background-size: cover;} 38 | .check_act_icon{background:url(../icon/tongyi@2x.png) no-repeat center;background-size: cover;} 39 | .cart_white_icon { background: url(../icon/Shopping-Cart@2x.png) no-repeat center;background-size: cover; } 40 | .address_icon { background: url(../icon/querendingdan-dizhi@2x.png) no-repeat center;background-size: cover; } 41 | .colour_line_icon { background: url(../icon/xiangqing_qrdd_caidai@2x.png) no-repeat center;background-size: cover; } 42 | .search_white_icon {background: url(../icon/dianpu_sousuo@2x.png) no-repeat center;background-size: cover;} 43 | .play_icon { background: url(../icon/direct-seeding_play_Button@2x@2x@2x.png) no-repeat center;background-size: cover; } 44 | .diamonds_icon { background: url(../icon/zuanshi@2x.png) no-repeat center; background-size: cover; } 45 | 46 | /*商品详情*/ 47 | .ensure_icon { background: url(../icon/To-examine_Success_red@2x.png) no-repeat center;background-size: cover; } 48 | .close_red_icon { background: url(../icon/shouhou-guanbi@2x.png) no-repeat center; background-size: cover; } 49 | .close_gray_icon { background: url(../icon/xinzendizhi-guanbi@2x.png) no-repeat center;background-size: cover; } 50 | .specItem_act { color: #fff;background:red; } 51 | .kf_icon { background: url(../icon/xiangqing_kefu@2x.png) no-repeat center;background-size: cover; } 52 | .shop_icon { background: url(../icon/xiangqing_dianpu@2x.png) no-repeat center;background-size: cover; } 53 | .collection_icon { background: url(../icon/xiangqing_shoucang_hui@2x.png) no-repeat center;background-size: cover; } 54 | .collection_act_icon { background: url(../icon/xiangqing_shoucang_hong@2x.png) no-repeat center;background-size: cover; } 55 | 56 | /*物流*/ 57 | .logisticsLi{top:0;left: -0.46rem;} 58 | 59 | /* flex */ 60 | .box{ 61 | display: flex; 62 | } 63 | .box_start{ 64 | display: flex; 65 | justify-content: flex-start; 66 | align-items: center; 67 | } 68 | .box_center{ 69 | display: flex; 70 | justify-content: center; 71 | align-items: center; 72 | } 73 | .box_between{ 74 | display: flex; 75 | justify-content: space-between; 76 | align-items: center; 77 | } 78 | .box_arou{ 79 | display: flex; 80 | justify-content: space-around; 81 | align-items: center; 82 | } 83 | .box_end{ 84 | display: flex; 85 | justify-content: flex-end; 86 | align-items: center; 87 | } 88 | /*纵向布局*/ 89 | .box_direction{ 90 | display: flex; 91 | flex-direction: column; 92 | } 93 | .media{ 94 | display: flex; 95 | align-items: flex-start; 96 | } 97 | /*项目排不下会换行*/ 98 | .flex_wrap{ 99 | flex-wrap: wrap; 100 | } 101 | .grid_cell { 102 | flex: 1; 103 | } 104 | .grid_cell2{ 105 | flex: 2; 106 | } 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /src/pages/order/orderOperate/orderOperate.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 112 | 113 | 143 | -------------------------------------------------------------------------------- /src/pages/goods/goodsList/goodsList.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 108 | 109 | 142 | -------------------------------------------------------------------------------- /src/pages/liveRoom/private/gift.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 116 | 117 | 185 | -------------------------------------------------------------------------------- /src/pages/myAddress/myAddress.vue: -------------------------------------------------------------------------------- 1 | 43 | 44 | 112 | 113 | 163 | -------------------------------------------------------------------------------- /src/pages/order/orderDetails/orderDetails.vue: -------------------------------------------------------------------------------- 1 | 76 | 77 | 117 | 118 | 121 | -------------------------------------------------------------------------------- /src/pages/me/private/orderTab.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 77 | 78 | 171 | -------------------------------------------------------------------------------- /src/components/addAddress/addAddress.vue: -------------------------------------------------------------------------------- 1 | 43 | 44 | 137 | 138 | 175 | -------------------------------------------------------------------------------- /src/pages/order/orderList/orderList.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | 137 | -------------------------------------------------------------------------------- /src/pages/userDetails/userDetails.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 131 | 132 | 209 | -------------------------------------------------------------------------------- /src/pages/goods/goodsDetails/private/goodsSpec.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 155 | -------------------------------------------------------------------------------- /src/pages/liveRoom/liveRoom.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 168 | 169 | 224 | -------------------------------------------------------------------------------- /src/pages/order/confirmOrder/confirmOrder.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 186 | 187 | 190 | -------------------------------------------------------------------------------- /src/pages/goods/goodsDetails/goodsDetails.vue: -------------------------------------------------------------------------------- 1 | 91 | 92 | 181 | -------------------------------------------------------------------------------- /src/pages/live/live.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 144 | 145 | 223 | -------------------------------------------------------------------------------- /src/components/loadMord/loadMord.vue: -------------------------------------------------------------------------------- 1 | 25 | 182 | -------------------------------------------------------------------------------- /src/api/api.js: -------------------------------------------------------------------------------- 1 | import { post, get } from './config' 2 | import storage from '../common/storage' 3 | 4 | export default { 5 | // 获取用户信息 6 | getUserInfo (params) { 7 | return post('api/user/user_info', { 8 | uid: storage.s_getItem('uid'), 9 | token: storage.s_getItem('token') 10 | }) 11 | }, 12 | 13 | /* 14 | * 上传图片 15 | * 单张 16 | */ 17 | upImg (e) { 18 | var self = this 19 | let file = e.target.files[0] 20 | let param = new FormData() // 创建form对象 21 | param.append('file', file, file.name) // 通过append向form对象添加数据 22 | param.append('chunk', '0') // 添加form表单中其他数据 23 | // console.log(param.get('file')) // FormData私有类对象,访问不到,可以通过get判断值是否传进去 24 | return axios.post( 25 | 'api/login/upload', 26 | param, 27 | {headers: {'Content-Type': 'multipart/form-data'}} 28 | ).then((res) => { 29 | return Promise.resolve(res.data) 30 | }) 31 | }, 32 | 33 | // 获取banner图 34 | getBannerFun (type) { 35 | return post( 36 | 'api/index/banner_list', 37 | { 38 | type 39 | } 40 | ) 41 | }, 42 | /*--------------- home start --------------*/ 43 | // 获取商品分类 44 | getGoodsClassFun () { 45 | return get('api/Home/home_class') 46 | }, 47 | 48 | // 获取首页推荐信息 49 | getRecommendFun () { 50 | return get('api/Home/dress') 51 | }, 52 | /*--------------- home end --------------*/ 53 | 54 | 55 | /*--------------- goods start --------------*/ 56 | // 获取商品列表 57 | getGoodsListFun (data) { 58 | return post( 59 | 'api/Mall/searchGoods', 60 | data 61 | ) 62 | }, 63 | 64 | // 获取商品详情 65 | getGoodsDetailsFun (goods_id) { 66 | return post( 67 | 'api/Mall/goods_info', 68 | { 69 | uid: storage.s_getItem("uid"), 70 | token: storage.s_getItem("token"), 71 | goods_id 72 | } 73 | ) 74 | }, 75 | 76 | // 收藏or取消收藏 77 | collectionFun (goods_id) { 78 | return post( 79 | 'api/Mall/goods_collect', 80 | { 81 | uid: storage.s_getItem("uid"), 82 | token: storage.s_getItem("token"), 83 | goods_id 84 | } 85 | ) 86 | }, 87 | 88 | // 计算规格价格 89 | calculatedPrice (goods_id,specification_ids){ 90 | return post( 91 | 'api/Mall/get_specification', 92 | { 93 | goods_id, 94 | specification_ids: specification_ids.join(",") // 商品member_id 95 | } 96 | ) 97 | }, 98 | 99 | // 加入购物车 100 | addShoppingCarFun (data){ 101 | return post( 102 | 'api/Mall/insertShopCar', 103 | { 104 | uid: storage.s_getItem("uid"), 105 | token: storage.s_getItem("token"), 106 | ...data 107 | } 108 | ) 109 | }, 110 | /*--------------- goods end --------------*/ 111 | 112 | /*--------------- shop start --------------*/ 113 | // 获取店铺信息 114 | getShopDetailsFun (merchants_id) { 115 | return post( 116 | 'api/Mall/merchants_info', 117 | { 118 | uid: storage.s_getItem("uid"), 119 | token: storage.s_getItem("token"), 120 | merchants_id //商品member_id 121 | } 122 | ) 123 | }, 124 | /*--------------- shop end --------------*/ 125 | 126 | /*--------------- order start --------------*/ 127 | // 获取下单商品信息 128 | getGoodsInfo (obj,type){ // type=0(单件), type=1(购物车) 129 | let confirmApi = null, 130 | paramObj = { 131 | uid: storage.s_getItem("uid"), 132 | token: storage.s_getItem("token"), 133 | } 134 | if(type == 0){ 135 | confirmApi = 'api/Order/confirmGoodsInfo' 136 | paramObj.goods_id = obj.goods_id, 137 | paramObj.goods_num = obj.num, 138 | paramObj.specification_id = obj.specification_id 139 | }else { 140 | confirmApi = 'api/Order/confirmOrderInfo' 141 | paramObj.car_ids = obj 142 | } 143 | return post( 144 | confirmApi, 145 | paramObj 146 | ) 147 | }, 148 | // 下单 149 | preOrderFun (json,car_ids){ 150 | return post( 151 | 'api/Order/insertMallOrder', 152 | { 153 | uid: storage.s_getItem("uid"), 154 | token: storage.s_getItem("token"), 155 | json: JSON.stringify(json), 156 | car_ids: car_ids || '' 157 | } 158 | ) 159 | }, 160 | 161 | // 支付订单 162 | payOrderFun (order_no,type){ // type = 1 (下单支付) type = 2 (未支付订单支付) 163 | let api = '' 164 | type == 1 ? api = 'api/Pingxx/ping1' : api = 'api/Pingxx/ping2' 165 | return post( 166 | api, 167 | { 168 | uid: storage.s_getItem("uid"), 169 | token: storage.s_getItem("token"), 170 | order_no, //订单号 171 | type: 'wx_pub', //微信公众号支付 172 | openid: storage.l_getItem("openid") // 微信openid 173 | } 174 | ) 175 | }, 176 | 177 | // 获取订单列表 178 | getOrderListFun (order_state,p){ 179 | return post( 180 | 'api/Order/queryOrderByState', 181 | { 182 | uid: storage.s_getItem("uid"), 183 | token: storage.s_getItem("token"), 184 | p, 185 | order_state 186 | } 187 | ) 188 | }, 189 | // 获取订单详情 190 | getOrderDetailsFun (order_merchants_id){ 191 | return post( 192 | 'api/Order/queryOrderView', 193 | { 194 | uid: storage.s_getItem("uid"), 195 | token: storage.s_getItem("token"), 196 | order_merchants_id 197 | } 198 | ) 199 | }, 200 | // 取消订单/退款/催单/确认收货/删除订单 201 | orderOperate (order_merchants_id,type){ 202 | let api = null 203 | switch (type){ 204 | case 1: // 取消订单 205 | api = 'api/Order/cancelOrder' 206 | break; 207 | case 2: // 退款 208 | api = 'api/Order/return_order' 209 | break; 210 | case 3: // 催单 211 | api = 'api/Order/hurry_order' 212 | break; 213 | case 4: // 确认收货 214 | api = 'api/Order/receiveOrder' 215 | break; 216 | case 5: // 删除订单 217 | api = 'api/Order/delOrder' 218 | } 219 | return post( 220 | api, 221 | { 222 | uid: storage.s_getItem("uid"), 223 | token: storage.s_getItem("token"), 224 | order_merchants_id 225 | } 226 | ) 227 | }, 228 | /*--------------- order end --------------*/ 229 | 230 | /*--------------- shoppingCar satrt --------------*/ 231 | // 获取购物车商品列表 232 | getCarGoodsListFun () { 233 | return post( 234 | 'api/Mall/getShopCars', 235 | { 236 | uid: storage.s_getItem("uid"), 237 | token: storage.s_getItem("token") 238 | } 239 | ) 240 | }, 241 | // 获取推荐商品列表 242 | getMaybeEnjoyFun () { 243 | return post( 244 | 'api/Mall/maybeEnjoy', 245 | { 246 | uid: storage.s_getItem("uid"), 247 | token: storage.s_getItem("token"), 248 | pagesize: 6 249 | } 250 | ) 251 | }, 252 | // 清除无效商品 253 | delInvalidShopCar () { 254 | return post( 255 | 'api/Mall/delInvalidShopCar', 256 | { 257 | uid: storage.s_getItem("uid"), 258 | token: storage.s_getItem("token") 259 | } 260 | ) 261 | }, 262 | // 购物车加减 263 | carNumToggle (type,car_id) { 264 | let api = '' 265 | type == 1 ? (api = 'api/Mall/plusShopCar') : (api = 'api/Mall/minusShopCar') 266 | return post( 267 | api, 268 | { 269 | uid: storage.s_getItem("uid"), 270 | token: storage.s_getItem("token"), 271 | car_id 272 | } 273 | ) 274 | }, 275 | // 删除商品 276 | delCarGoodsFun (car_ids){ 277 | return post( 278 | 'api/Mall/delShopCar', 279 | { 280 | uid: storage.s_getItem("uid"), 281 | token: storage.s_getItem("token"), 282 | car_ids: car_ids.join(",") 283 | } 284 | ) 285 | }, 286 | /*--------------- shoppingCar end --------------*/ 287 | /*--------------- me start --------------*/ 288 | // 是否有未读消息 289 | hasMsgFun (){ 290 | return post( 291 | 'api/User/has_message', 292 | { 293 | uid: storage.s_getItem("uid"), 294 | token: storage.s_getItem("token") 295 | } 296 | ) 297 | }, 298 | // 修改个人信息 299 | editUserInfo (data) { 300 | return post( 301 | 'api/user/edit_user', 302 | { 303 | uid: storage.s_getItem("uid"), 304 | token: storage.s_getItem("token"), 305 | ...data 306 | } 307 | ) 308 | }, 309 | /*--------------- me end --------------*/ 310 | 311 | /*--------------- address start --------------*/ 312 | // 获取默认地址 313 | getDefaultAddressFun (){ 314 | return post( 315 | 'api/Address/queryDefaultAddress', 316 | { 317 | uid: storage.s_getItem("uid"), 318 | token: storage.s_getItem("token") 319 | } 320 | ) 321 | }, 322 | 323 | // 新增/编辑地址 324 | add_edit_addressFun (data){ 325 | let api = '' 326 | data.address_id ? api = 'api/Address/saveAddress' : api = 'api/Address/insertAddress' 327 | return post( 328 | api, 329 | { 330 | uid: storage.s_getItem("uid"), 331 | token: storage.s_getItem("token"), 332 | ...data 333 | } 334 | ) 335 | }, 336 | 337 | // 获取我的地址列表 338 | getMyAddress (){ 339 | return post( 340 | 'api/Address/queryAddressList', 341 | { 342 | uid: storage.s_getItem("uid"), 343 | token: storage.s_getItem("token") 344 | } 345 | ) 346 | }, 347 | // 设置默认/删除地址 348 | setAddress (address_id,type){ 349 | let api = '' 350 | type == 1 ? api = 'api/Address/saveDefaultAddress' : api = 'api/Address/delAddress' 351 | return post( 352 | api, 353 | { 354 | uid: storage.s_getItem("uid"), 355 | token: storage.s_getItem("token"), 356 | address_id 357 | } 358 | ) 359 | }, 360 | /*--------------- address end --------------*/ 361 | } 362 | 363 | 364 | 365 | -------------------------------------------------------------------------------- /src/pages/shoppingCar/shoppingCar.vue: -------------------------------------------------------------------------------- 1 | 69 | 70 | 328 | --------------------------------------------------------------------------------