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.编写后台业务逻辑. ...
随机推荐
- 嵌入式Tomcat Web服务器的使用
在运行web工程时,常常要频繁启动tomcat,使用嵌入式tomcat可以减少部分重复操作. 1.下载tomcat5.0.28embed.zip 解压文件夹复制到工程下. http://archive ...
- WPF MVVM 如何在ViewModel中操作View中的控件事件
(在学习Wpf的时候,做一个小例子,想在TextBox改变后,检验合法性,并弹出提示.在找了很多贴后,发现这个小例子,抄袭过来,仅供参考. 最后也找到了适合自己例子的办法:在出发TextChanged ...
- 写一个安全的Java单例
单例模式可能是我们平常工作中最常用的一种设计模式了.单例模式解决的问题也很常见,即如何创建一个唯一的对象.但想安全的创建它其实并不容易,还需要一些思考和对JVM的了解. 1.首先,课本上告诉我,单例这 ...
- java中如何遍历实体类的属性和数据类型以及属性值
package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTa ...
- MySQL的知识回顾
经过一段时间的NodeJs开发经历,选用的数据库是MySQL,一开始以为自己对数据库的基础知识掌握还ok,因为毕竟自己以前用过Apache+PHP+MySQL做数据库课程设计,但是在开发过程中才知道在 ...
- WSAAsyncSelect 消息模型
select 模型虽然可以管理多个socket,但是它涉及到一个时机的问题,select模型会针对所管理的数组中的每一个socket循环检测它管理是否在对应的数组中,从时间复杂度上来说它是O(n^2) ...
- OLEDB 枚举数据源
在之前的程序中,可以看到有这样一个功能,弹出一个对话框让用户选择需要连接的数据源,并输入用户名和密码,最后连接:而且在一些数据库管理软件中也提供这种功能--能够自己枚举出系统中存在的数据源,同时还可以 ...
- javascript对象(3)
这个对象,不是那个对象,第三哦! 对象之间会存在继承,所以,来说一下他们之间存在的三种三种继承方式: 1.冒用继承 //创建了孙悟空构造函数 function Sun(change,weapon,gf ...
- SQL 出现18456
SQL Server 2008R2 18456错误解决方案 SQL Server 2008R2 18456错误解决方案 微软解释说,因密码或用户名错误而使身份验证失败并导致连接尝试被拒时,类似下面 ...
- 常见WEB开发安全漏洞 原因分析及解决
目 录 1 会话标识未更新 3 1.1 原因 3 1.2 解决 3 2 SQL注入 3 2.1 原因 3 2.2 解决 5 3 XSS跨站脚本编制 5 3.1 原因 5 3.2 解决 5 4 XSRF ...