vue heima電商項目實戰

前期環境:
1.vscode

點擊詳情
2.vue ui
這裏
3.elm組件
just so so

  • login
<template>
  <div class="login_container">
    <div class="login_box">
      <!-- 頭像區域 -->
      <div class="avatar_box">
        <img src="../assets/logo.png" alt />
      </div>
      <!-- 登錄表單區域 -->
      <el-form  ref="loginFromRef"  :model="loginFrom" :rules="loginFromRules" label-width="0px" class="login_form">
        <!-- 用戶名 -->
        <el-form-item prop="username">
          <el-input v-model="loginFrom.username" prefix-icon="iconfont icon-denglu"></el-input>
        </el-form-item>
        <!-- 密碼 -->
        <el-form-item prop="password">
          <el-input v-model="loginFrom.password" prefix-icon="iconfont icon-mima" type="password"></el-input>
        </el-form-item>
        <!-- 按鈕 -->
        <el-form-item class="btns">
          <el-button type="primary" @click="login">登錄</el-button>
          <el-button type="info" @click="resetloginFrom">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      // 這是登錄表單的數據綁定對象
      loginFrom: {
        username: '',
        password: ''
      },
      // 這是表單的驗證規則對象
      loginFromRules: {
        // 驗證用戶名是否合法
        username: [
          { required: true, message: '請輸入登錄名稱', trigger: 'blur' },
          { min: 3, max: 5, message: '長度在 3 到 5 個字符', trigger: 'blur' }
        ],
        // 驗證密碼是否合法
        password: [
          { required: true, message: '請輸入密碼', trigger: 'blur' },
          { min: 6, max: 15, message: '長度在 6 到 15 個字符', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    resetloginFrom () {
      // console.log(this)
      this.$refs.loginFromRef.resetFields()
    },
    login () {
      this.$message.success('登錄成功')
      // this.$refs.loginFromRef.validate(async valid => {
      //   if (!valid) return
      //   const { data: res } = await this.$http.post('login', this.loginFrom)
      //   if (res.meta.status !== 200) return console.log('登錄失敗')
      //   console.log('登錄成功')
      //  })
      // }
      // window.sessionStorage.setItem("token",res.data.token);    保存token
      this.$router.push('/home')
    }
  }
}
</script>

<style lang="less" scoped>
.login_container {
  background-color: #2b4b6b;
  height: 100%;
}

.login_box {
  width: 450px;
  height: 300px;
  background-color: #fff;
  border-radius: 3px;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);

  .avatar_box {
    height: 130px;
    width: 130px;
    border: 1px solid #eee;
    border-radius: 50%;
    padding: 10px;
    box-shadow: 0 0 10px #ddd;
    position: absolute;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: #fff;
    img {
      width: 100%;
      height: 100%;
      border-radius: 50%;
      background-color: #eee;
    }
  }
  .login_form {
    position: absolute;
    bottom: 0;
    width: 100%;
    padding: 0 20px;
    box-sizing: border-box;
  }

  .btns {
    display: flex;
    justify-content: flex-end;
  }
}
</style>

  • home
/* eslint-disable vue/valid-v-for */
<template>

<el-container class="home-container">
    <!-- 頭部區域 -->
  <el-header>
      <div>
          <img src="../assets/icon_tips.png" alt="">
          <span>電商後臺管理系統</span>
      </div>
  </el-header>
  <!-- 頁面主體區域 -->
  <el-container>
      <!-- 側邊欄 -->
    <el-aside :width="isCollapse ? '64px' : '200px'">
        <div class="toggle-button" @click="toggleCollapse">|||</div>
        <!-- 側邊欄菜單區 -->
         <el-menu background-color="#333744" text-color="#fff"
         active-text-color="#409EFF" :unique-opened="true" :collapse="isCollapse"
         :collapse-transition="false" :router="true" :default-active="1-4-1">
      <!-- 一級菜單 -->
      <el-submenu index="1">
          <!-- 一級的菜單模版區域 -->
        <template slot="title">
            <!--圖標 -->
          <i class="el-icon-user-solid"></i>
          <!-- 文本 -->
          <span>用戶管理</span>
        </template>
        <!-- 二級菜單 -->
        <el-menu-item index="1-4-1" @click="saveNavstate(1-4-1)">
        <template slot="title">
            <!--圖標 -->
          <i class="el-icon-menu"></i>
          <!-- 文本 -->
          <span>用戶列表</span>
        </template></el-menu-item>
      </el-submenu>
       <el-submenu index="2">
        <template slot="title">
          <i class="el-icon-s-opportunity"></i>
          <span>權限管理</span>
        </template>
        <el-menu-item index="2-4-1">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span>角色列表</span>
        </template></el-menu-item>
          <el-menu-item index="2-4-2">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span>權限列表</span>
        </template></el-menu-item>
      </el-submenu>
       <el-submenu index="3">
        <template slot="title">
          <i class="el-icon-s-goods"></i>
          <span>商品管理</span>
        </template>
        <el-menu-item index="3-4-1">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span>商品列表</span>
        </template></el-menu-item>
          <el-menu-item index="3-4-2">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span>分類參數</span>
        </template></el-menu-item>
         <el-menu-item index="3-4-3">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span>商品分類</span>
        </template></el-menu-item>
      </el-submenu>
      <el-submenu index="4">
        <template slot="title">
          <i class="el-icon-s-shop"></i>
          <span>訂單管理</span>
        </template>
        <el-menu-item index="4-4-1">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span>訂單列表</span>
        </template></el-menu-item>
          <el-menu-item index="4-4-2">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span>訂單分類</span>
        </template></el-menu-item>
      </el-submenu>
      <el-submenu index="5">
        <template slot="title">
          <i class="el-icon-share"></i>
          <span>數據統計</span>
        </template>
        <el-menu-item index="5-4-1">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span>統計概況</span>
        </template></el-menu-item>
          <el-menu-item index="5-4-2">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span>數據梳理</span>
        </template></el-menu-item>
      </el-submenu>
    </el-menu>
    </el-aside>
    <!-- 右冊內容主題 -->
    <el-main>
        <!-- 路由佔位符 -->
        <router-view></router-view>
    </el-main>
  </el-container>
</el-container>

</template>

<script>
export default {
  data () {
    return {
    // 是否摺疊
      isCollapse: false,
      // 被激活的鏈接地止
      activePath: ''
    }
  },
  created () {
    this.activePath = window.sessionStorage.getItem('activePash')
  },
  methods: {
    // 點擊按鈕,切換菜單的摺疊與展開
    toggleCollapse () {
      this.isCollapse = !this.isCollapse
    },
    // 保存鏈接的激活狀態
    saveNavstate (activePath) {
      window.sessionStorage.setItem('activePash', activePath)
      this.activePath = activePath
    }
  }
}
</script>

<style lang="less" scoped>
.home-container{
    height: 100%;
}

.el-header {
    background-color: #373D41;
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: #fff;
    font-size: 20px;
    > div {
        display: flex;
        align-items: center;
        span{
            margin-left: 15px;
        }
    }

    img {
      width: 50px;
      height: 50px;
      border-radius: 50%;
      background-color: #eee;
    }
}

.el-aside{
    background-color: #333744;
    .el-menu {
        border-right: none;
    }
}

.el-main{
    background-color: #EAEDF1;
    }

.toggle-button{
    background-color: #4A5064;
    font-size: 10px;
    line-height: 24px;
    color: #fff;
    text-align: center;
    letter-spacing: 0.2em;
    cursor: pointer;
}
</style>

  • user
<template>
  <div>
    <!-- 麪包屑導航區域 -->
    <el-breadcrumb separator-class="el-icon-arrow-right">
      <el-breadcrumb-item :to="{ path: '/home' }">首頁</el-breadcrumb-item>
      <el-breadcrumb-item>用戶管理</el-breadcrumb-item>
      <el-breadcrumb-item>用戶列表</el-breadcrumb-item>
    </el-breadcrumb>
    <!-- 卡片試圖 -->
    <el-card class="box-card">
      <!-- 搜索 -->
      <el-row :gutter="20">
        <el-col :span="8">
          <!-- 搜索與添加區域 -->
          <el-input placeholder="請輸入內容" v-model="input1" clearable>
            <el-button slot="append" icon="el-icon-search" @click="tableData"></el-button>
          </el-input>
        </el-col>
        <el-col :span="4">
          <el-button type="primary" @click="addDialogVisible = true">添加用戶</el-button>
        </el-col>
      </el-row>
      <!-- 用戶列表區域 -->
      <el-table :data="tableData" style="width: 100%" border stripe>
        <el-table-column type="index" label="#"></el-table-column>
        <el-table-column prop="name" label="姓名"></el-table-column>
        <el-table-column prop="address" label="郵箱"></el-table-column>
        <el-table-column prop="phonenum" label="電話"></el-table-column>
        <el-table-column prop="rolename" label="角色"></el-table-column>
        <el-table-column prop="state" label="狀態">
          <template slot-scope="scope">
            <el-switch v-model="scope.row.state" @change="userStateChange(scope.row)"></el-switch>
          </template>
        </el-table-column>
        <el-table-column label="操作" width="180px">
          <template slot-scope>
            <!-- 修改按鈕 -->
            <el-button type="primary" icon="el-icon-edit" size="mini"></el-button>
            <!-- 刪除按鈕 -->
            <el-button type="danger" icon="el-icon-delete" size="mini"></el-button>
            <!-- 分配角色按鈕 -->
            <el-tooltip effect="dark" content="分配角色" placement="top" :enterable="false">
              <el-button type="warning" icon="el-icon-setting" size="mini"></el-button>
            </el-tooltip>
          </template>
        </el-table-column>
      </el-table>
      <!-- 分頁區域 -->
      <el-pagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="currentPage4"
        :page-sizes="[1, 2, 5, 10]"
        :page-size="2"
        layout="total, sizes, prev, pager, next, jumper"
        :total="2"
      ></el-pagination>
    </el-card>

    <!-- 添加用戶對話框 -->
    <el-dialog title="添加用戶" :visible.sync="addDialogVisible" width="50%" @close="addDialogClosed">
      <!-- 內容主體區域 -->
      <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
        <el-form-item label="用戶名" prop="name">
        <el-input v-model="ruleForm.name"></el-input>
        </el-form-item>
        <el-form-item label="密碼" prop="password">
        <el-input v-model="ruleForm.password"></el-input>
        </el-form-item>
        <el-form-item label="郵箱" prop="email">
        <el-input v-model="ruleForm.email"></el-input>
        </el-form-item>
        <el-form-item label="手機" prop="mobile">
        <el-input v-model="ruleForm.mobile"></el-input>
        </el-form-item>
      </el-form>
      <!-- 底部區域 -->
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDialogVisible = false">取 消</el-button>
        <el-button type="primary"  @click="addUser">確 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data () {
    // 驗證郵箱規則
    var checkEmail = (rule, value, cb) => {
      // 驗證郵箱的正則表達式
      const regEmail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/

      if (regEmail.test(value)) {
        // 合法郵箱
        return cb()
      }
      cb(new Error('請輸入合法的郵箱'))
    }

    // 驗證手機號規則
    var checkMobile = (rule, value, cb) => {
      // 驗證手機號的正則表達式
      const regMobile = /^(0|86|17951)?(13[0-9]|15[0123456789]|17[678]|18[0-9]|14[57])[0-9]{8}$/
      if (regMobile.test(value)) {
        return cb()
      }
      cb(new Error('請輸入合法的手機號'))
    }

    return {
      tableData: [
        {
          name: 'admin',
          address: '[email protected]',
          phonenum: 14253627654,
          rolename: '超級管理員',
          state: true
        },
        {
          name: '王一博',
          address: '[email protected]',
          phonenum: 15243627654,
          rolename: '測試角色2',
          state: false
        }
      ],
      currentPage1: 5,
      currentPage2: 5,
      currentPage3: 5,
      currentPage4: 4,
      input1: '',
      // 控制添加用戶對話框的顯示與隱藏
      addDialogVisible: false,
      ruleForm: {
        name: '',
        password: '',
        email: '',
        mobile: ''
      },
      rules: {
        name: [
          { required: true, message: '請輸入用戶名', trigger: 'blur' },
          { min: 3, max: 5, message: '長度在 3 到 5 個字符', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '請輸入密碼', trigger: 'blur' },
          { min: 6, max: 15, message: '長度在 6到 15 個字符', trigger: 'blur' }
        ],
        email: [
          { required: true, message: '請輸入郵箱', trigger: 'blur' },
          { validator: checkEmail, trigger: 'blur' }
        ],
        mobile: [
          { required: true, message: '請輸入手機', trigger: 'blur' },
          { validator: checkMobile, trigger: 'blur' }
        ]
      }
    }
  },
  created () {},
  methods: {
    // 監聽pagesize改變事件
    handleSizeChange (val) {
      console.log(`每頁 ${val} 條`)
    },
    // 監聽頁碼值
    handleCurrentChange (val) {
      console.log(`當前頁: ${val}`)
    },
    userStateChange (userinfo) {
      console.log(userinfo)
    },
    submitForm (formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          alert('submit!')
        } else {
          console.log('error submit!!')
          return false
        }
      })
    },
    resetForm (formName) {
      this.$refs[formName].resetFields()
    },
    // 監聽添加用戶對話框的關閉事件
    addDialogClosed () {
      this.$refs.ruleForm.resetFields()
    },
    // 點擊按鈕,添加新用戶
    addUser () {
    // 預校驗
      this.$refs.ruleForm.validate(valid => {
        if (!valid) return
        // 可以發起添加用戶的網絡請求
        this.$message.success('添加用戶即將成功!請耐心等待審覈')
        // 隱藏用戶對話框
        this.addDialogVisible = false
      })
    }
  }
}
</script>

<style lang="less" scoped>
</style>

相關接口調用
在這裏插入圖片描述

在這裏插入圖片描述

  • 需要導入的組件
import Vue from 'vue'
import {
  Button,
  Form,
  FormItem,
  Input,
  Message,
  Container,
  Header,
  Aside,
  Main,
  Menu,
  Submenu,
  MenuItem,
  Breadcrumb,
  BreadcrumbItem,
  Card,
  Row,
  Col,
  Table,
  TableColumn,
  Switch,
  Tooltip,
  Pagination,
  Dialog
} from 'element-ui'
Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
Vue.use(Container)
Vue.use(Header)
Vue.use(Aside)
Vue.use(Main)
Vue.use(Menu)
Vue.use(Submenu)
Vue.use(MenuItem)
Vue.use(Breadcrumb)
Vue.use(BreadcrumbItem)
Vue.use(Card)
Vue.use(Row)
Vue.use(Col)
Vue.use(Table)
Vue.use(TableColumn)
Vue.use(Switch)
Vue.use(Tooltip)
Vue.use(Pagination)
Vue.use(Dialog)
Vue.prototype.$message = Message

  • 關於路由
import Vue from 'vue'
import Router from 'vue-router'
import Login from '../components/Login.vue'
import Home from '../components/Home.vue'
import Welcome from '../components/Welcome.vue'
import User from '../components/User.vue'
Vue.use(Router)

export default new Router({
  routes: [
    { path: '/', redirect: '/login' },
    { path: '/login', component: Login },
    {
      path: '/home',
      component: Home,
      redirect: '/welcome',
      children: [
        { path: '/welcome', component: Welcome },
        { path: '/1-4-1', component: User }]
    }
  ]
})

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章