<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        node和vue實現商城用戶地址模塊

        來源:懂視網 責編:小OO 時間:2020-11-27 22:02:53
        文檔

        node和vue實現商城用戶地址模塊

        本文為大家分享了node和vue商城用戶地址模塊的實現,供大家參考,具體內容如下:server/models/user.js。,這樣才能加載到 三個參數分別是 模型名,userSchema名,管理數據庫集合名module.exports = mongoose.model("User",userSchema,"users")。server/routes/users.js。
        推薦度:
        導讀本文為大家分享了node和vue商城用戶地址模塊的實現,供大家參考,具體內容如下:server/models/user.js。,這樣才能加載到 三個參數分別是 模型名,userSchema名,管理數據庫集合名module.exports = mongoose.model("User",userSchema,"users")。server/routes/users.js。

        本文為大家分享了node和vue商城用戶地址模塊的實現,供大家參考,具體內容如下

        server/models/user.js

        var mongoose = require('mongoose')
        var userSchema = mongoose.Schema({
         "userId":String, // 用戶Id
         "userName":String, // 用戶名
         "userPwd":String, // 用戶密碼
         "orderList":Array, // 訂單列表
         "cartList":[ // 購物車列表
         {
         "productId": String, // 商品Id
         "productName": String, // 商品名稱
         "salePrice":String, // 商品價格
         "productImage":String, // 圖片地址
         "checked":String, // 是否選中
         "productNum":String // 商品數量
         }
         ],
         "addressList":[ // 用戶地址列表
         {
         "addressId": String,
         "userName": String,
         "streetName": String,
         "postCode": Number,
         "tel": Number,
         "isDefault": Boolean
         }
         ]
        });
         
        // 通過module.exports進行
        輸出,這樣才能加載到 三個參數分別是 模型名,userSchema名,管理數據庫集合名 module.exports = mongoose.model("User",userSchema,"users");

        server/routes/users.js

        var express = require('express');
        var router = express.Router();
         
        var User = require('./../models/user');
         
        /* GET users listing. */
        router.get('/', function(req, res, next) {
         res.send('respond with a resource');
        });
         
        router.get('/test', function(req, res, next) {
         res.send('test');
        });
         
        // 登錄
        router.post('/login', function(req, res, next) {
         // 獲取前端傳過來的參數 post方式用req.Body形式獲取參數
         var param = {
         userName:req.body.userName,
         userPwd:req.body.userPwd
         }
         User.findOne(param, function(err,doc) {
         if(err){
         res.json({
         status:"1",
         msg:err.message
         });
         }else{
         if(doc){
         res.cookie("userId",doc.userId,{ // 將用戶信息存入cookie
         path:'/',
         maxAge: 1000*60*60
         }); 
         res.cookie("userName",doc.userName, {
         path:'/',
         maxAge: 1000*60*60
         });
         // req.session.user = doc; // 將用戶信息存入session
         res.json({
         status:'0',
         msg:'',
         result:{
         userName:doc.userName
         }
         })
         }
         }
         });
        });
         
        // 登出接口
        router.post("/logout", function (req,res,next) {
         res.cookie("userId", "", { // 登出將userId設置為""
         path:"/",
         maxAge:-1 // 設置位過期
         })
         res.json({
         status:"0",
         msg:'',
         result:''
         })
        })
         
        // 校驗用戶信息
        router.get("/checkLogin", function (req,res,next) {
         if(req.cookies.userId){
         res.json({
         status:'0',
         msg:'',
         result: req.cookies.userName || '' // 獲取cookeie req.cookies.屬性
         });
         }else{ // 取不到就說明當前沒有登錄
         res.json({
         status:'1',
         msg:'未登錄',
         result:''
         });
         }
        })
         
        // 查詢當前用戶的購物車數據
        router.get("/cartList", function (req,res,next) {
         var userId = req.cookies.userId;
         console.log(userId);
         User.findOne({userId:userId}, function (err,doc) {
         if(err){
         res.json({
         status:'1',
         msg:err.message,
         result:''
         });
         }else{
         if(doc){
         res.json({
         status:'0',
         msg:'',
         result:doc.cartList
         });
         }
         }
         });
        });
         
        // 購物車刪除
        router.post("/cartDel", function (req,res,next) {
         // 獲取瀏覽器的cookie 以及用戶傳遞過來的參數 productId
         var userId = req.cookies.userId,productId = req.body.productId;
         User.update({
         userId:userId
         },{
         $pull:{
         'cartList':{
         'productId':productId
         }
         }
         }, function (err,doc) {
         if(err){
         res.json({
         status:'1',
         msg:err.message,
         result:''
         });
         }else{
         res.json({
         status:'0',
         msg:'',
         result:'suc'
         });
         }
         });
        });
         
        //修改購物車商品數量
        router.post("/cartEdit", function (req,res,next) {
         var userId = req.cookies.userId, // 獲取用戶客戶端的userId
         productId = req.body.productId, // 獲取用戶傳的參數商品id
         productNum = req.body.productNum, // 獲取用戶傳的參數商品id
         checked = req.body.checked; // 獲取用戶傳的參數是否選中
         User.update({
         "userId":userId,
         "cartList.productId":productId},{
         "cartList.$.productNum":productNum,
         "cartList.$.checked":checked,
         }, function (err,doc) {
         if(err){
         res.json({
         status:'1',
         msg:err.message,
         result:''
         });
         }else{
         res.json({
         status:'0',
         msg:'',
         result:'suc'
         });
         }
         })
        });
         
        // 商品全選不選
        router.post("/editCheckAll", function (req,res,next) {
         var userId = req.cookies.userId,
         checkAll = req.body.checkAll?'1':'0';
         User.findOne({userId:userId}, function (err,user) {
         if(err){
         res.json({
         status:'1',
         msg:err.message,
         result:''
         });
         }else{
         if(user){
         user.cartList.forEach((item)=>{
         item.checked = checkAll;
         })
         user.save(function (err1,doc) {
         if(err1){
         res.json({
         status:'1',
         msg:err1,message,
         result:''
         });
         }else{
         res.json({
         status:'0',
         msg:'',
         result:'suc'
         });
         }
         })
         }
         }
         });
        });
         
        // 用戶地址模塊開始-----------------------------------------------------------------------------------------------
        // 查詢用戶地址接口
        router.get("/addressList", function (req,res,next) {
         var userId = req.cookies.userId;
         User.findOne({userId:userId}, function (err,doc) {
         if(err){
         res.json({
         status:'1',
         msg:err.message,
         result:''
         });
         }else{
         res.json({
         status:'0',
         msg:'',
         result:doc.addressList
         });
         }
         })
        });
         
        // 設置默認地址
        router.post("/setDefault", function (req,res,next) {
         var userId = req.cookies.userId,
         addressId = req.body.addressId;
         if(!addressId){
         res.json({
         status:'1003',
         msg:'addressId is null',
         result:''
         });
         }else{
         User.findOne({userId:userId}, function (err,doc) {
         if(err){
         res.json({
         status:'1',
         msg:err.message,
         result:''
         });
         }else{
         var addressList = doc.addressList;
         addressList.forEach((item)=>{
         if(item.addressId == addressId){
         item.isDefault = true;
         }else{
         item.isDefault = false;
         }
         });
         
         doc.save(function (err1,doc1) {
         if(err){
         res.json({
         status:'1',
         msg:err.message,
         result:''
         });
         }else{
         res.json({
         status:'0',
         msg:'',
         result:''
         });
         }
         })
         }
         });
         }
        });
         
        // 刪除地址接口 
        router.post("/delAddress", function (req,res,next) {
         var userId = req.cookies.userId,addressId = req.body.addressId;
         User.update({
         userId:userId
         },{
         $pull:{ // 刪除子文檔元素
         'addressList':{
         'addressId':addressId
         }
         }
         }, function (err,doc) {
         if(err){
         res.json({
         status:'1',
         msg:err.message,
         result:''
         });
         }else{
         res.json({
         status:'0',
         msg:'',
         result:''
         });
         }
         });
        });
        // 用戶地址模塊開始-----------------------------------------------------------------------------------------------
         
         
        module.exports = router;

        vue 前端部分

        src/router/index.js 路由

        import Vue from 'vue'
        import Router from 'vue-router'
        import GoodsList from './../views/GoodsList.vue'
        import Cart from '@/views/Cart.vue'
        import Address from '@/views/Address'
        Vue.use(Router);
         
        export default new Router({
         routes: [
         {
         path: '/',
         name: 'GoodsList',
         component:GoodsList
         },
         {
         path: '/cart',
         name: 'Cart',
         component:Cart
         },
         {
         path: '/address',
         name: 'Address',
         component:Address
         }
         ]
        })

        src/views/Address.vue

        <template>
         <div>
         <nav-header></nav-header>
         <nav-bread>
         <span>Address</span>
         </nav-bread>
         <div class="checkout-page">
         <svg style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
         <defs>
         <symbol id="icon-add" viewBox="0 0 31 32">
         <title>add</title>
         <path class="path1" d="M30.745 15.152h-14.382v-14.596c0-0.308-0.243-0.557-0.543-0.557s-0.543 0.249-0.543 0.557v14.596h-14.665c-0.3 0-0.543 0.249-0.543 0.557s0.243 0.557 0.543 0.557h14.665v15.177c0 0.307 0.243 0.557 0.543 0.557s0.543-0.249 0.543-0.557v-15.177h14.382c0.3 0 0.543-0.249 0.543-0.557s-0.243-0.557-0.543-0.557z"></path>
         </symbol>
         <symbol id="icon-ok" viewBox="0 0 32 32">
         <title>ok</title>
         <path class="path1" d="M14.084 20.656l-7.845-9.282c-1.288-1.482-3.534-1.639-5.016-0.351s-1.639 3.534-0.351 5.016l10.697 12.306c1.451 1.669 4.057 1.623 5.448-0.096l18.168-22.456c1.235-1.527 0.999-3.765-0.528-5.001s-3.765-0.999-5.001 0.528l-15.573 19.337z"></path>
         </symbol>
         <symbol id="icon-edit" viewBox="0 0 32 32">
         <title>edit</title>
         <path class="path1" d="M28.287 8.51l-4.805-4.806 0.831-0.831c0.472-0.472 1.086-0.777 1.564-0.777 0.248 0 0.452 0.082 0.622 0.253l3.143 3.144c0.539 0.54 0.133 1.529-0.524 2.186l-0.831 0.831zM26.805 9.992l-1.138 1.138-4.805-4.806 1.138-1.138 4.805 4.806zM24.186 12.612l-14.758 14.762-4.805-4.806 14.758-14.762 4.805 4.806zM7.379 28.288l-4.892 1.224 1.223-4.894 3.669 3.67zM31.123 4.011l-3.143-3.144c-0.567-0.567-1.294-0.867-2.103-0.867-1.036 0-2.174 0.52-3.045 1.391l-20.429 20.436c-0.135 0.134-0.23 0.302-0.276 0.487l-2.095 8.385c-0.089 0.355 0.017 0.736 0.276 0.995 0.198 0.198 0.461 0.307 0.741 0.307 0.085 0 0.171-0.010 0.254-0.031l8.381-2.096c0.185-0.047 0.354-0.142 0.487-0.276l20.43-20.436c1.409-1.41 2.042-3.632 0.524-5.15v0z"></path>
         </symbol>
         <symbol id="icon-del" viewBox="0 0 32 32">
         <title>delete</title>
         <path class="path1" d="M11.355 4.129v-2.065h9.29v2.065h-9.29zM6.194 29.935v-23.742h19.613v23.742h-19.613zM30.968 4.129h-8.258v-3.097c0-0.569-0.463-1.032-1.032-1.032h-11.355c-0.569 0-1.032 0.463-1.032 1.032v3.097h-8.258c-0.569 0-1.032 0.463-1.032 1.032s0.463 1.032 1.032 1.032h3.097v24.774c0 0.569 0.463 1.032 1.032 1.032h21.677c0.569 0 1.032-0.463 1.032-1.032v-24.774h3.097c0.569 0 1.032-0.463 1.032-1.032s-0.463-1.032-1.032-1.032v0z"></path>
         <path class="path2" d="M10.323 9.806c-0.569 0-1.032 0.463-1.032 1.032v14.452c0 0.569 0.463 1.032 1.032 1.032s1.032-0.463 1.032-1.032v-14.452c0-0.569-0.463-1.032-1.032-1.032z"></path>
         <path class="path3" d="M16 9.806c-0.569 0-1.032 0.463-1.032 1.032v14.452c0 0.569 0.463 1.032 1.032 1.032s1.032-0.463 1.032-1.032v-14.452c0-0.569-0.463-1.032-1.032-1.032z"></path>
         <path class="path4" d="M21.677 9.806c-0.569 0-1.032 0.463-1.032 1.032v14.452c0 0.569 0.463 1.032 1.032 1.032s1.032-0.463 1.032-1.032v-14.452c0-0.569-0.463-1.032-1.032-1.032z"></path>
         </symbol>
         <symbol id="icon-clock" viewBox="0 0 32 32">
         <title>clock</title>
         <path class="path1" d="M29.333 16c0-7.364-5.97-13.333-13.333-13.333s-13.333 5.97-13.333 13.333c0 7.364 5.97 13.333 13.333 13.333s13.333-5.97 13.333-13.333v0 0 0 0 0 0zM0 16c0-8.837 7.163-16 16-16s16 7.163 16 16c0 8.837-7.163 16-16 16s-16-7.163-16-16zM14.667 14.667v1.333h2.667v-10.667h-2.667v9.333zM24 18.667h1.333v-2.667h-10.667v2.667h9.333z"></path>
         </symbol>
         <symbol id="icon-question" viewBox="0 0 32 32">
         <title>question</title>
         <path class="path1" d="M16 2.56c7.411 0 13.44 6.029 13.44 13.44s-6.029 13.44-13.44 13.44c-7.411 0-13.44-6.029-13.44-13.44s6.029-13.44 13.44-13.44zM16 0c-8.822 0-16 7.178-16 16s7.178 16 16 16c8.822 0 16-7.178 16-16s-7.178-16-16-16z"></path>
         <path class="path2" d="M16 22.080c-1.059 0-1.92 0.861-1.92 1.92s0.861 1.92 1.92 1.92c1.059 0 1.92-0.861 1.92-1.92s-0.861-1.92-1.92-1.92z"></path>
         <path class="path3" d="M12.16 12.48c0.706 0 1.28-0.574 1.28-1.28 0-1.412 1.148-2.56 2.56-2.56s2.56 1.148 2.56 2.56c0 1.412-1.148 2.56-2.56 2.56-0.706 0-1.28 0.574-1.28 1.28v3.84c0 0.706 0.574 1.28 1.28 1.28s1.28-0.574 1.28-1.28v-2.723c2.224-0.575 3.84-2.616 3.84-4.957 0-2.823-2.297-5.12-5.12-5.12s-5.12 2.297-5.12 5.12c0 0.706 0.574 1.28 1.28 1.28z"></path>
         </symbol>
         </defs>
         </svg>
         <div class="container">
         <div class="checkout-addr">
         <div class="page-title-normal">
         <h2 class="page-title-h2"><span>check out</span></h2>
         </div>
         <!-- process step -->
         <div class="check-step">
         <ul>
         <li class="cur"><span>Confirm</span> address</li>
         <li><span>View your</span> order</li>
         <li><span>Make</span> payment</li>
         <li><span>Order</span> confirmation</li>
         </ul>
         </div>
         
         <!-- address list -->
         <div class="page-title-normal checkout-title">
         <h2><span>Shipping address</span></h2>
         </div>
         <div class="addr-list-wrap">
         <div class="addr-list">
         <ul>
         <li v-for="(item,index) in addressListFilter" :key="index" v-bind:class="{'check':checkIndex==index}" @click="checkIndex=index;selectedAddrId=item.addressId">
         <dl>
         <dt>{{item.userName}}</dt>
         <dd class="address">{{item.streetName}}</dd>
         <dd class="tel">{{item.tel}}</dd>
         </dl>
         <div class="addr-opration addr-del">
         <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="addr-del-btn" @click="delAddressConfirm(item.addressId)">
         <svg class="icon icon-del"><use xlink:href="#icon-del" rel="external nofollow" ></use></svg>
         </a>
         </div>
         <div class="addr-opration addr-set-default">
         <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="addr-set-default-btn" v-if="!item.isDefault" @click="setDefault(item.addressId)"><i>Set default</i></a>
         </div>
         <div class="addr-opration addr-default" v-if="item.isDefault">Default address</div>
         </li>
         <li class="addr-new">
         <div class="add-new-inner">
         <i class="icon-add">
         <svg class="icon icon-add"><use xlink:href="#icon-add" rel="external nofollow" ></use></svg>
         </i>
         <p>Add new address</p>
         </div>
         </li>
         </ul>
         </div>
         
         <div class="shipping-addr-more">
         <a class="addr-more-btn up-down-btn" href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="expand" v-bind:class="{'open':limit>3}">
         more
         <i class="i-up-down">
         <i class="i-up-down-l"></i>
         <i class="i-up-down-r"></i>
         </i>
         </a>
         </div>
         </div>
         
         <!-- shipping method-->
         <div class="page-title-normal checkout-title">
         <h2><span>Shipping method</span></h2>
         </div>
         <div class="shipping-method-wrap">
         <div class="shipping-method">
         <ul>
         <li class="check">
         <div class="name">Standard shipping</div>
         <div class="price">Free</div>
         <div class="shipping-tips">
         <p>Once shipped,Order should arrive in the destination in 1-7 business days</p>
         </div>
         </li>
         </ul>
         </div>
         </div>
         <div class="next-btn-wrap">
         <router-link class="btn btn--m btn--red" v-bind:to="{path:'orderConfirm',query:{'addressId':selectedAddrId}}">Next</router-link>
         </div>
         </div>
         </div>
         </div>
         <modal :mdShow="isMdShow" @close="closeModal">
         <p slot="message">
         您是否確認要刪除此地址?
         </p>
         <div slot="btnGroup">
         <a class="btn btn--m" href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="delAddress">確認</a>
         <a class="btn btn--m btn--red" href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="isMdShow=false">取消</a>
         </div>
         </modal>
         <nav-footer></nav-footer>
         </div>
        </template>
        <style>
        </style>
        <script>
         import NavHeader from './../components/NavHeader'
         import NavFooter from './../components/NavFooter'
         import NavBread from './../components/NavBread'
         import Modal from './../components/Modal'
         import {currency} from './../util/currency'
         import axios from 'axios'
         export default{
         data(){
         return{
         limit:3,
         checkIndex:0, // 默認選中第一個地址
         selectedAddrId:'',
         addressList:[],
         isMdShow:false,
         addressId:''
         }
         },
         mounted(){
         this.init();
         },
         computed:{
         addressListFilter(){ // 動態計算,默認顯示3條地址數據
         return this.addressList.slice(0,this.limit); // 默認顯示3條數據
         }
         },
         components:{
         NavHeader,
         NavFooter,
         NavBread,
         Modal
         },
         methods:{
         init(){
         axios.get("/users/addressList").then((response)=>{ // 獲取用戶地址列表
         let res = response.data;
         this.addressList = res.result;
         this.selectedAddrId = this.addressList[0].addressId;
         for(var i=0;i<this.addressList.length;i++){
         if(this.addressList[i].isDefault){
         this.checkIndex = i;
         }
         }
         });
         },
         expand(){ // 展開和收起地址列表
         if(this.limit==3){
         this.limit = this.addressList.length;
         }else{
         this.limit = 3;
         }
         },
         setDefault(addressId){ // 設置默認地址
         axios.post("/users/setDefault",{
         addressId:addressId
         }).then((response)=>{
         let res = response.data;
         if(res.status=='0'){
         console.log("set default");
         this.init();
         }
         })
         },
         closeModal(){ // 管理刪除地址提示彈框
         this.isMdShow = false;
         },
         delAddressConfirm(addressId){ // 彈出模態框 選中刪除的地址
         this.isMdShow = true;
         this.addressId = addressId;
         },
         delAddress(){ // 刪除該地址
         axios.post("/users/delAddress",{
         addressId:this.addressId
         }).then((response)=>{
         let res = response.data;
         if(res.status=="0"){
         console.log("del suc");
         this.isMdShow = false;
         this.init();
         }
         })
         }
         }
         }
        </script>

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        node和vue實現商城用戶地址模塊

        本文為大家分享了node和vue商城用戶地址模塊的實現,供大家參考,具體內容如下:server/models/user.js。,這樣才能加載到 三個參數分別是 模型名,userSchema名,管理數據庫集合名module.exports = mongoose.model("User",userSchema,"users")。server/routes/users.js。
        推薦度:
        標簽: VUE 商城 實現
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产免费av片在线播放| 久久精品国产亚洲av麻豆小说 | 亚洲中文字幕精品久久| 亚洲欧美国产国产综合一区| 久久亚洲精品无码av| 一级毛片免费在线播放| a色毛片免费视频| 亚洲视频在线观看免费视频| 在线免费观看中文字幕| 亚洲中文字幕在线乱码| 亚洲永久中文字幕在线| 亚洲狠狠婷婷综合久久| 国产免费高清69式视频在线观看| 久别的草原电视剧免费观看| 最近高清国语中文在线观看免费| 亚洲精品国自产拍在线观看| 亚洲精品国产专区91在线| 四虎影视无码永久免费| 国产亚洲一区二区三区在线不卡| 精品日韩亚洲AV无码一区二区三区 | 毛片A级毛片免费播放| 亚洲三级高清免费| 国产午夜无码片免费| 青苹果乐园免费高清在线| 国产成人亚洲精品影院| 亚洲欧洲日韩国产| 九九久久国产精品免费热6| 国产男女性潮高清免费网站| 亚洲福利视频一区| 黄色网页免费观看| 成人A级毛片免费观看AV网站| 涩涩色中文综合亚洲| 日韩免费高清视频| 亚洲成a人片在线观| 噼里啪啦免费观看高清动漫4| 国产AⅤ无码专区亚洲AV| 久久国产免费直播| 久久精品国产精品亚洲艾| 成年免费大片黄在线观看com| 成人免费午夜在线观看| 亚洲欧洲av综合色无码|