从零开始,搭建一个简单的购物平台十三前端商城部分

从零开始,搭建一个简单的购物平台(十二)前端商城部分
https://blog.csdn.net/time_____/article/details/108471436
项目源码(持续更新):https://gitee.com/DieHunter/myCode/tree/master/shopping

这篇文章我们来实现一下前端商城的工具类,其他配置和全局状态

工具类:

  • 工具类我们统一放在utils文件夹下,并部署在Vue原型上(与Axios的一样)
  • 首先我们要实现两个对象深复制的方法,之前博客也有介绍到,后续对全局静态变量做操作时,只能将其定义为只读,也就是不能改变他的值,所以深复制是很有必要的,对于简单的数据用json方式即可,遇上含有function,set,get等属性时需要用到递归版。
    JSON:
    export default class Clone {
      static shallowClone(org) {
        return JSON.parse(JSON.stringify(org));
      }
    }
    

    递归:

    export default class Clone {
      static deepClone(org,tag) {
        var tag = tag || {};
        var name = Object.getOwnPropertyNames(org);
        for (var i = 0; i < name.length; i++) {
          var desc = Object.getOwnPropertyDescriptor(org,name[i]);
          if (typeof desc.value === "object" && desc.value !== null) {
            var obj = desc.value.toString() === "[object Object]" ? {} : [];
            Object.defineProperty(tag,name[i],{
              configurable: desc.configurable,enumerable: desc.enumerable,writable: desc.writable,value: obj
            });
            Clone.deepClone(desc.value,obj);
          } else {
            Object.defineProperty(tag,desc);
          }
        }
        return tag;
      }
    }
    

     

  •  

    本地缓存的封装

     

    import Vue from "vue";
    class Storage {
      static saveStorage(key,val) {
        localStorage.setItem(key,JSON.stringify(val));
      }
      static getStorage(key) {
        try {
          return JSON.parse(localStorage.getItem(key)) || [];
        } catch (error) {}
      }
      static clearStorage(key) {
        try {
          localStorage.removeItem(key);
        } catch (error) {}
      }
    }
    Vue.prototype.$storage = Storage;

     

其他配置:

  • Events:对全局事件做一个封装,这里针对每一个组件和每一个自定义事件用了一个简单的工厂模式,降低代码的耦合性,解决事件封闭,但是缺点是在每一个组件销毁时需要作事件取消监听(销毁),否则会导致之前的监听事件执行两次,虽然每个子工厂生产出来的都是独特的产品,但是会导致性能降低,所以要做事件销毁处理
    import Vue from "vue";
    class Events extends Vue {//继承Vue的自定义事件,使其直接调用
      constructor() {
        super();
      }
      static getInstance() {//返回当前实例的单例
        if (!Events._instance) {
          Object.defineProperty(Events,"_instance",{
            value: new Events()
          });
        }
        return Events._instance;
      }
      onEvent(_event,_fn) {
        this.$on(_event,_fn);
      }
      onceEvent(_event,_fn) {
        this.$once(_event,_fn);
      }
      emitEvent(_event,_data) {
        this.$emit(_event,_data);
      }
      offEvent(_event,_fn) {
        this.$off(_event,_fn)
      }
    }
    Vue.prototype.$events = Events.getInstance()
    

     

  • 全国省市县的JSON文件
    https://gitee.com/DieHunter/myCode/blob/master/shopping/client/shopclient/src/config/city.js 

  • 静态Config文件

    export default class Config {
      static Agreement = "http://"; //协议
      static BaseUrl = "127.0.0.1"; //请求ip或域名
      static ServerUrl = ""; //多级路径名
      static ServerPort = ":1024"; //端口
      static Path = "/"; //静态文件目录
      static CryptoKey = "tokenkey"; //加密信息关键字
      static RequestPath =
        Config.Agreement + Config.BaseUrl + Config.ServerPort + Config.Path; //服务端静态目录
      static RequestTimeOut = 10 * 1000; //请求超时时间
      static GetCodeTime = 60 * 1000; //邮箱验证码重发时间
      static ShopMaxCount = [1,2,3,4,5,6,7,8,9]; //每件商品可购买数量(选择器配置)
      static ServerApi = {
        //接口名
        token: "user/checkToken",//验证token
        user: {
          userLogin: "user/userLogin",//用户登录
          getMailCode: "user/getMailCode",//获取验证码
          updateUser: "user/updateUser",//更新用户
          userReg: "user/userReg" //注册(移动端)
        },shop: {
          shopList: "shop/shopList" //获取商品列表
        },order: {
          orderList: "order/orderList",//获取订单列表
          addOrder: "order/addOrder",//新增订单
          delOrder: "order/delOrder",//删除订单
          updateOrder: "order/updateOrder" //更新订单状态
        }
      };
      static UploadName = {
        headPic: "upload/headPic" //图片路径
      };
      static UploadKey = {
        headKey: "headPic" //头像上传关键字
      };
      static StorageName = {
        //本地缓存
        Token: "token",ShopCar: "shopCar",//购物车列表
        UserInfo: "userInfo" //用户信息
      };
      static EventName = {
        //自定义事件
        SelectKind: "selectKind",//分类选择
        ChangeCount: "changeCount",//修改商品数量
        ShowPicker: "showPicker",//显示,隐藏Picker
        CountShop: "countShop",//购物车商品总价
        SelectAllChild: "selectAllChild",//全选子选项
        SelectParent: "selectParent",//全选父选项
        IsLogin: "isLogin",//登录成功
        UploadPic: "uploadPic" //上传图片
      };
      static DefaultPageConfig = {
        //默认分页配置
        shopType: "",picType: "",keyWord: "",page: 1,isactive: true,pageSize: "",totalPage: 1,orderId: "",sort: "1",orderState: ""
      };
    }
    

     

  • 邮箱类型选择配置 

    export default class Mail {
      static address = [
        "@qq.com","@gmail.com","@yahoo.com","@msn.com","@hotmail.com","@aol.com","@ask.com","@live.com","@0355.net","@163.com","@163.net","@263.net","@3721.net","@yeah.net","@googlemail.com","@mail.com"
      ];
    }
    

     

  • 商品类型

    export default class ShopType {
      //商品类型,图片类型,订单状态
      static shopType = [
        { name: "炒货",val: "0" },{ name: "果味",val: "1" },{ name: "蔬菜",val: "2" },{ name: "点心",val: "3" },{ name: "粗茶",val: "4" },{ name: "淡饭",val: "5" }
        // { name: "其他",val: "6" },];
      static picType = [
        { name: "单个商品",{ name: "轮播图",{ name: "分类",{ name: "主题",{ name: "其他",val: "4" }
      ];
      static orderState = [
        { name: "未付款",{ name: "已付款",{ name: "未发货",{ name: "已发货",{ name: "已完成",{ name: "已退款",val: "5" }
      ];
    }
    

     

全局Store

  • 全局store没有用Vuex,而是用本地缓存做了一个数据存储,在src下新建store文件夹,并新建store.js文件将所有的状态值汇总并暴露,这里我们简单搭建一下购物车,在shopCar中新建数据model层state和命令控制controller层action

  • store.js
    import Vue from 'vue'
    import ShopCar from "./shopCar/action"
    Vue.prototype.$store = {
      ShopCar
    }
    
     
  • state.js
    import Vue from "vue"
    import Config from "../../config/config"
    export default class State extends Vue {
      constructor() {
        super()
      }
      set shopCar(val) {//写数据
        this.$storage.saveStorage(Config.StorageName.ShopCar,val)
      }
      get shopCar() {//读数据
        return this.$storage.getStorage(Config.StorageName.ShopCar) || []
      }
    }
    

     

  •  action.js

    import State from "./state"
    import Vue from "vue"
    import Config from "../../config/config"
    const {
      EventName
    } = Config;
    export default class Action extends Vue {
      constructor() {
        super()
        this._state = new State()
      }
      set state(val) {
        this._state.shopCar = val
      }
      get state() {
        return this._state.shopCar
      }
      countShopItem() {//修改商品数量
        
      }
      delShopItem() {//删除商品
        
      }
      selAllChild() {//全选
        
      }
      filterSelect() {//刷新商品列表
        
      }
      delSelShop() {//删除选择商品
        
      }
    }
    

     

引入所有包

import Vue from 'vue'
import App from './App'
import router from './router'
import "./style/main.less"
import 'mint-ui/lib/style.css'
import MintUI from 'mint-ui'
import './utils/axios'
import './utils/cryptoTool'
import './utils/storage'
import "./event/event"
import "./store/store"
Vue.use(MintUI);
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',router,components: {
    App
  },template: '<App/>'
})

到此为止,前端商城准备工作全部完成,下一篇文章正式开始进入开发

原文地址:https://blog.csdn.net/time_____

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于nodejs...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs怎么实现目录不存在自动创建”文章能帮助大...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs如何实现定时删除文件”文章能帮助大家解决疑惑...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
本篇内容主要讲解“怎么安装Node.js的旧版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎...
这篇“node中的Express框架怎么安装使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要介绍“nodejs如何实现搜索引擎”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现搜索引擎...
这篇文章主要介绍“nodejs中间层如何设置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs中间层如何设置”文...
这篇文章主要介绍“nodejs多线程怎么实现”,在日常操作中,相信很多人在nodejs多线程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
这篇文章主要讲解了“nodejs怎么分布式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs怎么分布式”...
本篇内容介绍了“nodejs字符串怎么转换为数组”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
这篇文章主要介绍了nodejs如何运行在php服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs如何运行在php服务器文章都...
本篇内容主要讲解“nodejs单线程如何处理事件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“nodejs单线程如何...
这篇文章主要介绍“nodejs怎么安装ws模块”,在日常操作中,相信很多人在nodejs怎么安装ws模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
本篇内容介绍了“怎么打包nodejs代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!
本文小编为大家详细介绍“nodejs接收到的汉字乱码怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs接收到的汉字乱码怎么解决”文章能帮助大家解...
这篇“nodejs怎么同步删除文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇...
今天小编给大家分享一下nodejs怎么设置淘宝镜像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希