思路是在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之头像管理思路的更多相关文章

  1. Vue之状态管理(vuex)与接口调用

    Vue之状态管理(vuex)与接口调用 一,介绍与需求 1.1,介绍 1,状态管理(vuex) Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态 ...

  2. 手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示

    手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示 效果演示地址 项目demo展示 重要功能总结 权限功能的实现 权限路由思路: 根据用户登录的roles信息与路由中配置的roles信息进行比 ...

  3. Vue Admin - 基于 Vue & Bulma 后台管理面板

    Vue Admin 是一个基于 Vue 2.0 & Bulma 0.3 的后台管理面板(管理系统),相当于是 Vue 版本的 Bootstrap 管理系统,提供了一组通用的后台界面 UI 和组 ...

  4. 练习vue(用户管理)1

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Vue + ElementUI 后台管理模板推荐

    最近学习和项目都用到了Vue和ElementUI,自己不是专业前端,搞这些UI上的东西还是有些难度,这里推荐两个Vue + ElementUI后台管理模板 vue-element-admin vue- ...

  6. vue项目接口管理,所有接口都在apis文件夹中统一管理

    参考:https://www.codercto.com/a/53432.html 在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢? 方法可能不只一种,本文 ...

  7. vue_shop(基于vue电商管理后台网站)

    vue_shop 目录 vue_shop day01 实现登录功能 项目预开发处理 Login.vue完整代码: 处理步骤: 添加element-ui的表单组件 添加第三方字体: 添加表单验证 导入a ...

  8. vue实现图书管理demo

    年后公司的项目要求用到vue.js知识,我angular没有学,node.js和react也只是了解了一点点,所以学起来比较困难.如果你想学vue.js的知识,推荐网址:http://vuejs.or ...

  9. vue创建状态管理(vuex的store机制)

    1:为什么说要是永远状态管理 在使用 Vue 框架做单页面应用时,我们时常会遇到传值,组件公用状态的问题.(子父间传值文章传送门) ,如果是简单的应用,兄弟组件之间通信还能使用 eventBus 来作 ...

  10. 转 理解vuex -- vue的状态管理模式

    转自:https://segmentfault.com/a/1190000012015742 vuex是什么? 先引用vuex官网的话: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 ...

随机推荐

  1. linux上安装Oracle 包括常见安装错误(centos8.1,oracle linux8,redhat 8)通过

    谨记 关闭操作系统之前先关闭oracle数据库 oracle用户登录,执行lsnrctl start启动网络监听服务,执行dbstart启动数据库系统. oracle用户登录,执行lsnrctl st ...

  2. CentOS 7 部署Memcached服务器——超级详细

    操作系统:CentOS 7.x 64位实现目的:安装部署Memcached服务器 一.防火墙设置CentOS 7.x默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭f ...

  3. 格式化 ceph osd 盘报错stderr: wipefs: error: /dev/sdc: probing initialization failed: Device or resource busy

    1.格式化 ceph集群osd盘 出现设备繁忙,只能手动清空磁盘并重启 格式化:ceph-volume lvm zap /dev/sdc dd 手动清空磁盘:dd if=/dev/zero of=/d ...

  4. redis 配置哨兵模式时出现的问题(redis 版本 6.2.5)

    今天准备搭建一个 redis 集群(redis 版本 6.2.5),在这之前要先配置好哨兵模式. 但是在配置哨兵模式时出现了问题.之前没有搭建集群时(一主两从,三台虚拟机)可以顺利配置好,而搭建集群时 ...

  5. Qt编译问题之FTH (7156) Fault tolerant heap shim applied to current process

    有时候Qt编译会出现FTH: (7156): *** Fault tolerant heap shim applied to current process. This is usually due ...

  6. Manage your references to .Net assemblies Dynamics 365 for Operations VS projects

    (Dynamics 365 for Operations was previously known as the New Dynamics AX) Dynamics 365 for Operation ...

  7. 01 docker容器技术基础入门

    本章内容: 1.container是什么? 2.LXC技术介绍 3.namespaces-名称空间,实现资源隔离 4.容器的资源分配--Cgroup,实现资源分配 5.LXC与dockers ---- ...

  8. scrapy.Request callback不执行

    1.在scrapy.Request方法里边加上参数dont_filter=True(去重) 2.增加是不是allowed_domains范围内的url 3.yield Request 改为yield ...

  9. 6Sampling Configuration Space: 6.3 Using Accelerated Molecular Dynamics (aMD) to enhance sampling

    6.3 Using Accelerated Molecular Dynamics (aMD) to enhance sampling 英文官网:http://ambermd.org/tutorials ...

  10. Weblogic禁用不安全的http请求

    参考链接: https://blog.csdn.net/linfanhehe/article/details/78470733