Vue nodejs商城-地址模块
一、地址列表渲染
,则不可以点击。
src/views/Cart.vue
- <a class="btn btn--red" v-bind:class="{'btn--dis':checkedCount==0}" @click="checkOut">Checkout</a>
- methods:{
- checkOut(){ // 结账
- if(this.checkedCount>0){ // 已勾选的商品种数>0时才可以跳转到地址列表页
- this.$router.push( // 跳转到地址列表页
- {path:"/address"}
- );
- }
- }
- }
未勾选时状态:
勾选时状态:
新建地址列表组件src/views/Address.vue,添加路由配置src/router/index.js
- import Address from '@/views/Address' // 地址列表
- export default
new Router({ - routes: [
- {
- path: '/address', // 地址列表路由
- name: 'Address',
- component: Address
- }
- ]
- })
渲染地址列表

地址列表后端接口:server/routes/users.js
- // 查询用户地址接口
- 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
- })
- }
- })
- })

地址列表前端调用:src/views/Address.vue
- <li v-for="item in addressList">
- <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:;" class="addr-del-btn">
- <svg class="icon icon-del"><use xlink:href="#icon-del"></use></svg>
- </a>
- </div>
- <div class="addr-opration addr-set-default">
- <a href="javascript:;" class="addr-set-default-btn"><i>Set default</i></a>
- </div>
- <div class="addr-opration addr-default">Default address</div>
- </li>
- export default {
- data(){
- return {
- addressList:[] // 地址列表
- }
- },
- mounted(){
- this.init();
- },
- methods:{
- init(){
- axios.get('/users/addressList').then((response) => {
- let res = response.data;
- this.addressList = res.result;
- })
- }
- }
- }

二、地址列表切换和展开
个
用计算属性computed对地址列表数据进行处理
- <li v-for="item in addressListFilter">
- export default {
- data(){
- return {
- addressList:[], // 地址列表
- limit:3 // 限制默认显示3个地址
- }
- },
- computed:{
- addressListFilter(){
- return
this.addressList.slice(0,this.limit); - }
- }
- }
地址展开与收起
展开与收起控制的是显示地址的个数limit,同时图标发生变化
- <a class="addr-more-btn up-down-btn" href="javascript:;" @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>
- export default{
- expand(){ // 点击more更多
- if(this.limit ==3){
- this.limit = this.addressList.length;
- }else{
- this.limit =3;
- }
- }
- }


地址选中切换
- 定义一个地址选中的索引数据checkIndex,当checkIndex等于所在li索引时,类名check加上;点击地址的时候将点击的li索引赋值给checkIndex。
<li v-for="(item,index) in addressListFilter" v-bind:class="{'check':checkIndex == index}" @click="checkIndex=index"></li> - export default {
- data(){
- return {
- checkIndex:0 // 选中的地址索引
- }
- }
- }
三、设置默认地址
server/models/users.js 先补充地址列表addressList的数据模型
- "addressList":[
- {
- "addressId": String,
- "userName": String,
- "streetName": String,
- "postCode": Number,
- "tel": Number,
- "isDefault": Boolean
- }
- ]
server/routes/users.js设置默认地址接口,前端传要设置的地址的addressId给后端,后端设置isDefault的值
- //设置默认地址接口
- 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:''
- });
- }
- })
- }
- });
- }
- });
src/views/Address.vue前端
- <div class="addr-opration addr-set-default">
- <a href="javascript:;" 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>
- methods:{
- setDefault(addressId){ // 设置默认地址
- axios.post('/users/setDefault',{
- addressId:addressId
- }).then((response)=>{
- let res = response.data;
- if(res.status=='0'){
- console.log("set default");
- this.init(); // 重新渲染地址列表
- }
- })
- }
- }

四、地址删除功能
server/routes/users.js后端删除地址接口
- //删除地址接口
- 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:''
- });
- }
- });
- });
点击删除图标会出现一个模态框,点击模态框的确定按钮,发送要删除的地址的id给后端,请求删除,然后重新渲染地址列表,删除的数据不会再出现。
src/views/Address.vue
- <!--删除图标-->
- <a href="javascript:;" class="addr-del-btn" @click="delAddressConfirm(item.addressId)">
- <svg class="icon icon-del"><use xlink:href="#icon-del"></use></svg>
- </a>
- <!-- 模态框 -->
- <modal :mdShow="isMdShow" @close="closeModal">
- <p slot="message">
- 您是否确认要删除此地址?
- </p>
- <div slot="btnGroup">
- <a class="btn btn--m" href="javascript:;" @click="delAddress">确认</a>
- <a class="btn btn--m btn--red" href="javascript:;" @click="isMdShow=false">取消</a>
- </div>
- </modal>
- export default {
- data(){
- return {
- isMdShow:false, // 模态框的显示设置
- addressId:'' // 地址id的存储,用于请求传参
- }
- }
- methods:{
- closeModal(){ // 关闭模态窗
- this.isMdShow = false;
- },
- delAddressConfirm(addressId){ // 点击删除图标,模态框出现
- this.isMdShow = true;
- this.addressId = addressId; // 地址id赋值
- },
- delAddress(){
- axios.post("/users/delAddress",{
- addressId:this.addressId // 传参
- }).then((response)=>{
- let res = response.data;
- "){
- console.log("del suc");
- this.isMdShow = false; // 告诉模态框组件,设置模态框消失
- this.init(); // 重新渲染地址
- }
- })
- }
- }
- }



点击Next跳转到订单确认页面
跳转要传选择的地址id传过去
src/views/Address.vue
- <!--选择地址的时候将地址id赋值给selectedAddrId-->
- <li v-for="(item,index) in addressListFilter" v-bind:class="{'check':checkIndex == index}" @click="checkIndex=index;selectedAddrId=item.addressId"></li>
- <!--动态跳转,传参传入地址id-->
- <router-link class="btn btn--m btn--red" v-bind:to="{path:'/orderConfirm',query:{'addressId':selectedAddrId}}">Next</router-link>
- export default {
- data(){
- return {
- selectedAddrId:'' // 选中的地址id存储,用于点击Next跳转到订单确认页面传参
- }
- }
- }
点击Next跳转,跳转到订单确认页面,url带了选择的地址id参数

Vue nodejs商城-地址模块的更多相关文章
- Vue nodejs商城-订单模块
一.订单列表渲染 新建OrderConfirm.vue订单确认页面,添加路由 src/router/index.js添加路由 import OrderConfirm from '@/views/Ord ...
- Vue nodejs商城项目-项目概述
项目概况 用vue2.0 +node.js +MongonDB 做了一个商城系统 技术选型 Vue2.0+node.js+express+MongoDB+axios+vuex 构建工具 Webpack ...
- Vue nodejs商城项目-登录模块
一.登录功能 后端server/routes/users.js var User = require('./../models/users.js'); // 二级路由 // 登录接口 router ...
- Vue nodejs商城项目- 前后端数据传递
.利用Mongoose查询MongoDB 通过mongoose插件可以简捷地从mondodb中获取数据,首先安装mongoose: cnpm install mongoose --save 使用m ...
- Vue nodejs商城项目-商品的分页、排序、筛选
.分页 ,要查第3页的数据,则跳过2*8条数据,然后返回8条数据. 在实现滚动加载时,页面刚一加载完成并不需要请求所有数据,当用户下拉到页面底部时,再去请求数据并拼接到商品数据列表中. 通过vue-i ...
- Vue nodejs商城项目-商品列表价格过滤和加入购物车功能
一.价格过滤功能 GoodsList.vue >>点击价格区间时发送请求 methods:{ getGoodsList(flag){ var param = { ...
- Vue nodejs商城项目-商品列表页面组件
data(){ return { goodsList:[], // 商品列表 priceFilter:[ // 价格区间数组 ...
- Vue nodejs商城项目-搭建express框架环境
1.express-project 搭建express框架环境 安装express generator生成器 通过生成器自动创建项目 配置分析 安装 cnpm i -g express-generat ...
- node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)
第七章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
随机推荐
- centos6.5 源码编译 mysql5.6.21
1.yum安装各个依赖包 [root@WebServer ~]# yum -y install gcc gcc-devel gcc-c++ gcc-c++-devel autoconf* automa ...
- popchain与对应poc的构造分析
本文首发于:https://mp.weixin.qq.com/s?__biz=MjM5MTYxNjQxOA==&mid=2652850238&idx=1&sn=6f22d8ab ...
- webbrowser使用已过期资源的一个报错
如果webbrowser控件已更新,仍使用一个HtmlElement就会出现以下错误: 2013-12-23 17:33:48,375 [18] ERROR xx.xxx<Run>b__0 ...
- Docker 创建镜像、修改、上传镜像
Docker 创建镜像.修改.上传镜像 –创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 一.创建镜像 创建镜像有很多方法,用户可以从 Do ...
- 抽象工厂模式&简单工厂模式
抽象工厂模式 优点: 如IFactory factory=new AccessFactory(),在一个应用中只需要初始化一次,这就使得改变应用的时候变得非常容易:其次它让具体的创建实例过程与客户端分 ...
- 深入理解读写锁—ReadWriteLock源码分析
转载:https://blog.csdn.net/qq_19431333/article/details/70568478 ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁.读锁可以在 ...
- scp命令的使用
scp命令是什么 scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. scp命令用法 scp [-1246BCpqrv] [-c cipher ...
- IO流之Properties类
Properties类介绍 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. 特点: 1.Hashtable的 ...
- 前端给div加滚动条样式修改
<!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 阿里云 linux 系统的架构
简单说,/lib是内核级的,/usr/lib是系统级的,/usr/local/lib是用户级的. /lib/ — 包含许多被 /bin/ 和 /sbin/ 中的程序使用的库文件.目录 /usr/lib ...