思路是在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. vue后台管理系统——商品管理模块

    电商后台管理系统的功能--商品管理模块 商品管理概述 商品管理模块用于维护电商平台的商品信息,包括商品的类型.参数.图片.详情等信息. 通过商品管理模块可以实现商品的添加.修改.展示和删除等功能. 1 ...

  2. C# DataTable.Select()根据条件筛选数据

    1.前言: 很多时候我们获取到一个表的时候需要根据表的包含的队列去筛选内容,一般来说可能想到的就是遍历整个表的内容进行条件筛选,但是这种方式增加了代码量且易出错,DataTable.Select()就 ...

  3. tensorflow 模型批处理参数tensor快速赋值参考

    批处理调用模型的时候,如果逐像素给tensor对象数据部分赋值的话,效率是很低的,尤其是对于一些图片数据,所以数据块直接拷贝可以大大提高效率, 先取得数据指针: output_tensor->f ...

  4. 【Hive】数据倾斜原因及解决方法汇总

    1)数据倾斜根本原因:由于数据分布不均匀,导致map端读取的数据分布不均匀(数据长尾分布),从而使得map处理的数据量差异过大. (2)解决思路:Hive是分阶段执行的,map处理数据量的差异取决于上 ...

  5. 字节过滤流 缓冲流-->BufferedInputStream用法

    1创建字节输入节点流FileInputStream fis = new FileInputStream("文件读取的路径");2创建字节输入过滤流,包装一个字节输入节点流Buffe ...

  6. 【第4次作业】CNN实战

    使用VGG模型进行猫狗大战 import numpy as np import matplotlib.pyplot as plt import os import torch import torch ...

  7. 龙中华著《Spring Boot实战派》读书笔记之基础篇

    第四章 Spring Boot 基础 4.1 了解Spring Boot 项目结构 src/main/java //入口类,等 src/main/resources //静态文件和配置文件 src/t ...

  8. java15配置环境后java_version无反应(不显示“不是内部或外部命令”)

    重新装了jdk15来使用eclipse 配置完环境变量之后打开cmd输入 java -version 好家伙,居然一点反映都没有, 然后傻乎乎的跑回去重新配置JAVA_HOME和path 还是没用,细 ...

  9. python - 命令行下一键更新所有包

    Python3.8以下这样一键更新所有包:from pip._internal.utils.misc import get_installed_distributionsfrom subprocess ...

  10. Linux部署JDK教程

    上一次说了windows下的jdk部署,这一次记录下Linux下的jdk部署,恰巧遇到一篇写的很清楚的教程,我就直接转过来啦,哈哈.. 一. 解压安装jdk 在shell终端下进入jdk-6u14-l ...