node

node

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
javascript/jQuery

javascript/jQuery

一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。
MongoDB

MongoDB

MongoDB 是一个基于分布式文件存储的数据库
openstack

openstack

OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。
VUE

VUE

一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。
bootstrap

bootstrap

Bootstrap is the most popular HTML, CSS, and JS framework for developing responsive, mobile first projects on the web.
HTML

HTML

超文本标记语言,标准通用标记语言下的一个应用。
CSS/SASS/SCSS/Less

CSS/SASS/SCSS/Less

层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
PHP

PHP

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执
每天进步一点点

每天进步一点点

乌法把门的各累笑寂静
求职招聘

求职招聘

猎头招聘专用栏目
Python

Python

一种解释型、面向对象、动态数据类型的高级程序设计语言。

vue 验证码倒计时(jq vs vue)

lopo1983 发表了文章 • 0 个评论 • 1742 次浏览 • 2017-06-26 12:45 • 来自相关话题

短信验证 现在是市面上比较流行的一种验证方式,最近公司的项目有涉及到故整体如下
?
JQ版本
?
jssendMsm: function(wait, objectb) {
var time = wait;
if(time == 0) {
$(objectb).removeAttr("disabled");
$(objectb).text("获取验证码");
$(objectb).removeClass('hidden');
$(objectb).next().addClass('hidden');
time = wait;
} else {
$(objectb).attr("disabled", true);
$(objectb).addClass('hidden');
$(objectb).next().removeClass('hidden').text(time + " s 后重发");
time--;
setTimeout(function() {
qdcms.sendMsm(time, objectb);
}, 1000)
}
}




html<a class="btn btn-black" onclick="qdcms.getcode(60,this)">获取验证码</a>
<span class="btn btn-black disabled hidden"></span>css
VBAdmin-UI
?
预览地址:https://www.tfstock.com.cn/?点击注册按钮
?
?
Vue 实现
?
template<template>
<button class="timerout" :disabled="disabled || time > 0" @click='run'>
{{ text }}
</button>
</template>script<script>
export default {
name: 'timerbtn',
props: {
second: {
type: Number,
default: 60
},
disabled: {
type: Boolean,
default: false
}
},
data: function() {
return {
time: 0
}
},
methods: {
run() {
this.time = this.second;
this.timer();
},
timer() {
if(this.time > 0) {
this.time--;
setTimeout(this.timer, 1000);
}
}
},
computed: {
text() {
return this.time > 0 ? this.time + 's 后重新获取' : '点击获取验证码';
}
},
mounted: function() {

}

}
</script>
style
css ?VBAdmin-UI<style lang="less">
@import (reference) "../../../assets/lib/css.less";
.timerout:disabled {
&,
&:hover,
&:focus {
.bgc(@cbla);
color: @cwh;
}
}
</style>
?
下载地址如下: 查看全部

短信验证 现在是市面上比较流行的一种验证方式,最近公司的项目有涉及到故整体如下


?
JQ版本
?
js
sendMsm: function(wait, objectb) {
var time = wait;
if(time == 0) {
$(objectb).removeAttr("disabled");
$(objectb).text("获取验证码");
$(objectb).removeClass('hidden');
$(objectb).next().addClass('hidden');
time = wait;
} else {
$(objectb).attr("disabled", true);
$(objectb).addClass('hidden');
$(objectb).next().removeClass('hidden').text(time + " s 后重发");
time--;
setTimeout(function() {
qdcms.sendMsm(time, objectb);
}, 1000)
}
}




html
<a class="btn btn-black" onclick="qdcms.getcode(60,this)">获取验证码</a>
<span class="btn btn-black disabled hidden"></span>
css
VBAdmin-UI
?
预览地址:https://www.tfstock.com.cn/?点击注册按钮
?
?
Vue 实现
?
template
<template>
<button class="timerout" :disabled="disabled || time > 0" @click='run'>
{{ text }}
</button>
</template>
script
<script>
export default {
name: 'timerbtn',
props: {
second: {
type: Number,
default: 60
},
disabled: {
type: Boolean,
default: false
}
},
data: function() {
return {
time: 0
}
},
methods: {
run() {
this.time = this.second;
this.timer();
},
timer() {
if(this.time > 0) {
this.time--;
setTimeout(this.timer, 1000);
}
}
},
computed: {
text() {
return this.time > 0 ? this.time + 's 后重新获取' : '点击获取验证码';
}
},
mounted: function() {

}

}
</script>

style
css ?VBAdmin-UI
<style lang="less">
@import (reference) "../../../assets/lib/css.less";
.timerout:disabled {
&,
&:hover,
&:focus {
.bgc(@cbla);
color: @cwh;
}
}
</style>

?
下载地址如下:

vue项目中引用bootstrap 的方法

lopo1983 发表了文章 • 0 个评论 • 2215 次浏览 • 2017-06-23 23:22 • 来自相关话题

vue 和 bootstrap 作为前端中 js 和css 框架中的佼佼者 二者结合肯定能蹦出不一样的火花!!
废话不多说 直接上代码
vue 环境搭建
1 环境搭建?http://bsfans.com/wenda/?/article/53
2 Vue-cli 打包?http://bsfans.com/wenda/?/article/54
?
build>webpack.base.conf.jsvar webpack=require('webpack');module.exports里面加入plugins: [
new webpack.ProvidePlugin({
$:"jquery",
jQuery:"jquery",
"windows.jQuery":"jquery"
})
]main.js ?全局引入JQ
(其实这里你应该拒绝的 但是不排除一下吧下改变不了习惯的 )
import $ from 'jquery'
开始引入bootstrap
?
build>webpack.base.conf.js
?alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
'assets': path.resolve(__dirname, '../src/assets'),
'jquery': "jquery/src/jquery"
} main.jsimport './assets/css/bootstrap.min.css'
import './assets/js/bootstrap.min'
?
已经打算暂时不使用jq 全心投入mvvm的同学请取消相关jq的配置即可 查看全部

vue 和 bootstrap 作为前端中 js 和css 框架中的佼佼者 二者结合肯定能蹦出不一样的火花!!


废话不多说 直接上代码
vue 环境搭建
1 环境搭建?http://bsfans.com/wenda/?/article/53
2 Vue-cli 打包?http://bsfans.com/wenda/?/article/54
?
build>webpack.base.conf.js
var webpack=require('webpack');
module.exports里面加入
plugins: [ 
new webpack.ProvidePlugin({
$:"jquery",
jQuery:"jquery",
"windows.jQuery":"jquery"
})
]
main.js ?全局引入JQ

(其实这里你应该拒绝的 但是不排除一下吧下改变不了习惯的 )


import $ from 'jquery'

开始引入bootstrap
?
build>webpack.base.conf.js
?
alias: { 
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
'assets': path.resolve(__dirname, '../src/assets'),
'jquery': "jquery/src/jquery"
}
main.js
import './assets/css/bootstrap.min.css'
import './assets/js/bootstrap.min'

?
已经打算暂时不使用jq 全心投入mvvm的同学请取消相关jq的配置即可

window.open 被拦截 解决方案

lopo1983 发表了文章 • 0 个评论 • 2274 次浏览 • 2017-06-23 22:49 • 来自相关话题

项目中 用axios 请求支付并跳转到支付页面 使用window.open会被chrome 等高级浏览器拦截
网上搜了下 找了一个可行的方案?surePay() {
this.showcontent = true;
let newTab=window.open('about:blank');
api.pay(this.refsend.type,this.refsend.money).then(response => {
if(response.success&&response.data) {
newTab.location.href = 'http://'+response.data
} else {
window.alert("非法操作");
}
});
} 查看全部
项目中 用axios 请求支付并跳转到支付页面 使用window.open会被chrome 等高级浏览器拦截
网上搜了下 找了一个可行的方案?
surePay() {
this.showcontent = true;
let newTab=window.open('about:blank');
api.pay(this.refsend.type,this.refsend.money).then(response => {
if(response.success&&response.data) {
newTab.location.href = 'http://'+response.data
} else {
window.alert("非法操作");
}
});
}

vue-form(vue表单验证插件 vue2.2+) 使用指南

lopo1983 发表了文章 • 0 个评论 • 3696 次浏览 • 2017-06-13 10:40 • 来自相关话题

vue-form 是一个在vue 中用于表单验证的插件 目前版本为4.1.1 ??Form validation for?Vue.js 2.2+
官网地址:https://github.com/fergaldoyle/vue-form
1.安装import VueForm from 'vue-form';
// install globally
Vue.use(VueForm);
Vue.use(VueForm, options);
// or use the mixin ...
mixins: [VueForm]
...
mixins: [new VueForm(options)]
...
2.案例
使用bootstrap样式的案例?https://jsfiddle.net/fergal_doyle/zfqt4yhq/
密码验证的案例https://jsfiddle.net/fergal_doyle/9rn5kLkw/
3.使用方法
template: <vue-form :state="formstate" @submit.prevent="onSubmit">

<validate tag="label">
<span>Name *</span>
<input v-model="model.name" required name="name" />

<field-messages name="name">
<div>Success!</div>
<div slot="required">Name is a required field</div>
</field-messages>
</validate>

<validate tag="label">
<span>Email</span>
<input v-model="model.email" name="email" type="email" required />

<field-messages name="email">
<div slot="required">Email is a required field</div>
<div slot="email">Email is not valid</div>
</field-messages>
</validate>

<button type="submit">Submit</button>
</vue-form>
scriptdata(){
return{
formstate: {},
model: { name: '', email: 'invalid-email' } },
}
methods: {
onSubmit: function () {
if(this.formstate.$invalid) {
// alert user and exit early
return;
}
// otherwise submit form
}
}
vue 中可直接通过FormData的方式提交数据 要获取该表单的所有数据 可给vue-form 添加ref属性来获取?let def = this.$refs.sendinfo.$el;
验证信 息显示
该插件使用field-messages标签来定义验证正确和错误的文字或其他形式的提示内容
show 表示表单在何种状态下开始验证 vue-form 内置有$dirty,?$dirty && $touched,?$dirty || $touched,?$touched || $submitted
示例:<field-messages name="name" show="$dirty && $touched">
<div slot="errorKeyA">Error message A</div>
<div slot="errorKeyB">Error message B</div>
</field-messages>
使用scope template<field-messages name="fieldName">
<span>Success</span>
<template slot="required" scope="state">
<span v-if="state.$touched || state.$submitted">Name is a required field</span>
</template>
<template slot="errorKeyB" scope="state">
<span v-if="state.$touched || state.$dirty">Error message B</span>
</template>
</field-messages>
vue-form Validators
默认自带验证类型type="email"
type="url"
type="number"
required
minlength
maxlength
pattern
min (for type="number")
max (for type="number")
使用方法<!-- static validators -->
<validate>
<input type="email" name="email" v-model="model.email" required />
</validate>
<validate>
<input type="text" name="name" v-model="model.name" maxlength="25" minlength="5" />
</validate>

<!-- bound validators -->
<validate>
<input type="email" name="email" v-model="model.email" :required="isRequired" />
</validate>
<validate>
<input type="text" name="name" v-model="model.name" :maxlength="maxLen" :minlength="minLen" />
</validate>
自定义验证
你可以全局或者局部注册自定义验证
全部注册var options = {
validators: {
'my-custom-validator': function (value, attrValue, vnode) {
// return true to set input as $valid, false to set as $invalid
return value === 'custom';
}
}
}

Vue.use(VueForm, options);
// or
mixins: [new VueForm(options)]<validate>
<input v-model="something" name="something" my-custom-validator />
</validate>局部注册<validate :custom="{customValidator: customValidator}">
<input v-model="something" name="something" />
</validate>// ...
methods: {
customValidator: function (value) {
// return true to set input as $valid, false to set as $invalid
return value === 'custom';
}
}
// ...Async 验证methods: {
debounced: _.debounce(function (value, resolve, reject) {
fetch('https://httpbin.org/get').then(function(response){
resolve(response.isValid);
});
}, 500),
customValidator (value) {
return new Promise((resolve, reject) => {
this.debounced(value, resolve, reject);
});
}
}重置验证<vue-form ref="form" :state="formstate">

resetState: function () {
this.formstate._reset();
// or
this.$refs.form.reset();
}
未完待续..... 查看全部

vue-form 是一个在vue 中用于表单验证的插件 目前版本为4.1.1 ??Form validation for?Vue.js 2.2+


官网地址:https://github.com/fergaldoyle/vue-form


1.安装
import VueForm from 'vue-form'; 
// install globally
Vue.use(VueForm);
Vue.use(VueForm, options);
// or use the mixin ...
mixins: [VueForm]
...
mixins: [new VueForm(options)]
...

2.案例
使用bootstrap样式的案例?https://jsfiddle.net/fergal_doyle/zfqt4yhq/
密码验证的案例https://jsfiddle.net/fergal_doyle/9rn5kLkw/
3.使用方法
template:
  <vue-form :state="formstate" @submit.prevent="onSubmit">

<validate tag="label">
<span>Name *</span>
<input v-model="model.name" required name="name" />

<field-messages name="name">
<div>Success!</div>
<div slot="required">Name is a required field</div>
</field-messages>
</validate>

<validate tag="label">
<span>Email</span>
<input v-model="model.email" name="email" type="email" required />

<field-messages name="email">
<div slot="required">Email is a required field</div>
<div slot="email">Email is not valid</div>
</field-messages>
</validate>

<button type="submit">Submit</button>
</vue-form>

script
data(){
return{
formstate: {},
model: { name: '', email: 'invalid-email' } },
}
methods: {
onSubmit: function () {
if(this.formstate.$invalid) {
// alert user and exit early
return;
}
// otherwise submit form
}
}

vue 中可直接通过FormData的方式提交数据 要获取该表单的所有数据 可给vue-form 添加ref属性来获取?let def = this.$refs.sendinfo.$el;


验证信 息显示
该插件使用field-messages标签来定义验证正确和错误的文字或其他形式的提示内容
show 表示表单在何种状态下开始验证 vue-form 内置有$dirty,?$dirty && $touched,?$dirty || $touched,?$touched || $submitted
示例:
<field-messages name="name" show="$dirty && $touched">
<div slot="errorKeyA">Error message A</div>
<div slot="errorKeyB">Error message B</div>
</field-messages>

使用scope template
<field-messages name="fieldName">
<span>Success</span>
<template slot="required" scope="state">
<span v-if="state.$touched || state.$submitted">Name is a required field</span>
</template>
<template slot="errorKeyB" scope="state">
<span v-if="state.$touched || state.$dirty">Error message B</span>
</template>
</field-messages>

vue-form Validators
默认自带验证类型
type="email"
type="url"
type="number"
required
minlength
maxlength
pattern
min (for type="number")
max (for type="number")

使用方法
<!-- static validators -->
<validate>
<input type="email" name="email" v-model="model.email" required />
</validate>
<validate>
<input type="text" name="name" v-model="model.name" maxlength="25" minlength="5" />
</validate>

<!-- bound validators -->
<validate>
<input type="email" name="email" v-model="model.email" :required="isRequired" />
</validate>
<validate>
<input type="text" name="name" v-model="model.name" :maxlength="maxLen" :minlength="minLen" />
</validate>

自定义验证
你可以全局或者局部注册自定义验证
全部注册
var options = {
validators: {
'my-custom-validator': function (value, attrValue, vnode) {
// return true to set input as $valid, false to set as $invalid
return value === 'custom';
}
}
}

Vue.use(VueForm, options);
// or
mixins: [new VueForm(options)]
<validate>
<input v-model="something" name="something" my-custom-validator />
</validate>
局部注册
<validate :custom="{customValidator: customValidator}">
<input v-model="something" name="something" />
</validate>
// ...
methods: {
customValidator: function (value) {
// return true to set input as $valid, false to set as $invalid
return value === 'custom';
}
}
// ...
Async 验证
methods: {
debounced: _.debounce(function (value, resolve, reject) {
fetch('https://httpbin.org/get').then(function(response){
resolve(response.isValid);
});
}, 500),
customValidator (value) {
return new Promise((resolve, reject) => {
this.debounced(value, resolve, reject);
});
}
}
重置验证
<vue-form ref="form" :state="formstate">

resetState: function () {
this.formstate._reset();
// or
this.$refs.form.reset();
}

未完待续.....

vue前后端分离解决

yangyulu 发表了文章 • 0 个评论 • 2537 次浏览 • 2017-05-19 16:12 • 来自相关话题

看了很多vue的项目,基本都是用mock来做模拟数据,实际开发中,对于与实际接口的交互,就成了很大的阻碍。本demo以实际的后端接口做交互。前端用vue-cli脚手架加上elementUI组件,后端用基于Java的springmvc+mybatis+mysql+shiro的一个权限管理的demo。 查看全部
看了很多vue的项目,基本都是用mock来做模拟数据,实际开发中,对于与实际接口的交互,就成了很大的阻碍。本demo以实际的后端接口做交互。前端用vue-cli脚手架加上elementUI组件,后端用基于Java的springmvc+mybatis+mysql+shiro的一个权限管理的demo。

vue 注册共用filter

lopo1983 发表了文章 • 0 个评论 • 1366 次浏览 • 2017-04-28 16:43 • 来自相关话题

import filters from './utils/filters'Object.keys(filters).forEach(k => Vue.filter(k, filters[k]))
import filters from './utils/filters'
Object.keys(filters).forEach(k => Vue.filter(k, filters[k]))

百度BOS 上传 Vue 2.x封装

lopo1983 发表了文章 • 0 个评论 • 1963 次浏览 • 2017-04-19 18:28 • 来自相关话题

template
<div class="fileup">
<input type="file" ref="fileup" multiple="multiple" class="hide" name="fileUp" :id="rdid" @change="onFileChange" />
<label class="btn btn-ces" :for="rdid"><span class="iconfont icon-add"></span>选择文件</label>
<span>{{infomsg}}</span>
<div class="fileup-area" v-show="files.length">
<div class="col-md-2 files" v-for="(item,index) in files">
<div class="thumbnail">
<div class="thumbnail-object" :style="{'background-image':`url(${item.src})`}">
<a class="ctr-bar" @click="delFile(index,item.key,item.status)">
<span class="iconfont icon-del"></span>
</a>
</div>
<div class="caption">
<p class="name">{{item.name}}</p>
<span class="iconfont icon-zhengque text-success" v-if="item.status==2"></span>
<bsf-progress :state="item.progress" v-if="item.progress<100"></bsf-progress>
</div>
</div>
</div>
</div>
<p class="btn-mix" v-if="files.length>0">
<a class="btn btn-ces" @click="sendFile">提交</a>
<a class="btn btn-default" @click="clearFile">取消</a>
</p>
</div>
javascript
import bos from '@/assets/js/bce-sdk-js/baidubce-sdk.bundle'
import lib from "@/assets/js/lib"
import bsfProgress from '@/components/comp/progress'
import { bosConfig, bucket } from '@/config/bos'
let client = new baidubce.sdk.BosClient(bosConfig);
export default {
name: "bosupt",
components: {
bsfProgress
},
props: {
maxlength: {
type: Number,
default: 3
},
maxSize: {
type: Number,
default: 50000
}
},
data() {
return {
files: [],
infomsg:""
}
},
computed: {
rdid() {
return "up" + Math.ceil(Math.random() * 1000, 3);
}
},
methods: {
onFileChange(evt) {
let files = evt.target.files;
let _this = this;
if(files.length) {
for(let i = 0, len = files.length; i < len; i++) {
let file = files[i];
let fcobj = {
type: file.name.substring(file.name.lastIndexOf('.')).toLowerCase(),
key: lib.randomStr(false, 5)
};
let o = {
file: file, // File 对象
status: 0, // 0:未上传 1:正在上传:2上传成功 3:上传失败
progress: 0, // 上传进度
type: fcobj.type,
key: fcobj.key,
name: file.name,
size: file.size,
path: "http://" + bucket + ".bj.bcebos.com/" + fcobj.key + fcobj.type
};
let reader = new FileReader()
reader.readAsDataURL(file);
reader.onload = (e) => {
o.src = e.target.result // base64 可以作为判断是不是存在相同文件
if(this.files.findIndex(f => f.src == o.src) > -1) {
return false
}
if(o.size <= _this.maxSize) {
this.files.push(o)
} else {
this.infomsg="图片太大了哦"
return false
}
};
};
}
Array.from(this.files).slice(0, this.maxlength)
},
delFile(index, key, status) {
if(status == 2) {
client.deleteObject(bucket, key).then(e => {
e && this.files.splice(index, 1);
}).catch(e => {
console.log(e)
})
} else {
this.files.splice(index, 1);
}
},
clearFile() {
let files = this.files;
this.files = [];
let ar = []
this.$refs.fileup.value = "";
this.$emit('clearfile', ar)
},
sendFile() {
this.files.forEach(o => {
if(o.status == 0) {
let file = o.file
let blob = file;
let keytext = o.type;
let key = o.key + keytext;
const ext = key.split(/\./g).pop();
let mimeType = baidubce.sdk.MimeType.guess(ext);
if(/^text\//.test(mimeType)) {
mimeType += '; charset=UTF-8';
}
let options = {
'Content-Type': mimeType
};
client.putObjectFromBlob(bucket, key, blob, options)
.then(function(res) {})
.catch(function(err) {
console.error(err);
});
client.on('progress', function(evt) {
if(evt.lengthComputable) {
o.progress = (evt.loaded / evt.total) * 100;
o.status = 2;
}
});
}
});
let ar = []
this.files.forEach(e => {
ar.push(e.path)
});
this.$emit('sendfile', ar)
}
},
mounted: function() {
this.$nextTick(function() {

})
}
}
BOS 配置
bos.js
const bosConfig = {
credentials: {
ak: '',
sk: ''
},
endpoint: 'http://bj.bcebos.com'
}
const bucket = 'bucket名称';
export{bosConfig,bucket}
感谢戏子大爷 查看全部
template
<div class="fileup">
<input type="file" ref="fileup" multiple="multiple" class="hide" name="fileUp" :id="rdid" @change="onFileChange" />
<label class="btn btn-ces" :for="rdid"><span class="iconfont icon-add"></span>选择文件</label>
<span>{{infomsg}}</span>
<div class="fileup-area" v-show="files.length">
<div class="col-md-2 files" v-for="(item,index) in files">
<div class="thumbnail">
<div class="thumbnail-object" :style="{'background-image':`url(${item.src})`}">
<a class="ctr-bar" @click="delFile(index,item.key,item.status)">
<span class="iconfont icon-del"></span>
</a>
</div>
<div class="caption">
<p class="name">{{item.name}}</p>
<span class="iconfont icon-zhengque text-success" v-if="item.status==2"></span>
<bsf-progress :state="item.progress" v-if="item.progress<100"></bsf-progress>
</div>
</div>
</div>
</div>
<p class="btn-mix" v-if="files.length>0">
<a class="btn btn-ces" @click="sendFile">提交</a>
<a class="btn btn-default" @click="clearFile">取消</a>
</p>
</div>

javascript
import bos from '@/assets/js/bce-sdk-js/baidubce-sdk.bundle'
import lib from "@/assets/js/lib"
import bsfProgress from '@/components/comp/progress'
import { bosConfig, bucket } from '@/config/bos'
let client = new baidubce.sdk.BosClient(bosConfig);
export default {
name: "bosupt",
components: {
bsfProgress
},
props: {
maxlength: {
type: Number,
default: 3
},
maxSize: {
type: Number,
default: 50000
}
},
data() {
return {
files: [],
infomsg:""
}
},
computed: {
rdid() {
return "up" + Math.ceil(Math.random() * 1000, 3);
}
},
methods: {
onFileChange(evt) {
let files = evt.target.files;
let _this = this;
if(files.length) {
for(let i = 0, len = files.length; i < len; i++) {
let file = files[i];
let fcobj = {
type: file.name.substring(file.name.lastIndexOf('.')).toLowerCase(),
key: lib.randomStr(false, 5)
};
let o = {
file: file, // File 对象
status: 0, // 0:未上传 1:正在上传:2上传成功 3:上传失败
progress: 0, // 上传进度
type: fcobj.type,
key: fcobj.key,
name: file.name,
size: file.size,
path: "http://" + bucket + ".bj.bcebos.com/" + fcobj.key + fcobj.type
};
let reader = new FileReader()
reader.readAsDataURL(file);
reader.onload = (e) => {
o.src = e.target.result // base64 可以作为判断是不是存在相同文件
if(this.files.findIndex(f => f.src == o.src) > -1) {
return false
}
if(o.size <= _this.maxSize) {
this.files.push(o)
} else {
this.infomsg="图片太大了哦"
return false
}
};
};
}
Array.from(this.files).slice(0, this.maxlength)
},
delFile(index, key, status) {
if(status == 2) {
client.deleteObject(bucket, key).then(e => {
e && this.files.splice(index, 1);
}).catch(e => {
console.log(e)
})
} else {
this.files.splice(index, 1);
}
},
clearFile() {
let files = this.files;
this.files = [];
let ar = []
this.$refs.fileup.value = "";
this.$emit('clearfile', ar)
},
sendFile() {
this.files.forEach(o => {
if(o.status == 0) {
let file = o.file
let blob = file;
let keytext = o.type;
let key = o.key + keytext;
const ext = key.split(/\./g).pop();
let mimeType = baidubce.sdk.MimeType.guess(ext);
if(/^text\//.test(mimeType)) {
mimeType += '; charset=UTF-8';
}
let options = {
'Content-Type': mimeType
};
client.putObjectFromBlob(bucket, key, blob, options)
.then(function(res) {})
.catch(function(err) {
console.error(err);
});
client.on('progress', function(evt) {
if(evt.lengthComputable) {
o.progress = (evt.loaded / evt.total) * 100;
o.status = 2;
}
});
}
});
let ar = []
this.files.forEach(e => {
ar.push(e.path)
});
this.$emit('sendfile', ar)
}
},
mounted: function() {
this.$nextTick(function() {

})
}
}

BOS 配置
bos.js
const bosConfig = {
credentials: {
ak: '',
sk: ''
},
endpoint: 'http://bj.bcebos.com'
}
const bucket = 'bucket名称';
export{bosConfig,bucket}

感谢戏子大爷

vue-cli打包

lopo1983 发表了文章 • 0 个评论 • 1740 次浏览 • 2017-04-15 17:00 • 来自相关话题

1.要是项目直接放网站根目录 直接npm run build2.放到指定目录
? 修改:config/index.jsbuild: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/XXX/', // 项目发布的目录
...
},3.放任意目录
? 修改:config/index.jsbuild: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: './',
...
},4.修改js/css打包名称
build/webpack.prod.conf.js output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[hash].js'),
chunkFilename: utils.assetsPath('js/[id].[hash].js')
},
[name]:名称
[id]:懒加载编号
[hash] 随机码(项目正式上线可删除) new ExtractTextPlugin({
filename: utils.assetsPath('css/[name][hash].css')
}),name:名称
hash 随机码 查看全部
1.要是项目直接放网站根目录 直接
npm run build
2.放到指定目录
? 修改:config/index.js
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/XXX/', // 项目发布的目录
...
},
3.放任意目录
? 修改:config/index.js
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: './',
...
},
4.修改js/css打包名称
build/webpack.prod.conf.js
  output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[hash].js'),
chunkFilename: utils.assetsPath('js/[id].[hash].js')
},
[name]:名称
[id]:懒加载编号
[hash] 随机码(项目正式上线可删除)
    new ExtractTextPlugin({
filename: utils.assetsPath('css/[name][hash].css')
}),
name:名称
hash 随机码

VUE 开发环境搭建

lopo1983 发表了文章 • 0 个评论 • 1990 次浏览 • 2017-04-15 16:05 • 来自相关话题

安装Node.js
.......忽略点点 自己百度?
安装淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org 安装vue-cil
cnpm install -g vue-cli 切换到你的项目目录如www
cd www新建vue项目
vue init webpack demo01 一路回车(第4步ESLint 可以一路n,大师请忽略n)
?
进入新建项目
cd demo01 cnpm?install?

npm run dev
?
? 查看全部
安装Node.js
.......忽略点点 自己百度
?
安装淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org 
安装vue-cil
cnpm install -g vue-cli  
切换到你的项目目录如www
cd www
新建vue项目
vue init webpack demo01 
一路回车(第4步ESLint 可以一路n,大师请忽略n)
?
进入新建项目
cd demo01 
cnpm?install?

npm run dev

?
?

vue 滚动到底部

lopo1983 发表了文章 • 0 个评论 • 3098 次浏览 • 2017-04-13 03:04 • 来自相关话题

template<div class="mix" ref="chatbox">....</div>
datadata() {
return {
userMsg:
}
}
?
?
methodsgoBottom(e) {
e.scrollTop = e.scrollHeight
}mounted(如果需要进入就滚动)mounted: function() {
this.$nextTick(function() {
let e = this.$refs.chatbox;
this.goBottom(e);
})
}
watch(如果响应)watch: {
userMsg() {
this.$nextTick(() => {
let e = this.$refs.chatbox;
this.goBottom(e);
})
}
}?
?
<-------------------------------------------------邪恶分割线------------------------------------------------>
?
?
以上的代码完全可忽略 因为出现了 邪恶分割线
?
CSS3 FLEX 布局解决display: flex;
flex-flow: column-reverse;
align-items: baseline; 查看全部
template
<div class="mix" ref="chatbox">....</div>

data
data() {
return {
userMsg:
}
}

?
?
methods
goBottom(e) {
e.scrollTop = e.scrollHeight
}
mounted(如果需要进入就滚动)
mounted: function() {
this.$nextTick(function() {
let e = this.$refs.chatbox;
this.goBottom(e);
})
}

watch(如果响应)
watch: {
userMsg() {
this.$nextTick(() => {
let e = this.$refs.chatbox;
this.goBottom(e);
})
}
}
?
?
<-------------------------------------------------邪恶分割线------------------------------------------------>
?
?
以上的代码完全可忽略 因为出现了 邪恶分割线
?
CSS3 FLEX 布局解决
display: flex;
flex-flow: column-reverse;
align-items: baseline;