vue之头像管理思路
思路是在vant库中使用插件将上传的头像转码存入数据库中。每个用户存一个,不同用户就有不同的头像了。若数据库中没有头像,那么就给一个默认头像
头像上传后端接口:
var express = require('express');
var router = express.Router();
var Headimg = require('./../sql/collection/headimgs');
var sql = require('./../sql');
var uuid = require('node-uuid');
/* GET home page. */
router.get('/', function (req, res, next) {
// res.render('index', { title: 'Express' });
res.send('测试')
});
//图片上传接口
router.post('/upload',(req,res,next)=> {
let { file , userid} = req.body;
let type = 'img';
sql.delete(Headimg);
sql.insert( Headimg, { file, type, userid } ).then( () => {
res.send({code: 10017,message: '上传成功'})
})
})
//查询图片接口
router.get('/getimg',(req,res,next) => {
let { userid } = req.query
sql.find( Headimg, { userid: userid }, {_id:0}).then((data)=>{
res.send({
code:10018,
message:'查询成功',
data:data
})
})
})
module.exports = router;
sql/collection中集合别忘了改
const mongoose = require('../db.js'); // 引入数据库连接模块
const Schema = mongoose.Schema; // 拿到当前数据库相应的集合对象
const headimgSchema = new Schema({
type: {type: String },
file: { type: String },
userid: {type: String}
})
module.exports = mongoose.model('Headimg', headimgSchema);
前端页面:
<template>
<div class="box">
<Header>
<div slot="center">个人中心</div>
</Header>
<div class="content">
<div class="user-card">
<div class="card">
<div class="card-top">
<div class="headimg" >
<img :src='headimg' alt="暂无头像" v-if="flag">
<van-uploader :after-read="afterRead" v-if="flag"/>
<img src="/images/default_photo.png" alt="暂无头像" v-else>
<p>
<span v-if="!flag" class="gologin" @click="gologin()">前往登录</span>
<span v-else>{{name}}</span>
<span>会员卡</span>
</p>
</div>
<span class="iconfont icon-ico code"></span>
</div>
<div class="card-center">
<p class="buyvip">购买会员</p>
</div>
<div class="card-bottom">
<p class="cardnum">NO.123456789</p>
<p>永久有效</p>
</div>
</div>
</div>
<div class="user-grade">
<div>
<p>40张</p>
<span>优惠券</span>
</div>
<span class="line"></span>
<div>
<p>650</p>
<span>积分</span>
</div>
<span class="line"></span>
<div>
<p>0元</p>
<span>储值</span>
</div>
</div>
<div class="user-order user-default">
<h4>我的订单</h4>
<div class="order-main main-default">
<router-link tag="div" to="/userorder?num=0">
<span class="iconfont icon-quanbudingdan"></span>
<p>全部订单</p>
</router-link>
<router-link tag="div" to="/userorder?num=1">
<span class="iconfont icon-daifukuan"></span>
<p>待付款</p>
</router-link>
<!-- <router-link tag="div" to="/userorder?num=2">
<span class="iconfont icon-daifahuo"></span>
<p>待发货</p>
</router-link> -->
<router-link tag="div" to="/userorder?num=2">
<span class="iconfont icon-daifahuodingdan"></span>
<p>待收货</p>
</router-link>
<router-link tag="div" to="/userorder?num=3">
<span class="iconfont icon-daipingjia"></span>
<p>待评价</p>
</router-link>
<router-link tag="div" to="/userorder?num=4">
<span class="iconfont icon-shouhou"></span>
<p>售后</p>
</router-link>
</div>
</div>
<div class="user-tools user-default">
<h4>我的工具</h4>
<div class="tools-main main-default">
<router-link tag="div" :to="'/address?userid=' + userid">
<span class="iconfont icon-shouhuodizhi"></span>
<p>收货地址</p>
</router-link>
<router-link tag="div" to="/updatepassword">
<span class="iconfont icon-xiugaimima"></span>
<p>修改密码</p>
</router-link>
<router-link tag="div" to="/cart">
<span class="iconfont icon-gouwuche"></span>
<p>购物车</p>
</router-link>
<div>
<span class="iconfont icon-xitongtongzhi"></span>
<p>系统通知</p>
</div>
<div>
<span class="iconfont icon-zuji"></span>
<p>足迹</p>
</div>
<div>
<span class="iconfont icon-shoucang"></span>
<p>收藏</p>
</div>
</div>
</div>
<div class="user-vip user-default">
<h4>会员中心</h4>
<div class="vip-main main-default">
<div>
<span class="iconfont icon-huiyuan"></span>
<p>会员卡</p>
</div>
<div>
<span class="iconfont icon-user-coupon"></span>
<p>优惠券</p>
</div>
<div>
<span class="iconfont icon-jifen"></span>
<p>积分</p>
</div>
<div>
<span class="iconfont icon-money-bag-copy"></span>
<p>储值金</p>
</div>
</div>
</div>
<div class="user-market user-default">
<h4>营销工具</h4>
<div class="market-main main-default">
<div>
<span class="iconfont icon-wodepintuan"></span>
<p>我的拼团</p>
</div>
<div>
<span class="iconfont icon-zhongjiangjilu-"></span>
<p>中奖记录</p>
</div>
<router-link tag="div" to="/about">
<span class="iconfont icon-daiyanrenzhongxin"></span>
<p>关于我们</p>
</router-link>
</div>
</div>
<div class="quit" v-if="flag">
<button class="outlogin" @click="outlogin()">退出登录</button>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
@import '@/lib/reset.scss';
.user-card {
padding: 0.2rem;
background: #fff;
margin-bottom: .15rem;
.card {
width: 100%;
height:1.15rem;
background: #9A9A9A url("/images/userCenterHead.png") no-repeat;
background-size: 100% auto;
border-radius: 5px;
@include flexbox();
@include flex-direction(column);
@include padding(.1rem);
@include justify-content(space-between);
.card-top {
@include flexbox();
@include justify-content(space-between);
.headimg{
img{
border-radius: 50%;
width: .5rem;
height: .5rem;
}
.van-uploader{
position: absolute;
opacity: 0;
width: 50px;
height: 50px;
}
}
div {
@include flexbox();
p {
@include padding(0 0 0 10px);
@include flexbox();
@include flex-direction(column);
.gologin {
text-decoration: underline;
// font-style: italic;
color:#fff;
font-size: 20px;
}
}
}
.code {
font-size: 0.25rem;
}
}
.card-center {
@include flexbox();
@include justify-content(flex-end);
margin-bottom: 9px;
.buyvip {
width: 0.7rem;
height:0.25rem;
background: #FF7100;
color: #fff;
text-align: center;
border-radius: 8px;
line-height: .25rem;
}
}
.card-bottom {
@include flexbox();
@include justify-content(space-between);
}
}
}
.user-grade {
@include flexbox();
@include align-items();
@include justify-content(space-around);
height: .7rem;
background: #fff;
text-align: center;
margin-bottom: 9px;
div {
p {
font-size: 0.18rem;
font-weight: bold;
}
}
.line {
width:1px;
height:25px;
background: #E4E4E4;
}
}
.user-default {
background: #fff;
margin-bottom: 10px;
h4 {
font-weight: 100;
height:.4rem;
line-height: .4rem;
padding-left: .2rem;
border-bottom: 1px solid #F3F3F3;
}
.main-default {
@include flexbox();
flex-wrap: wrap;
padding-top: 15px;
div {
width: 25%;
height:.8rem;
text-align: center;
span {
font-size: .24rem;
}
}
}
}
.user-tools, .user-market {
.tools-main, .market-main {
div {
width: 33%;
}
}
}
.quit {
@include flexbox();
justify-content: center;
.outlogin {
width: 90%;
border: none;
background: rgba(250, 41, 58, 0.808);
height:.4rem;
line-height:.4rem;
color: #fff;
margin:.2rem 0;
}
} </style>
<script>
import Header from '@/components/Header'
import Vue from 'vue'
import { Uploader } from 'vant'
import axios from '@/utils/request' Vue.use(Uploader)
export default {
components: {
Header
},
data () {
return {
flag: false,
name: '',
headimg: 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=188149577,2949073731&fm=26&gp=0.jpg',
userid: ''
}
},
created () {
let userid = localStorage.getItem('userid')
axios.get('headimg/getimg?userid=' + userid).then(res => {
if (res.data.code === 10018) {
// console.log(res)
if (res.data.data.length !== 0) {
this.headimg = res.data.data[0].file
}
}
})
},
methods: {
gologin () {
this.$router.push('/login')
},
afterRead (file) {
// 此时可以自行将文件上传至服务器
let userid = localStorage.getItem('userid')
axios.post('headimg/upload', {
userid: userid,
file: file.content
}).then(res => {
console.log(userid)
this.$router.go(0)
})
},
outlogin () {
localStorage.removeItem('userid')
localStorage.removeItem('username')
// localStorage.removeItem('token')
window.location.reload()
}
},
mounted () {
let username = localStorage.getItem('username')
let id = localStorage.getItem('userid')
// console.log(username)
if (username) {
this.name = username
this.userid = id
this.flag = true
} else {
this.flag = false
}
}
}
</script>
vue之头像管理思路的更多相关文章
- Vue之状态管理(vuex)与接口调用
Vue之状态管理(vuex)与接口调用 一,介绍与需求 1.1,介绍 1,状态管理(vuex) Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态 ...
- 手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示
手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示 效果演示地址 项目demo展示 重要功能总结 权限功能的实现 权限路由思路: 根据用户登录的roles信息与路由中配置的roles信息进行比 ...
- Vue Admin - 基于 Vue & Bulma 后台管理面板
Vue Admin 是一个基于 Vue 2.0 & Bulma 0.3 的后台管理面板(管理系统),相当于是 Vue 版本的 Bootstrap 管理系统,提供了一组通用的后台界面 UI 和组 ...
- 练习vue(用户管理)1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Vue + ElementUI 后台管理模板推荐
最近学习和项目都用到了Vue和ElementUI,自己不是专业前端,搞这些UI上的东西还是有些难度,这里推荐两个Vue + ElementUI后台管理模板 vue-element-admin vue- ...
- vue项目接口管理,所有接口都在apis文件夹中统一管理
参考:https://www.codercto.com/a/53432.html 在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢? 方法可能不只一种,本文 ...
- vue_shop(基于vue电商管理后台网站)
vue_shop 目录 vue_shop day01 实现登录功能 项目预开发处理 Login.vue完整代码: 处理步骤: 添加element-ui的表单组件 添加第三方字体: 添加表单验证 导入a ...
- vue实现图书管理demo
年后公司的项目要求用到vue.js知识,我angular没有学,node.js和react也只是了解了一点点,所以学起来比较困难.如果你想学vue.js的知识,推荐网址:http://vuejs.or ...
- vue创建状态管理(vuex的store机制)
1:为什么说要是永远状态管理 在使用 Vue 框架做单页面应用时,我们时常会遇到传值,组件公用状态的问题.(子父间传值文章传送门) ,如果是简单的应用,兄弟组件之间通信还能使用 eventBus 来作 ...
- 转 理解vuex -- vue的状态管理模式
转自:https://segmentfault.com/a/1190000012015742 vuex是什么? 先引用vuex官网的话: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 ...
随机推荐
- MarkDown初次见面——
Markdown基础语法 分级标题 n级标题就在前面加n个#即可,但是仅支持到六级标题. 字体 柔骨兔 字体倾斜:左右两边加1个* 柔骨兔 字体加粗:左右两边各自添加2个* 柔骨兔 倾斜加粗:左右两边 ...
- Merge Overlapping Intervals
refer to: https://www.algoexpert.io/questions/Merge%20Overlapping%20Intervals Problem Statement Samp ...
- Python+Django(1)——建立项目
为项目新建一个目录,将其命名为learning_log,再在终端中切换到这个目录(Python 3): 运行模块venv 来创建一个名为ll_env的虚拟环境:python -m venv ll_en ...
- 接口自动化-requests环境安装(import requests模块引用失败问题)
命名规范,可以避免低级问题 1. 命名最好是英文字符.下划线.数字三个组成. 2.项目(工程)名称.文件包名.模块名称等都应该是用英文开头,不能纯数字,(下划线开头的一般有特殊含义,不懂的话别乱用) ...
- 照亮体育馆 Barisal Stadium
UVA10641 题目为逆时针顺序编号,这里直接将数组开两倍来处理环.(然而不知为啥开到1000也能过) 定义: Corners[i]Corners[i]Corners[i]为体育馆点的坐标. Lig ...
- OSIDP-单处理器调度-09
处理器调度的类型 处理器调度的目的是为了满足系统的目标,将进程分配到处理器上执行. 系统并发度:正等待处理器处理的进程个数.(这里的表述和08里面的不同,以这里为准.主要是懒得改,见谅= =) 长程调 ...
- 使用generator进行代码自动生成
在使用generator 进行逆向工程时,一下为步骤 添加mybatis generator的maven插件依赖 添加mybatis generator的配置文件:generatorConfig.xm ...
- nodejs 反单引号用法(·)
这个反单引号就是数字1旁边(~)下面的那个符号,平时用得很少,虽然单引号和双引号是使用较多的,但我们还有第三个方案,就是ES6中的模板字符串(反引号). 在nodejs中用反单引号(·)主要基于以下作 ...
- JavaScript argument
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- sql运算符优先级
1.() 2.* / % 3.+正 -负 + - +连接(字符串) 4.= > < >= <= <> != !> !< 5.not 6.and 7.b ...