happymall后台管理项目的总结

7 篇文章 0 订阅
5 篇文章 0 订阅

配置跨域

在config文件中的index.js里面设置proxyTable

  在里面配置地址  有三个参数(target: 基础地址也就是地址的相同的域名,     changeOrigin为true: 允许转发, pathRewrite: 重写路径)
proxyTable: {  //跨域代理
  "/api":{ //地址
          target:"http://admintest.happymmall.com/manage", //基地址
          changeOrigin:true,//允许转发
          pathRewrite:{ //路径重写
                    "^/api":""
             }
        }
},

对axios进行封装

在src目录下创建 utils的文件夹,在utils文件夹里创建request.js文件 然后在里面引入axios 创建实例 const service 然后进行请求拦截 响应拦截 最后将这个实例request导出

import axios from 'axios'
// axios的二次封装
const service=axios.create({
    // baseURL:"/api",  如果配置了对象 这两个就不需要写
    // timeout:3000
})
// axios请求拦截
service.interceptors.request.use((config)=>{
    return config
})
// axios响应拦截
service.interceptors.response.use((config)=>{
    //可以写一些逻辑
    return config
})
let Request=(params)=>{
    return new Promise((resolve,reject)=>{
        service({
            ...params //es6对象的结构赋值
        }).then((res)=>{
            resolve(res)
        }).catch((err)=>{
            reject(err)
        })
    })
}

export {Request}

封装接口

统一的接口配置文件: 便于后期的修改、维护

// 登录接口;
//有数据的时候 传一个参数
export  const login =  (obj) => Request({
	url: "/api/user/login.do",
	method:"post",
	params:obj
})

// 主页数据
//没有时就不需要
export  const home =  () => Request({
	url: "/api/statistic/base_count.do",
	method:"get",
	
})

登陆页面

运用全局守卫的方式 在main.js里面
进行页面的登录鉴权使用 beforeEach的路由钩子 它有三个参数 分别是 to from next
to 是 要到哪里 from 是从哪里来 next 是 让它进入下一个
获取登录的权限信息 将它转化为字符串形式 然后进行判断
如果没有登录就跳转到登录页 登陆成功则进入首页
并设置登录过期的时间

main.js
// 用全局路由钩子 进行页面的登录鉴权
router.beforeEach((to, form, next) => {
  // 对权限的获取
  const role = localStorage.getItem("admin")
  // 字符串转对象
  const val = JSON.parse(role) //val是登录信息
  console.log(val);
  // 设置登陆过期
  if (val !== null) {
    const timeEnd = Date.now() - val.time;
    if (timeEnd > val.expire) {
      localStorage.removeItem("admin")
      next("/login")
      return null
    }
  }
  // 没有登陆跳转登陆页面
  if (!val && to.path !== "/login") {
    next('/login')
  }

  next()
})
login.vue
demo
<div class="login">
    <div class="lk">
      <p>欢迎登录-MMALL管理系统</p>
      <input
        type="email"
        class="form-control"
        id="exampleInputEmail1"
        placeholder="User Name"
        v-model="username"
      />
      <input
        type="password"
        class="form-control"
        id="exampleInputEmail2"
        placeholder="Password"
        v-model="password"
      />
      <button type="button" class="btn btn-primary btn-lg btn-block" @click="login()">
        登录
      </button>
    </div>
  </div>
script

首先需要引入 登录的接口

import { login } from "../request/http.js";
export default {
  name: "DsHelloWorld",

  data() {
    return {
      username: "admin",
      password: "admin",
      num: "",
    };
  },

  mounted() {},

  methods: {
    login() {
      if (this.username == "") {
        return alert("用户名不可以为空");
      }
      if (this.password == "") {
        return alert("密码不可以为空");
      }
      var form = { username: this.username, password: this.password };
      // console.log(qs.stringify(form));

      login(form)
        .then((res) => {
          console.log(res);
          this.num = res.data;
          this.loading();
        })
        .catch((err) => {
          return false;
        });
    },
    loading() {
      if (!this.num.status) {
        // 如果登录返回0,提示成功,
        this.$message({
          message: "恭喜你,登录成功",
          type: "success",
        });
        // 设置token过期时间, 本地存储过期时间
        const obj = {
          time: Date.now(),
          expire: 1000 * 60 * 1, //分钟
          data: this.username,
        };
        localStorage.setItem("admin", JSON.stringify(obj));
        // this.$router.push('/index')
        this.$router.push({
          path: "/index",
          params: { user: this.username },
        });
      } else {
        this.$message({
          message: this.num.msg,
          type: "warning",
        });
      }
    },
  },
};

首页布局

它分为左右两个部分 左边是 菜单栏 右边是 一个容器
菜单栏里面 分别是 首页 商品管理 品类管理 订单管理 用户列表 然后通过接口 对他们进行 请求数据

  • 首页部分
    有一个 点击进入相对应的数据 使用 this.$router.push(’要进入的页面地址‘)
  • 商品管理 它里面有 搜索功能 添加功能 查看信息 编辑信息 的功能
    搜索功能:它是可以根据 id 和 name 进行搜索 利用关键字来进行搜索
    先判断是id还是name 如果是id 就让她的type为productId,如果是name 就让她的 type为productName来进行搜索
    然后对请求的数据进行搜索 如果没有 id或者name 就让它获取全部的数据

代码如下

 search() {
      console.log(this.value);
      if (this.value) {
        if (this.value == "ID") {
          this.type = "productId";
        } else {
          this.type = "productName";
        }

        searchIDName({
          [this.type]: this.input,
          pageNum: this.obj.pageNum,
        }).then((res) => {
          console.log(res);
          this.tableData = res.data.data.list;
          this.total = res.data.data.total;
        });
      }else{
        shoplist({pageNum: this.obj.pageNum}).then(res=>{
          this.tableData = res.data.data.list;
          this.total = res.data.data.total;
        })
      }
    },

添加功能:点击按钮让它跳转到添加页面 在data里面设一个对象里面写要存放的内容 然后 将里面的内容添加到商品管理的数据中 然后返回商品管理数据

<script>
export default {
  data() {
    return {
       list: {
        categoryId: 1,
        name: "",
        subtitle: "",
        stock: "",
        imageHost: "",
        subImages: "",
        detail: "",
        price: "",
      }
    },
  },
  methods: {
         onSubmit() {
            console.log("submit!");
            updateProduct(this.list).then((res) => {
               console.log(res);
            this.$message({
                type: "success", // success error warning
                message: res.data.data,
            });
           this.$router.push("/shop");
       });
    },
 },
}
</script>

  • 上架下架
    利用过滤器的方法在filters里边定义两个函数,来操作上架下架的切换功能
 // 利用过滤器 三元表达式 将状态变为 文字
  filters: {
    types(val) {
      console.log(val);
      return val == 1 ? "在售" : "已下架";
    },
    types2(val) {
      return val == 2 ? "上架" : "下架";
    },
  },

然后在标签上绑定一个事件然后使用@click.prevent阻止默认事件

 // 上下架操作
    UnderComm(val) {
      this.$confirm("此操作将上架商品, 是否继续?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          updataStatus({ productId: val.id, status: val.status == 1 ? 2 : 1 }).then(
            (res) => {
              console.log(res.data);
              shoplist({ pageNum: this.obj.pageNum }).then((res) => {
                console.log(res);
                this.tableData = res.data.data.list;
                this.total = res.data.data.total;
              });
            }
          );
          this.$message({
            type: "success",
            message: res.data.data,
          });
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "已取消",
          });
        });
    },
  },
  • 富文本的使用
    下载这个插件 cnpm install vue-quill-editor -S
    在main.js中全局引入
// 富文本
import VueQuillEditor from 'vue-quill-editor'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'

然后在页面中使用

  <quill-editor
     v-model="form.detail"
     @change="editChange($event)"
     style="height: 100px;width: 500px;margin-top: 10px"
     >
 </quill-editor>

method:{
  editChange() {}
}
  • 上传图片 利用element Ui组件里面的 上传 然后 在页面上写上上传图片的插件 他有一个action 是图片上传的接口 它还有一个必填的属性 on-success 是上传成功后出发的,它里面还有三个属性 分别是 上传的图片的地址, 拿到图片地址后 , 通过添加或编辑的接口把地址传过去就可以实现上传图片了
<template>
  <div》
       <el-form-item label="商品图片">
          <el-upload
            class="upload-demo"
            action="/api/product/upload.do"
            name="upload_file"
            :on-preview="handlePreview"
            :on-remove="handleRemove"
            :on-success="success"
            list-type="picture"
          >
            <el-button size="small" type="primary">点击上传</el-button>
          </el-upload>
        </el-form-item>
  </div>
</template>
<script>
export default {
  data() {
    return {}
  },
  methods: {
        //这是上传图片的
    handlePreview(file) {
      console.log(file);
    },
    handleRemove(file, fileList) {
      console.log(file, fileList);
    },
    //上面两个在添加中用不到,只用这个上传成功的方法
    success(response) {
      console.log(response); //response  这个参数是方法自带的,不用传  代表的是添加的图片信息,是个对象
      this.list.mainImage = response.data.uri; //这个是获取那个图片的路径
      this.list.subImages = response.data.uri; //这个是获取那个图片的路径
    },
  },
}
</script>

查看信息:传此数据的ID 然后 进行 接收 再将接收的数据 赋给要使用的 地方 进行数据显示

编辑信息:传此数据的id 将数据回填 给确定按钮一个点击事件 让修改的数据 对 原数据 进行 赋值 然后将修改的数据 传递到商品管理中 然后返回商品管理数据

  • 品类管理
    添加商品: 在data里面写一个对象 存数据 然后获取 一级分类的接口 然后 进行添加 如果 没有输入名称 将提示 请输入商品名称 否则 添加成功 跳转到品类管理
<template>
  <div class="box">
    <p class="title">品类管理--添加品类</p>
    <el-form ref="form" :model="form" label-width="80px">
      <el-form-item label="所属分类">
        <el-select v-model="form.region" placeholder="请选择" @click="regionOne">
          <el-option
            v-for="(item,index) in oneList"
            :key="index"
            :label="item.name"
            :value="item.name"
          >
          </el-option>
        </el-select>
      </el-form-item>
  </div>
</template>
<script>
import { oneList, addpl } from "../../request/http.js";
export default {
  data() {
    return {
      form: {
        region: "",
        name: "",
      },
      oneList: [],
    };
  },
  mounted() {
    oneList().then((res) => {
      this.oneList = res.data.data;
    });
    this.getpl();
  },
  methods: {
    getpl() {
      oneList().then((res) => {
        console.log(res);
        this.oneList = res.data.data;
        // console.log(this.oneList);
      });
    },
    //获取一级分类
    regionOne(v) {
      console.log(v);
      this.oneList.map((item,i)=>{
        if(v == item.name){
          oneList({categoryId: item.id }).then((res=>{
            this.form = res.data.data
          }))
        }
      })
    },
    //添加商品
    onSubmit() {
      if (this.form.name == "") {
        alert("请输入商品名称");
      } else {
        alert("商品添加成功");
        addpl(this.form).then((res) => {
          this.$router.push("/fei");
        });
      }
    },
  },
};
</script>

编辑名称: 点击编辑 出现一个模态框 对数据进行修改

editPl(val) {
      console.log(val);
      this.dialogVisible = true;
      this.input = val.name;
    },
    enter() {
      editPl({ categoryId: this.id, categoryName: this.input }).then((res) => {
        console.log(res);
      });
      this.dialogVisible = false;
      alert("修改数据成功");
      this.$nextTick(function () {
        this.shuju();
      });
    },

查看子类名称 : 传categoryId 获取它的数据 就可进行查看 它里面有一个 修改的功能 与编辑名称的写法一样 然后进行提示

  • 订单管理
    搜索功能: 同样 利用 关键字进行搜索 使用搜索的接口的 传入它搜索的值 搜索成功 将获取到搜索内容
search() {
      searchOrder({
        listType: this.input,
        pageNum: this.obj.pageNum,
        orderNo: this.input,
      }).then((res) => {
        console.log(res);
        this.tableData = res.data.data.list;
        this.total = res.data.data.total;
      });
    },

查看信息: 传此数据的id 在另一个页面进行接收 然后赋给要使用的 地方 进行数据显示

 // 跳详情
    toOrderDetail(val) {
      console.log(val);
      this.$router.push({
        path: "/ordersee",
        query: {
          // url的参数, 类似get请求的传参
          orderNo: val.orderNo,
        },
      });
    },
  • 用户列表 里面没有什么 功能 就是对 用户列表 进行请求数据

以上是happymall后台管理项目的总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值