diff --git a/README.md b/README.md
index a6df436..4a3e936 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,18 @@
> 持续更新中...
+> 2017.8.31更新内容:
+1.名片分组
+2.删除名片功能
+3.快捷拨打电话
+4.识别名片
+5.将名片保存于CRM系统
+6.查看名片详情
+7.编辑名片信息可更新
+8.可查看公司工商信息
+
+
+
## 技术栈
* vue-cli: 快速构建vue单页应用的脚手架
diff --git a/config/index.js b/config/index.js
index 6068c3d..03371c5 100644
--- a/config/index.js
+++ b/config/index.js
@@ -27,7 +27,15 @@ module.exports = {
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
- proxyTable: {},
+ proxyTable: {
+ // '/api': {
+ // target: 'http://v.juhe.cn/youshu',
+ // changeOrigin: true,
+ // pathRewrite: {
+ // '^/api': ''
+ // }
+ // }
+ },
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
diff --git a/index.html b/index.html
index 7be3208..602338e 100644
--- a/index.html
+++ b/index.html
@@ -2,7 +2,7 @@
- Vue+MuseUI+Node
+
@@ -12,10 +12,7 @@
-
-
-
-
+
diff --git a/package.json b/package.json
index 525eacd..fd060e8 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,10 @@
},
"dependencies": {
"axios": "^0.16.2",
+ "exif-js": "^2.2.1",
"fastclick": "^1.0.6",
+ "jsonp": "^0.2.1",
+ "material-design-icons": "^3.0.1",
"mint-ui": "^2.2.9",
"muse-ui": "^2.0.3",
"pinyin": "^2.8.3",
diff --git a/src/App.vue b/src/App.vue
index 86aa392..1101611 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -12,6 +12,8 @@
+
+
@@ -30,11 +32,18 @@
components: {
topNav,
bottomTab
+ },
+ computed: {
+ ...mapState(['toast', 'toastMsg'])
}
}
+
diff --git a/src/components/common/businesscard.vue b/src/components/common/businesscard.vue
index 8d6108a..3f65c66 100644
--- a/src/components/common/businesscard.vue
+++ b/src/components/common/businesscard.vue
@@ -13,11 +13,12 @@
@@ -48,7 +49,7 @@
diff --git a/src/components/details/result.vue b/src/components/details/result.vue
new file mode 100644
index 0000000..bfef51a
--- /dev/null
+++ b/src/components/details/result.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+ 分组
+ 全部
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/home/home.vue b/src/components/home/home.vue
index c6dfe1a..60dfb80 100644
--- a/src/components/home/home.vue
+++ b/src/components/home/home.vue
@@ -4,25 +4,19 @@
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
@@ -31,16 +25,17 @@
+
-
-
+
+
-
+
- -
+
-
{{key}}
@@ -51,25 +46,90 @@
-
-
+
+ 共有
+
+ 张名片
+
+
{{ currentIndicator }}
+
+
+
+
+ 您还没有名片,赶紧扫一张吧~
+
+
+
+
+
- 确定删除此条信息吗?
+ 确定删除此名片吗?
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/home/swipeDelete.vue b/src/components/home/swipeDelete.vue
deleted file mode 100644
index b13516f..0000000
--- a/src/components/home/swipeDelete.vue
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/components/search/search.vue b/src/components/search/search.vue
index f43c806..ec3b989 100644
--- a/src/components/search/search.vue
+++ b/src/components/search/search.vue
@@ -17,13 +17,23 @@
@click="search"/>
-
+
+
+
+
+
{{searchInfo}}
-
diff --git a/src/main.js b/src/main.js
index b9f5ae3..f74285b 100644
--- a/src/main.js
+++ b/src/main.js
@@ -6,6 +6,7 @@ import App from './App'
import FastClick from 'fastclick'
import router from './router'
import store from './vuex/store'
+// import iconfont from 'material-design-icons/iconfont'
import MuseUi from './muse-ui.config'
// import 'mint-ui/lib/style.css'
@@ -19,7 +20,6 @@ import 'muse-ui/dist/theme-carbon.css'
import './common/css/base.css'
Vue.use(MuseUi)
-// Vue.use(MintUi)
import VueLazyload from 'vue-lazyload'
@@ -64,7 +64,6 @@ new Vue({
components: {App},
// 组件创建前,请求用户数据
beforeCreate() {
- // this.$store.dispatch('getAllData', this)
this.$store.dispatch('getSFBusinessCard', this)
}
})
diff --git a/src/muse-ui.config.js b/src/muse-ui.config.js
index 56bb628..eca062b 100644
--- a/src/muse-ui.config.js
+++ b/src/muse-ui.config.js
@@ -6,6 +6,7 @@ import appBar from 'muse-components/appBar'
import avatar from 'muse-components/avatar'
import badge from 'muse-components/badge'
import dialog from 'muse-components/dialog'
+import toast from 'muse-components/toast'
import * as card from 'muse-components/card'
import * as menu from 'muse-components/menu'
import iconMenu from 'muse-components/iconMenu'
@@ -17,6 +18,7 @@ import refreshControl from 'muse-components/refreshControl'
import * as bottomNav from 'muse-components/bottomNav'
import flatButton from 'muse-components/flatButton'
import floatButton from 'muse-components/floatButton'
+import raisedButton from 'muse-components/raisedButton'
import iconButton from 'muse-components/iconButton'
import chip from 'muse-components/chip'
import drawer from 'muse-components/drawer'
@@ -24,7 +26,10 @@ import icon from 'muse-components/icon'
import * as list from 'muse-components/list'
import textField from 'muse-components/textField'
import * as tabs from 'muse-components/tabs'
+import * as grid from 'muse-components/grid'
import divider from 'muse-components/divider'
+import * as flexBox from 'muse-components/flexBox'
+import contentBlock from 'muse-components/contentBlock'
import subHeader from 'muse-components/subHeader'
// 这个模块在项目官网上并没有看到,但是看到作者在issues上回答时说是高分辨率屏的处理,于是就试着加进去了
import {retina} from 'muse-components/utils'
@@ -34,20 +39,25 @@ const components = {
avatar,
badge,
dialog,
+ toast,
...card,
...menu,
iconMenu,
dropDownMenu,
...gridList,
circularProgress,
+ linearProgress,
refreshControl,
...bottomNav,
flatButton,
floatButton,
+ raisedButton,
iconButton,
chip,
+ contentBlock,
drawer,
icon,
+ ...grid,
...list,
textField,
...tabs,
diff --git a/src/router/index.js b/src/router/index.js
index b5ff931..8694177 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -1,28 +1,29 @@
import Vue from 'vue'
import Router from 'vue-router'
-import store from '../vuex/store'
+// import store from '../vuex/store'
+
// 注册router组件
Vue.use(Router)
// 导入组件
import home from '../components/home/home.vue'
import search from '../components/search/search.vue'
+import result from '../components/details/result.vue'
import details from '../components/details/details.vue'
import discover from '../components/discover/discover.vue'
import group from '../components/group/group.vue'
+import businessdata from '../components/business/businessdata.vue'
let routes = [
- {
- path: '/home', name: 'home', component: home,
- },
+ {path: '/home', name: 'home', component: home},
{path: '/search', name: 'search', component: search},
+ {path: '/result', name: 'result', component: result},
{path: '/details', name: 'details', component: details},
- {
- path: '/discover', name: 'discover', component: discover
- },
- {path: '/group', name: 'group', component: group}
+ {path: '/discover', name: 'discover', component: discover},
+ {path: '/group', name: 'group', component: group},
+ {path: '/business', name: 'businessdata', component: businessdata}
]
export default new Router({
- mode: 'history',
+ mode: process.env.NODE_ENV === 'development' ? 'history' : 'hash',
routes
})
diff --git a/src/vuex/actions.js b/src/vuex/actions.js
index 12c42c4..f8a46b1 100644
--- a/src/vuex/actions.js
+++ b/src/vuex/actions.js
@@ -2,43 +2,256 @@
* Created by Sugar on 2017/5/17.
*/
+import router from './../router'
+import axios from 'axios'
+import jsonp from 'jsonp'
+
// actions里存放的是异步操作
// 由于vuex中的state的变更只能由mutations进行操作,所以actions不直接进行数据操作,而是调用mutations方法
// 以下出现的that都是vue实例对象,因为把axios绑定在了Vue原型上,vuex无法调用,所以这里需要传入this
const actions = {
// 异步获取基础数据
// 这里使用了es7的async函数,相当于封装了promis的generator
- getAllData: async ({commit}, that) => {
- let self = {}
- let friends = {}
+ // 获取名片列表
+ getSFBusinessCard: async ({dispatch, commit}) => {
+ let records = [];
- await that.$http.get('/api/self').then(({data}) => {
- self = data.data
- })
+ // let url = "select new_name,new_comp,new_mobile from new_card where new_memberid='" + context.OpenId + "'"
+ let url = "select new_name,new_comp,new_mobile,_new_group_value from new_card"
+ await client.query(url, (data) => {
+ console.log("名片数据", data.value);
+ records = data.value;
+ }, (error) => {
+ console.log(error);
+ });
- await that.$http.get('/api/friends').then(({data}) => {
- friends = data.data
- })
+ await dispatch('getGroupList')
- commit('getData', {self, friends})
+ commit('getBCData', {records: records})
},
- // 测试请求SF接口
- getSFBusinessCard: async ({commit}, that) => {
- let records = [];
+ // 获取名片分组
+ getGroupList: async ({commit}) => {
+ let groups = []
+ await client.query("select new_groupid,new_name from new_group", (data) => {
+ console.log("获取分组成功", data);
+ groups = data.value && data.value.length > 0 ? data.value : []
+ }, (error) => {
+ console.log("获取分组失败", error);
+ });
- // await that.$http.get('/api/getBusinessCard').then(({data}) => {
- // bc = JSON.parse(data.data);
- // })
- let memberid = '9987b011-217b-e711-81ca-0248aae46430';
- let url = "select new_name,new_mobile,new_email,new_comp,new_dept from new_card where new_memberid='" + memberid + "'"
- await client.query(url, function (data) {
- console.log("名片数据", data.value);
- records = data.value;
- }, function (error) {
+ commit('getGroups', {groups})
+ },
+ // 识别名片
+ getScanResult: async ({dispatch, commit, state}, {file, that}) => {
+ let results = {};
+
+ // 显示识别中的loading
+ state.isScan = true;
+
+ await axios({
+ url: 'https://netocr.com/api/recog.do',
+ method: 'post',
+ data: {
+ file: file,
+ key: 'CuJSU2hs3ex2cQ39KzXpsC',
+ secret: '5af14827d6854a82a397009d928d33cc',
+ typeId: 20,
+ format: 'json'
+ },
+ transformRequest: [function (data) {
+ // Do whatever you want to transform the data
+ var ret = new FormData();
+ ret.append('file', data.file);
+ ret.append('key', data.key);
+ ret.append('secret', data.secret);
+ ret.append('typeId', data.typeId);
+ ret.append('format', data.format);
+ return ret
+ }],
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ }
+ }).then((res) => {
+ console.log('名片识别成功', res.data);
+ if (res.data.message.status == '0') {
+ let rs = res.data.cardsinfo[0].items;
+
+ for (let i = 0; i < rs.length; i++) {
+ let item = rs[i];
+ let index = item.index;
+ let nId = item.nID;
+ let content = item.content;
+ if (index == "0") {
+ switch (nId) {
+ case "0"://姓名
+ results.new_name = content;
+ break;
+ case "1"://职务部门
+ results.new_dept = content;
+ break;
+ case "2"://手机
+ results.new_mobile = content;
+ break;
+ case "3"://公司
+ results.new_comp = content;
+ break;
+ case "4"://地址
+ results.new_addr = content;
+ break;
+ case "5"://电话
+ results.new_tel = content;
+ break;
+ case "6"://传真
+ results.new_fax = content;
+ break;
+ case "7"://邮箱
+ results.new_email = content;
+ break;
+ case "8"://网址
+ results.new_fax = content;
+ break;
+ case "9"://邮编
+ results.new_post = content;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ console.log(results);
+ commit('getCardScanResult', {results: results})
+ router.push('result')
+ commit('showToast', {msg: '识别成功'})
+ // dispatch('saveCardResult', {cardResult: results})
+ } else {
+ commit('showToast', {msg: '识别失败,请重试'})
+ }
+ state.isScan = false
+ });
+
+ },
+ // 更新名片详情信息
+ updateCardDetails: async ({commit}, {id, details}) => {
+ client.update("new_card", id, details, (data) => {
+ console.log("更新成功", data);
+ commit('getCardScanResult', {results: details})
+ commit('showToast', {msg: '更新成功'})
+ window.location.reload()
+
+ }, (error) => {
+ console.log("更新失败", error);
+ commit('showToast', {msg: '更新失败,请重试'})
+ });
+ },
+ //将名片识别结果存储到CRM系统中
+ saveCardResult: async ({commit}, {cardResult}) => {
+ // commit('getCardScanResult', {results: cardResult})
+ await client.apexrest("new_cards", (data) => {
+ console.log("名片存储成功", data);
+
+ commit('getCardScanResult', {results: cardResult})
+ commit('showToast', {msg: '保存成功'})
+ router.replace('home')
+ }, (error) => {
+ console.log("名片存储失败", error);
+ commit('showToast', {msg: '保存失败,请重试'})
+ }, "POST", cardResult, null, true)
+ },
+ // 搜索名片
+ searchCard: async ({commit}, {keyword}) => {
+ // await client.query("", (data) => {
+ // console.log(data);
+ //
+ // }, (error) => {
+ // console.log(error);
+ // });
+ },
+ // 查看名片详情
+ getCardDetails: async ({commit}, {id}) => {
+ let fields = 'new_name,new_mobile,new_tel,new_post,new_web,new_fax,new_email,new_dept,new_comp,new_addr,new_title'
+ let details = {}
+
+ await client.retrieve("new_card", id, fields, (data) => {
+ console.log("获取名片详情成功", data);
+ if (data.new_cardid) {
+ details = data;
+
+ commit('getCardScanResult', {results: details})
+ }
+ }, (error) => {
+ console.log("获取名片详情失败", error);
+ });
+ },
+ // 删除名片
+ delCard: async ({commit}, {id}) => {
+ client.del("new_card", id, (data) => {
+ console.log('删除名片成功', data);
+ commit('delCardItem', {id})
+ commit('showToast', {msg: '删除成功'})
+ }, (error) => {
+ console.log('删除名片失败', error);
+ });
+ },
+ // 从CRM系统获取工商信息
+ getBusinessDataByCRM: async ({dispatch, commit}, {company}) => {
+ let bsData = {};
+ // select new_buscompanyId,new_enterpriseName,new_frName,new_regNo from new_buscompany where new_enterprisename = 企业名称
+ let url = "select new_enterprisename,new_frname,new_regno,new_creditcode,new_regcap,new_regcapcur,new_esdate,new_openfrom,new_opento,new_enterprisetype,new_enterprisestatus,new_operatescope from new_buscompanie where new_enterprisename='" + company + "'";
+ await client.query(url, (data) => {
+ console.log("系统中的工商信息", data);
+ if (data.value.length > 0) {
+ bsData = data.value[0];
+
+ // 显示工商信息
+ commit('getCrmBsData', {bsData})
+ } else {
+ dispatch('getBusinessDataByApi', {company})
+ }
+ }, (error) => {
console.log(error);
});
+ },
+ // 从第三方接口获取工商信息
+ getBusinessDataByApi: async ({dispatch, commit}, {company}) => {
+ let bsData = {};
+
+ let key = '09863cd4ace198743f7ce7f845beb83a';
+ await jsonp("https://v.juhe.cn/youshu/query?key=" + key + "&name=" + company, null, (err, data) => {
+ if (err) {
+ console.error(err.message);
+ } else {
+ console.log(data);
+ if (data.error_code == 0) {
+ if (data.result !== null) {
+ bsData = data.result
+
+ // 将返回信息字段全部加上前缀new_
+ let newBsData = {}
+ Object.keys(bsData).forEach(key => newBsData['new_' + key.toLowerCase()] = bsData[key])
+
+ dispatch('saveBsDataResult', {newBsData})
+ }
+ } else {
+ // dispatch('saveBsDataResult', {newBsData:{}})
+
+ commit('getApiBsData', {newBsData: {new_comp: ''}})
+ }
+ }
+ });
+
+ },
+ //将查询到的工商信息存储到CRM系统中
+ saveBsDataResult: async ({commit}, {newBsData}) => {
+ await client.apexrest("new_buscompanies", (data) => {
+ console.log("工商信息存储成功", data);
+
+ }, (error) => {
+ console.log(error);
+ }, "POST", newBsData, null, true)
- commit('getBCData', {records})
+ // 显示工商信息
+ commit('getApiBsData', {newBsData})
}
}
diff --git a/src/vuex/getters.js b/src/vuex/getters.js
index a958efc..4d41082 100644
--- a/src/vuex/getters.js
+++ b/src/vuex/getters.js
@@ -2,21 +2,50 @@
* Created by Sugar on 2017/5/17.
*/
-var pinyin = require("pinyin");
+import pinyin from 'pinyin'
+import bskey from '../common/js/BSKEY'
const getters = {
+ // 搜索名片
+ getCardBySearch: (state) => {
+ let allBCs = state.businessCardList,
+ resultList = []
+
+ allBCs.filter(item => {
+ if (state.searchKeyword.length > 0) {
+ if (item.new_name !== null && item.new_name.indexOf(state.searchKeyword) > -1) {
+ resultList.push(item)
+ }
+ }
+ })
+
+ return resultList
+ },
// 从名片列表中提取出首字母 再排序
bcInitialList: (state) => {
var initialList = [],
allBCs = state.businessCardList,
- max = allBCs.length
+ max = allBCs.length,
+ currGId = state.currGroupId
+
for (var i = 0; i < max; i++) {
- var fl = pinyin(allBCs[i].new_name || '#', {
- style: pinyin.STYLE_FIRST_LETTER
- })[0][0].substr(0, 1).toUpperCase()
+ let gid = allBCs[i]._new_group_value;
- if (initialList.indexOf(fl) == -1) {
- initialList.push(fl)
+ if (gid == currGId || currGId == 0) {
+ let lt = '';
+ if (allBCs[i].new_name == null) {
+ lt = '#'
+ // let lt = isNaN(parseFloat(allBCs[i].new_name)) ? '#' : allBCs[i].new_name
+ } else {
+ lt = isNaN(parseFloat(allBCs[i].new_name)) ? allBCs[i].new_name : '#'
+ }
+ var fl = pinyin(lt, {
+ style: pinyin.STYLE_FIRST_LETTER
+ })[0][0].substr(0, 1).toUpperCase()
+
+ if (initialList.indexOf(fl) == -1) {
+ initialList.push(fl)
+ }
}
}
@@ -45,7 +74,14 @@ const getters = {
let protoTypeName = getters.bcInitialList[i]
bcsSortList[protoTypeName] = []
for (let j = 0; j < max; j++) {
- let fl = pinyin(allBCList[j].new_name || '#', {
+ let lt = '';
+ if (allBCList[j].new_name == null) {
+ lt = '#'
+ } else {
+ lt = isNaN(parseFloat(allBCList[j].new_name)) ? allBCList[j].new_name : '#'
+ }
+
+ let fl = pinyin(lt, {
style: pinyin.STYLE_FIRST_LETTER
})[0][0].substr(0, 1).toUpperCase()
@@ -55,6 +91,75 @@ const getters = {
}
}
return bcsSortList
+ },
+ // 根据分组进行筛选
+ getCardsByGroup: (state, getters) => {
+ let currG = state.currGroup,
+ currGID = state.currGroupId,
+ bcList = getters.bcsSortList,
+ gList = {}
+
+ if (currG !== '全部') {
+
+ for (let key in bcList) {
+ let letterList = bcList[key]
+ let newLetterList = []
+ console.log(letterList);
+ for (let i = 0; i < letterList.length; i++) {
+ let gId = letterList[i]._new_group_value
+ if (gId && gId == currGID) {
+ newLetterList.push(letterList[i])
+ }
+ }
+ if (newLetterList.length > 0) {
+ gList[key] = newLetterList
+ }
+ }
+
+ return gList
+ } else {
+ return bcList
+ }
+ },
+ // 获取当前分组下名片的数量
+ getCardsCount: (state, getters) => {
+ let list = getters.getCardsByGroup;
+ let count = 0;
+ for (let key in list) {
+ let item = list[key];
+ for (let i = 0; i < item.length; i++) {
+ count++
+ }
+ }
+
+ return count
+ },
+ // 获取名片详情信息字段标题,icon 等
+ // 获取名片识别结果详情字段标题,icon等
+ getDetailsTitle: (state) => {
+ let newData = {},
+ oldData = state.scanResult;
+
+ Object.keys(oldData).forEach(key => {
+ if (bskey[key] && bskey.hasOwnProperty(key)) {
+ newData[key] = oldData[key] || ''
+ }
+ })
+
+ return newData
+ },
+ // 获取工商信息标题
+ getBSTitle: (state, getters) => {
+ let newBsData = {},
+ oldBsData = state.compayBusinessData[0];
+
+ Object.keys(oldBsData).forEach(key => {
+ if (bskey[key]) {
+ newBsData[bskey[key]] = oldBsData[key]
+ }
+ })
+
+ return newBsData
}
}
diff --git a/src/vuex/mutations.js b/src/vuex/mutations.js
index dc9dc53..32cc0bd 100644
--- a/src/vuex/mutations.js
+++ b/src/vuex/mutations.js
@@ -10,6 +10,26 @@ const mutations = {
// 搜索
showSearch: (state) => {
state.search = !state.search
+ if (!state.search) {
+ state.searchKeyword = ''
+ }
+ },
+ getSearchKeyword: (state, {keyword}) => {
+ state.searchKeyword = keyword
+ },
+ // 获取名片详情信息
+ getCardDetails: (state, {details}) => {
+ state.cardDetails = details;
+ state.isAjax = false
+ },
+ // 获取名片识别结果
+ getCardScanResult: (state, {results}) => {
+ state.scanResult = results;
+ state.isAjax = false
+ },
+ //
+ updateScanResult: (state, key) => {
+ state.scanResult[key] = results;
},
// 获取当前查看的名片id
getActiveId: (state, {activeId}) => {
@@ -18,15 +38,59 @@ const mutations = {
// 查看详情
viewDetail: (state) => {
state.details = !state.details
+ if (!state.details) {
+ state.scanResult = {}
+ // state.cardDetails = {}
+ }
+ },
+ // 移除名片
+ delCardItem: (state, {id}) => {
+ console.log('del id', id);
+ state.businessCardList.filter((item, index, arr) => {
+ if (item.new_cardid == id) {
+ state.businessCardList.splice(index, 1)
+ }
+ })
+ state.isAjax = false
+ },
+ // 获取分组列表
+ getGroups: (state, {groups}) => {
+ state.groupList = groups;
+ state.isAjax = false
+ },
+ getCurrGroup: (state, {group, id}) => {
+ state.currGroup = group
+ state.currGroupId = id
},
// 添加分组
addGroup: (state, {groupName}) => {
state.groupList.push(groupName)
},
- // 测试获取sf名片数据
+ // 获取名片列表数据
getBCData: (state, {records}) => {
state.businessCardList = records;
+ // state.isAjax = false
+ },
+ // 获取crm中工商数据
+ getCrmBsData: (state, {bsData}) => {
+ state.compayBusinessData.push(bsData)
state.isAjax = false
+ },
+ // 获取api中工商数据
+ getApiBsData: (state, {bsData}) => {
+ state.compayBusinessData.push(bsData)
+ state.isAjax = false
+ },
+ // common
+ // 弹出toast
+ showToast: (state, {msg}) => {
+ state.toastMsg = msg
+ state.toast = true
+ if (state.toastTimer) clearTimeout(state.toastTimer)
+ state.toastTimer = setTimeout(() => {
+ state.toastMsg = ''
+ state.toast = false
+ }, 2000)
}
}
diff --git a/src/vuex/store.js b/src/vuex/store.js
index 4f572cd..cc5935d 100644
--- a/src/vuex/store.js
+++ b/src/vuex/store.js
@@ -12,6 +12,10 @@ Vue.use(Vuex)
// 初始化一些常用数据,根据vue的理念,使用到的数据都必须先进行初始化设置。
let state = {
+ // toast
+ toast: false,
+ toastMsg: '',
+ toastTimer: null,
// 侧边栏
sidebar: {
open: false,
@@ -19,7 +23,10 @@ let state = {
},
// 搜索
search: false,
- // 名片详情
+ searchKeyword: '',
+ // 是否正在识别名片
+ isScan: false,
+ // 详情页
details: false,
// 导航栏标题
headerTitle: "查看分组",
@@ -29,15 +36,18 @@ let state = {
activeId: 0,
// 名片列表
businessCardList: [],
+ // 名片详情信息
+ cardDetails: {},
+ // 名片识别结果
+ scanResult: {},
+ compayBusinessData: [],
// 名片首字母列表
- bcFirstNameList: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],
+ // bcFirstNameList: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],
// 名片分组
- groupList: [
- '最近30天查看',
- '合作伙伴',
- '最近新增名片',
- '未分组'
- ]
+ groupList: [],
+ // 当前选择分组
+ currGroup: '全部',
+ currGroupId: 0
}
// 导出一个新生成的Store对象
diff --git a/static/css/css.css b/static/css/css.css
deleted file mode 100644
index eab549e..0000000
--- a/static/css/css.css
+++ /dev/null
@@ -1,30 +0,0 @@
-@font-face {
- font-family: 'Roboto';
- font-style: normal;
- font-weight: 300;
- src: local('Roboto Light'), local('Roboto-Light'), url(http://fonts.gstatic.com/s/roboto/v16/Hgo13k-tfSpn0qi1SFdUfbO3LdcAZYWl9Si6vvxL-qU.woff) format('woff');
-}
-@font-face {
- font-family: 'Roboto';
- font-style: normal;
- font-weight: 400;
- src: local('Roboto'), local('Roboto-Regular'), url(http://fonts.gstatic.com/s/roboto/v16/CrYjSnGjrRCn0pd9VQsnFOvvDin1pK8aKteLpeZ5c0A.woff) format('woff');
-}
-@font-face {
- font-family: 'Roboto';
- font-style: normal;
- font-weight: 500;
- src: local('Roboto Medium'), local('Roboto-Medium'), url(http://fonts.gstatic.com/s/roboto/v16/RxZJdnzeo3R5zSexge8UUbO3LdcAZYWl9Si6vvxL-qU.woff) format('woff');
-}
-@font-face {
- font-family: 'Roboto';
- font-style: normal;
- font-weight: 700;
- src: local('Roboto Bold'), local('Roboto-Bold'), url(http://fonts.gstatic.com/s/roboto/v16/d-6IYplOFocCacKzxwXSOLO3LdcAZYWl9Si6vvxL-qU.woff) format('woff');
-}
-@font-face {
- font-family: 'Roboto';
- font-style: italic;
- font-weight: 400;
- src: local('Roboto Italic'), local('Roboto-Italic'), url(http://fonts.gstatic.com/s/roboto/v16/1pO9eUAp8pSF8VnRTP3xnnYhjbSpvc47ee6xR_80Hnw.woff) format('woff');
-}
diff --git a/static/css/icon.css b/static/css/icon.css
deleted file mode 100644
index 3e15388..0000000
--- a/static/css/icon.css
+++ /dev/null
@@ -1,22 +0,0 @@
-@font-face {
- font-family: 'Material Icons';
- font-style: normal;
- font-weight: 400;
- src: url(http://fonts.gstatic.com/s/materialicons/v28/2fcrYFNaTjcS6g4U3t-Y5RV6cRhDpPC5P4GCEJpqGoc.woff) format('woff');
-}
-
-.material-icons {
- font-family: 'Material Icons';
- font-weight: normal;
- font-style: normal;
- font-size: 24px;
- line-height: 1;
- letter-spacing: normal;
- text-transform: none;
- display: inline-block;
- white-space: nowrap;
- word-wrap: normal;
- direction: ltr;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
-}
diff --git a/static/iconfont/MaterialIcons-Regular.eot b/static/iconfont/MaterialIcons-Regular.eot
new file mode 100644
index 0000000..70508eb
Binary files /dev/null and b/static/iconfont/MaterialIcons-Regular.eot differ
diff --git a/static/iconfont/MaterialIcons-Regular.ijmap b/static/iconfont/MaterialIcons-Regular.ijmap
new file mode 100644
index 0000000..d9f1d25
--- /dev/null
+++ b/static/iconfont/MaterialIcons-Regular.ijmap
@@ -0,0 +1 @@
+{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}}
\ No newline at end of file
diff --git a/static/iconfont/MaterialIcons-Regular.svg b/static/iconfont/MaterialIcons-Regular.svg
new file mode 100644
index 0000000..a449327
--- /dev/null
+++ b/static/iconfont/MaterialIcons-Regular.svg
@@ -0,0 +1,2373 @@
+
+
+
+
diff --git a/static/iconfont/MaterialIcons-Regular.ttf b/static/iconfont/MaterialIcons-Regular.ttf
new file mode 100644
index 0000000..7015564
Binary files /dev/null and b/static/iconfont/MaterialIcons-Regular.ttf differ
diff --git a/static/iconfont/MaterialIcons-Regular.woff b/static/iconfont/MaterialIcons-Regular.woff
new file mode 100644
index 0000000..b648a3e
Binary files /dev/null and b/static/iconfont/MaterialIcons-Regular.woff differ
diff --git a/static/iconfont/MaterialIcons-Regular.woff2 b/static/iconfont/MaterialIcons-Regular.woff2
new file mode 100644
index 0000000..9fa2112
Binary files /dev/null and b/static/iconfont/MaterialIcons-Regular.woff2 differ
diff --git a/static/iconfont/README.md b/static/iconfont/README.md
new file mode 100644
index 0000000..ce4141e
--- /dev/null
+++ b/static/iconfont/README.md
@@ -0,0 +1,9 @@
+The recommended way to use the Material Icons font is by linking to the web font hosted on Google Fonts:
+
+```html
+
+```
+
+Read more in our full usage guide:
+http://google.github.io/material-design-icons/#icon-font-for-the-web
diff --git a/static/iconfont/codepoints b/static/iconfont/codepoints
new file mode 100644
index 0000000..3c8b075
--- /dev/null
+++ b/static/iconfont/codepoints
@@ -0,0 +1,932 @@
+3d_rotation e84d
+ac_unit eb3b
+access_alarm e190
+access_alarms e191
+access_time e192
+accessibility e84e
+accessible e914
+account_balance e84f
+account_balance_wallet e850
+account_box e851
+account_circle e853
+adb e60e
+add e145
+add_a_photo e439
+add_alarm e193
+add_alert e003
+add_box e146
+add_circle e147
+add_circle_outline e148
+add_location e567
+add_shopping_cart e854
+add_to_photos e39d
+add_to_queue e05c
+adjust e39e
+airline_seat_flat e630
+airline_seat_flat_angled e631
+airline_seat_individual_suite e632
+airline_seat_legroom_extra e633
+airline_seat_legroom_normal e634
+airline_seat_legroom_reduced e635
+airline_seat_recline_extra e636
+airline_seat_recline_normal e637
+airplanemode_active e195
+airplanemode_inactive e194
+airplay e055
+airport_shuttle eb3c
+alarm e855
+alarm_add e856
+alarm_off e857
+alarm_on e858
+album e019
+all_inclusive eb3d
+all_out e90b
+android e859
+announcement e85a
+apps e5c3
+archive e149
+arrow_back e5c4
+arrow_downward e5db
+arrow_drop_down e5c5
+arrow_drop_down_circle e5c6
+arrow_drop_up e5c7
+arrow_forward e5c8
+arrow_upward e5d8
+art_track e060
+aspect_ratio e85b
+assessment e85c
+assignment e85d
+assignment_ind e85e
+assignment_late e85f
+assignment_return e860
+assignment_returned e861
+assignment_turned_in e862
+assistant e39f
+assistant_photo e3a0
+attach_file e226
+attach_money e227
+attachment e2bc
+audiotrack e3a1
+autorenew e863
+av_timer e01b
+backspace e14a
+backup e864
+battery_alert e19c
+battery_charging_full e1a3
+battery_full e1a4
+battery_std e1a5
+battery_unknown e1a6
+beach_access eb3e
+beenhere e52d
+block e14b
+bluetooth e1a7
+bluetooth_audio e60f
+bluetooth_connected e1a8
+bluetooth_disabled e1a9
+bluetooth_searching e1aa
+blur_circular e3a2
+blur_linear e3a3
+blur_off e3a4
+blur_on e3a5
+book e865
+bookmark e866
+bookmark_border e867
+border_all e228
+border_bottom e229
+border_clear e22a
+border_color e22b
+border_horizontal e22c
+border_inner e22d
+border_left e22e
+border_outer e22f
+border_right e230
+border_style e231
+border_top e232
+border_vertical e233
+branding_watermark e06b
+brightness_1 e3a6
+brightness_2 e3a7
+brightness_3 e3a8
+brightness_4 e3a9
+brightness_5 e3aa
+brightness_6 e3ab
+brightness_7 e3ac
+brightness_auto e1ab
+brightness_high e1ac
+brightness_low e1ad
+brightness_medium e1ae
+broken_image e3ad
+brush e3ae
+bubble_chart e6dd
+bug_report e868
+build e869
+burst_mode e43c
+business e0af
+business_center eb3f
+cached e86a
+cake e7e9
+call e0b0
+call_end e0b1
+call_made e0b2
+call_merge e0b3
+call_missed e0b4
+call_missed_outgoing e0e4
+call_received e0b5
+call_split e0b6
+call_to_action e06c
+camera e3af
+camera_alt e3b0
+camera_enhance e8fc
+camera_front e3b1
+camera_rear e3b2
+camera_roll e3b3
+cancel e5c9
+card_giftcard e8f6
+card_membership e8f7
+card_travel e8f8
+casino eb40
+cast e307
+cast_connected e308
+center_focus_strong e3b4
+center_focus_weak e3b5
+change_history e86b
+chat e0b7
+chat_bubble e0ca
+chat_bubble_outline e0cb
+check e5ca
+check_box e834
+check_box_outline_blank e835
+check_circle e86c
+chevron_left e5cb
+chevron_right e5cc
+child_care eb41
+child_friendly eb42
+chrome_reader_mode e86d
+class e86e
+clear e14c
+clear_all e0b8
+close e5cd
+closed_caption e01c
+cloud e2bd
+cloud_circle e2be
+cloud_done e2bf
+cloud_download e2c0
+cloud_off e2c1
+cloud_queue e2c2
+cloud_upload e2c3
+code e86f
+collections e3b6
+collections_bookmark e431
+color_lens e3b7
+colorize e3b8
+comment e0b9
+compare e3b9
+compare_arrows e915
+computer e30a
+confirmation_number e638
+contact_mail e0d0
+contact_phone e0cf
+contacts e0ba
+content_copy e14d
+content_cut e14e
+content_paste e14f
+control_point e3ba
+control_point_duplicate e3bb
+copyright e90c
+create e150
+create_new_folder e2cc
+credit_card e870
+crop e3be
+crop_16_9 e3bc
+crop_3_2 e3bd
+crop_5_4 e3bf
+crop_7_5 e3c0
+crop_din e3c1
+crop_free e3c2
+crop_landscape e3c3
+crop_original e3c4
+crop_portrait e3c5
+crop_rotate e437
+crop_square e3c6
+dashboard e871
+data_usage e1af
+date_range e916
+dehaze e3c7
+delete e872
+delete_forever e92b
+delete_sweep e16c
+description e873
+desktop_mac e30b
+desktop_windows e30c
+details e3c8
+developer_board e30d
+developer_mode e1b0
+device_hub e335
+devices e1b1
+devices_other e337
+dialer_sip e0bb
+dialpad e0bc
+directions e52e
+directions_bike e52f
+directions_boat e532
+directions_bus e530
+directions_car e531
+directions_railway e534
+directions_run e566
+directions_subway e533
+directions_transit e535
+directions_walk e536
+disc_full e610
+dns e875
+do_not_disturb e612
+do_not_disturb_alt e611
+do_not_disturb_off e643
+do_not_disturb_on e644
+dock e30e
+domain e7ee
+done e876
+done_all e877
+donut_large e917
+donut_small e918
+drafts e151
+drag_handle e25d
+drive_eta e613
+dvr e1b2
+edit e3c9
+edit_location e568
+eject e8fb
+email e0be
+enhanced_encryption e63f
+equalizer e01d
+error e000
+error_outline e001
+euro_symbol e926
+ev_station e56d
+event e878
+event_available e614
+event_busy e615
+event_note e616
+event_seat e903
+exit_to_app e879
+expand_less e5ce
+expand_more e5cf
+explicit e01e
+explore e87a
+exposure e3ca
+exposure_neg_1 e3cb
+exposure_neg_2 e3cc
+exposure_plus_1 e3cd
+exposure_plus_2 e3ce
+exposure_zero e3cf
+extension e87b
+face e87c
+fast_forward e01f
+fast_rewind e020
+favorite e87d
+favorite_border e87e
+featured_play_list e06d
+featured_video e06e
+feedback e87f
+fiber_dvr e05d
+fiber_manual_record e061
+fiber_new e05e
+fiber_pin e06a
+fiber_smart_record e062
+file_download e2c4
+file_upload e2c6
+filter e3d3
+filter_1 e3d0
+filter_2 e3d1
+filter_3 e3d2
+filter_4 e3d4
+filter_5 e3d5
+filter_6 e3d6
+filter_7 e3d7
+filter_8 e3d8
+filter_9 e3d9
+filter_9_plus e3da
+filter_b_and_w e3db
+filter_center_focus e3dc
+filter_drama e3dd
+filter_frames e3de
+filter_hdr e3df
+filter_list e152
+filter_none e3e0
+filter_tilt_shift e3e2
+filter_vintage e3e3
+find_in_page e880
+find_replace e881
+fingerprint e90d
+first_page e5dc
+fitness_center eb43
+flag e153
+flare e3e4
+flash_auto e3e5
+flash_off e3e6
+flash_on e3e7
+flight e539
+flight_land e904
+flight_takeoff e905
+flip e3e8
+flip_to_back e882
+flip_to_front e883
+folder e2c7
+folder_open e2c8
+folder_shared e2c9
+folder_special e617
+font_download e167
+format_align_center e234
+format_align_justify e235
+format_align_left e236
+format_align_right e237
+format_bold e238
+format_clear e239
+format_color_fill e23a
+format_color_reset e23b
+format_color_text e23c
+format_indent_decrease e23d
+format_indent_increase e23e
+format_italic e23f
+format_line_spacing e240
+format_list_bulleted e241
+format_list_numbered e242
+format_paint e243
+format_quote e244
+format_shapes e25e
+format_size e245
+format_strikethrough e246
+format_textdirection_l_to_r e247
+format_textdirection_r_to_l e248
+format_underlined e249
+forum e0bf
+forward e154
+forward_10 e056
+forward_30 e057
+forward_5 e058
+free_breakfast eb44
+fullscreen e5d0
+fullscreen_exit e5d1
+functions e24a
+g_translate e927
+gamepad e30f
+games e021
+gavel e90e
+gesture e155
+get_app e884
+gif e908
+golf_course eb45
+gps_fixed e1b3
+gps_not_fixed e1b4
+gps_off e1b5
+grade e885
+gradient e3e9
+grain e3ea
+graphic_eq e1b8
+grid_off e3eb
+grid_on e3ec
+group e7ef
+group_add e7f0
+group_work e886
+hd e052
+hdr_off e3ed
+hdr_on e3ee
+hdr_strong e3f1
+hdr_weak e3f2
+headset e310
+headset_mic e311
+healing e3f3
+hearing e023
+help e887
+help_outline e8fd
+high_quality e024
+highlight e25f
+highlight_off e888
+history e889
+home e88a
+hot_tub eb46
+hotel e53a
+hourglass_empty e88b
+hourglass_full e88c
+http e902
+https e88d
+image e3f4
+image_aspect_ratio e3f5
+import_contacts e0e0
+import_export e0c3
+important_devices e912
+inbox e156
+indeterminate_check_box e909
+info e88e
+info_outline e88f
+input e890
+insert_chart e24b
+insert_comment e24c
+insert_drive_file e24d
+insert_emoticon e24e
+insert_invitation e24f
+insert_link e250
+insert_photo e251
+invert_colors e891
+invert_colors_off e0c4
+iso e3f6
+keyboard e312
+keyboard_arrow_down e313
+keyboard_arrow_left e314
+keyboard_arrow_right e315
+keyboard_arrow_up e316
+keyboard_backspace e317
+keyboard_capslock e318
+keyboard_hide e31a
+keyboard_return e31b
+keyboard_tab e31c
+keyboard_voice e31d
+kitchen eb47
+label e892
+label_outline e893
+landscape e3f7
+language e894
+laptop e31e
+laptop_chromebook e31f
+laptop_mac e320
+laptop_windows e321
+last_page e5dd
+launch e895
+layers e53b
+layers_clear e53c
+leak_add e3f8
+leak_remove e3f9
+lens e3fa
+library_add e02e
+library_books e02f
+library_music e030
+lightbulb_outline e90f
+line_style e919
+line_weight e91a
+linear_scale e260
+link e157
+linked_camera e438
+list e896
+live_help e0c6
+live_tv e639
+local_activity e53f
+local_airport e53d
+local_atm e53e
+local_bar e540
+local_cafe e541
+local_car_wash e542
+local_convenience_store e543
+local_dining e556
+local_drink e544
+local_florist e545
+local_gas_station e546
+local_grocery_store e547
+local_hospital e548
+local_hotel e549
+local_laundry_service e54a
+local_library e54b
+local_mall e54c
+local_movies e54d
+local_offer e54e
+local_parking e54f
+local_pharmacy e550
+local_phone e551
+local_pizza e552
+local_play e553
+local_post_office e554
+local_printshop e555
+local_see e557
+local_shipping e558
+local_taxi e559
+location_city e7f1
+location_disabled e1b6
+location_off e0c7
+location_on e0c8
+location_searching e1b7
+lock e897
+lock_open e898
+lock_outline e899
+looks e3fc
+looks_3 e3fb
+looks_4 e3fd
+looks_5 e3fe
+looks_6 e3ff
+looks_one e400
+looks_two e401
+loop e028
+loupe e402
+low_priority e16d
+loyalty e89a
+mail e158
+mail_outline e0e1
+map e55b
+markunread e159
+markunread_mailbox e89b
+memory e322
+menu e5d2
+merge_type e252
+message e0c9
+mic e029
+mic_none e02a
+mic_off e02b
+mms e618
+mode_comment e253
+mode_edit e254
+monetization_on e263
+money_off e25c
+monochrome_photos e403
+mood e7f2
+mood_bad e7f3
+more e619
+more_horiz e5d3
+more_vert e5d4
+motorcycle e91b
+mouse e323
+move_to_inbox e168
+movie e02c
+movie_creation e404
+movie_filter e43a
+multiline_chart e6df
+music_note e405
+music_video e063
+my_location e55c
+nature e406
+nature_people e407
+navigate_before e408
+navigate_next e409
+navigation e55d
+near_me e569
+network_cell e1b9
+network_check e640
+network_locked e61a
+network_wifi e1ba
+new_releases e031
+next_week e16a
+nfc e1bb
+no_encryption e641
+no_sim e0cc
+not_interested e033
+note e06f
+note_add e89c
+notifications e7f4
+notifications_active e7f7
+notifications_none e7f5
+notifications_off e7f6
+notifications_paused e7f8
+offline_pin e90a
+ondemand_video e63a
+opacity e91c
+open_in_browser e89d
+open_in_new e89e
+open_with e89f
+pages e7f9
+pageview e8a0
+palette e40a
+pan_tool e925
+panorama e40b
+panorama_fish_eye e40c
+panorama_horizontal e40d
+panorama_vertical e40e
+panorama_wide_angle e40f
+party_mode e7fa
+pause e034
+pause_circle_filled e035
+pause_circle_outline e036
+payment e8a1
+people e7fb
+people_outline e7fc
+perm_camera_mic e8a2
+perm_contact_calendar e8a3
+perm_data_setting e8a4
+perm_device_information e8a5
+perm_identity e8a6
+perm_media e8a7
+perm_phone_msg e8a8
+perm_scan_wifi e8a9
+person e7fd
+person_add e7fe
+person_outline e7ff
+person_pin e55a
+person_pin_circle e56a
+personal_video e63b
+pets e91d
+phone e0cd
+phone_android e324
+phone_bluetooth_speaker e61b
+phone_forwarded e61c
+phone_in_talk e61d
+phone_iphone e325
+phone_locked e61e
+phone_missed e61f
+phone_paused e620
+phonelink e326
+phonelink_erase e0db
+phonelink_lock e0dc
+phonelink_off e327
+phonelink_ring e0dd
+phonelink_setup e0de
+photo e410
+photo_album e411
+photo_camera e412
+photo_filter e43b
+photo_library e413
+photo_size_select_actual e432
+photo_size_select_large e433
+photo_size_select_small e434
+picture_as_pdf e415
+picture_in_picture e8aa
+picture_in_picture_alt e911
+pie_chart e6c4
+pie_chart_outlined e6c5
+pin_drop e55e
+place e55f
+play_arrow e037
+play_circle_filled e038
+play_circle_outline e039
+play_for_work e906
+playlist_add e03b
+playlist_add_check e065
+playlist_play e05f
+plus_one e800
+poll e801
+polymer e8ab
+pool eb48
+portable_wifi_off e0ce
+portrait e416
+power e63c
+power_input e336
+power_settings_new e8ac
+pregnant_woman e91e
+present_to_all e0df
+print e8ad
+priority_high e645
+public e80b
+publish e255
+query_builder e8ae
+question_answer e8af
+queue e03c
+queue_music e03d
+queue_play_next e066
+radio e03e
+radio_button_checked e837
+radio_button_unchecked e836
+rate_review e560
+receipt e8b0
+recent_actors e03f
+record_voice_over e91f
+redeem e8b1
+redo e15a
+refresh e5d5
+remove e15b
+remove_circle e15c
+remove_circle_outline e15d
+remove_from_queue e067
+remove_red_eye e417
+remove_shopping_cart e928
+reorder e8fe
+repeat e040
+repeat_one e041
+replay e042
+replay_10 e059
+replay_30 e05a
+replay_5 e05b
+reply e15e
+reply_all e15f
+report e160
+report_problem e8b2
+restaurant e56c
+restaurant_menu e561
+restore e8b3
+restore_page e929
+ring_volume e0d1
+room e8b4
+room_service eb49
+rotate_90_degrees_ccw e418
+rotate_left e419
+rotate_right e41a
+rounded_corner e920
+router e328
+rowing e921
+rss_feed e0e5
+rv_hookup e642
+satellite e562
+save e161
+scanner e329
+schedule e8b5
+school e80c
+screen_lock_landscape e1be
+screen_lock_portrait e1bf
+screen_lock_rotation e1c0
+screen_rotation e1c1
+screen_share e0e2
+sd_card e623
+sd_storage e1c2
+search e8b6
+security e32a
+select_all e162
+send e163
+sentiment_dissatisfied e811
+sentiment_neutral e812
+sentiment_satisfied e813
+sentiment_very_dissatisfied e814
+sentiment_very_satisfied e815
+settings e8b8
+settings_applications e8b9
+settings_backup_restore e8ba
+settings_bluetooth e8bb
+settings_brightness e8bd
+settings_cell e8bc
+settings_ethernet e8be
+settings_input_antenna e8bf
+settings_input_component e8c0
+settings_input_composite e8c1
+settings_input_hdmi e8c2
+settings_input_svideo e8c3
+settings_overscan e8c4
+settings_phone e8c5
+settings_power e8c6
+settings_remote e8c7
+settings_system_daydream e1c3
+settings_voice e8c8
+share e80d
+shop e8c9
+shop_two e8ca
+shopping_basket e8cb
+shopping_cart e8cc
+short_text e261
+show_chart e6e1
+shuffle e043
+signal_cellular_4_bar e1c8
+signal_cellular_connected_no_internet_4_bar e1cd
+signal_cellular_no_sim e1ce
+signal_cellular_null e1cf
+signal_cellular_off e1d0
+signal_wifi_4_bar e1d8
+signal_wifi_4_bar_lock e1d9
+signal_wifi_off e1da
+sim_card e32b
+sim_card_alert e624
+skip_next e044
+skip_previous e045
+slideshow e41b
+slow_motion_video e068
+smartphone e32c
+smoke_free eb4a
+smoking_rooms eb4b
+sms e625
+sms_failed e626
+snooze e046
+sort e164
+sort_by_alpha e053
+spa eb4c
+space_bar e256
+speaker e32d
+speaker_group e32e
+speaker_notes e8cd
+speaker_notes_off e92a
+speaker_phone e0d2
+spellcheck e8ce
+star e838
+star_border e83a
+star_half e839
+stars e8d0
+stay_current_landscape e0d3
+stay_current_portrait e0d4
+stay_primary_landscape e0d5
+stay_primary_portrait e0d6
+stop e047
+stop_screen_share e0e3
+storage e1db
+store e8d1
+store_mall_directory e563
+straighten e41c
+streetview e56e
+strikethrough_s e257
+style e41d
+subdirectory_arrow_left e5d9
+subdirectory_arrow_right e5da
+subject e8d2
+subscriptions e064
+subtitles e048
+subway e56f
+supervisor_account e8d3
+surround_sound e049
+swap_calls e0d7
+swap_horiz e8d4
+swap_vert e8d5
+swap_vertical_circle e8d6
+switch_camera e41e
+switch_video e41f
+sync e627
+sync_disabled e628
+sync_problem e629
+system_update e62a
+system_update_alt e8d7
+tab e8d8
+tab_unselected e8d9
+tablet e32f
+tablet_android e330
+tablet_mac e331
+tag_faces e420
+tap_and_play e62b
+terrain e564
+text_fields e262
+text_format e165
+textsms e0d8
+texture e421
+theaters e8da
+thumb_down e8db
+thumb_up e8dc
+thumbs_up_down e8dd
+time_to_leave e62c
+timelapse e422
+timeline e922
+timer e425
+timer_10 e423
+timer_3 e424
+timer_off e426
+title e264
+toc e8de
+today e8df
+toll e8e0
+tonality e427
+touch_app e913
+toys e332
+track_changes e8e1
+traffic e565
+train e570
+tram e571
+transfer_within_a_station e572
+transform e428
+translate e8e2
+trending_down e8e3
+trending_flat e8e4
+trending_up e8e5
+tune e429
+turned_in e8e6
+turned_in_not e8e7
+tv e333
+unarchive e169
+undo e166
+unfold_less e5d6
+unfold_more e5d7
+update e923
+usb e1e0
+verified_user e8e8
+vertical_align_bottom e258
+vertical_align_center e259
+vertical_align_top e25a
+vibration e62d
+video_call e070
+video_label e071
+video_library e04a
+videocam e04b
+videocam_off e04c
+videogame_asset e338
+view_agenda e8e9
+view_array e8ea
+view_carousel e8eb
+view_column e8ec
+view_comfy e42a
+view_compact e42b
+view_day e8ed
+view_headline e8ee
+view_list e8ef
+view_module e8f0
+view_quilt e8f1
+view_stream e8f2
+view_week e8f3
+vignette e435
+visibility e8f4
+visibility_off e8f5
+voice_chat e62e
+voicemail e0d9
+volume_down e04d
+volume_mute e04e
+volume_off e04f
+volume_up e050
+vpn_key e0da
+vpn_lock e62f
+wallpaper e1bc
+warning e002
+watch e334
+watch_later e924
+wb_auto e42c
+wb_cloudy e42d
+wb_incandescent e42e
+wb_iridescent e436
+wb_sunny e430
+wc e63d
+web e051
+web_asset e069
+weekend e16b
+whatshot e80e
+widgets e1bd
+wifi e63e
+wifi_lock e1e1
+wifi_tethering e1e2
+work e8f9
+wrap_text e25b
+youtube_searched_for e8fa
+zoom_in e8ff
+zoom_out e900
+zoom_out_map e56b
diff --git a/static/iconfont/material-icons.css b/static/iconfont/material-icons.css
new file mode 100644
index 0000000..2270c09
--- /dev/null
+++ b/static/iconfont/material-icons.css
@@ -0,0 +1,36 @@
+@font-face {
+ font-family: 'Material Icons';
+ font-style: normal;
+ font-weight: 400;
+ src: url(MaterialIcons-Regular.eot); /* For IE6-8 */
+ src: local('Material Icons'),
+ local('MaterialIcons-Regular'),
+ url(MaterialIcons-Regular.woff2) format('woff2'),
+ url(MaterialIcons-Regular.woff) format('woff'),
+ url(MaterialIcons-Regular.ttf) format('truetype');
+}
+
+.material-icons {
+ font-family: 'Material Icons';
+ font-weight: normal;
+ font-style: normal;
+ font-size: 24px; /* Preferred icon size */
+ display: inline-block;
+ line-height: 1;
+ text-transform: none;
+ letter-spacing: normal;
+ word-wrap: normal;
+ white-space: nowrap;
+ direction: ltr;
+
+ /* Support for all WebKit browsers. */
+ -webkit-font-smoothing: antialiased;
+ /* Support for Safari and Chrome. */
+ text-rendering: optimizeLegibility;
+
+ /* Support for Firefox. */
+ -moz-osx-font-smoothing: grayscale;
+
+ /* Support for IE. */
+ font-feature-settings: 'liga';
+}
diff --git a/static/js/Base.js b/static/js/Base.js
index 3142cca..d577e2a 100755
--- a/static/js/Base.js
+++ b/static/js/Base.js
@@ -57,7 +57,7 @@ function GetContext() {
if (IsTest) {
context.AppId = "wxcbf80010bbc52ecd";
context.SessionId = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InZlYlVRb3NwZkxLbEpaTHl3ZkVkQV9ZYU1ybyJ9.eyJhdWQiOiJodHRwczovL21zZGVtby52ZWV2bGluay5jb20vIiwiaXNzIjoiaHR0cDovL3N0cy52ZWV2bGluay5jb20vYWRmcy9zZXJ2aWNlcy90cnVzdCIsImlhdCI6MTUwMTIyMjk2MSwiZXhwIjoxNTMyNzIyOTYxLCJ1cG4iOiJidWJiYS5saUB2ZWV2bGluay5jb20iLCJwcmltYXJ5c2lkIjoiUy0xLTUtMjEtMzMzOTY3Mzg0MC0zNTk1ODQzMDU1LTIwMjk5ODExMTMtMTEyNyIsInVuaXF1ZV9uYW1lIjoiVkVFVkxJTktcXGJ1YmJhLmxpIiwiYXV0aF90aW1lIjoiMjAxNy0wNy0yOFQwNjoyMjo0MC45MjBaIiwiYXV0aG1ldGhvZCI6InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkUHJvdGVjdGVkVHJhbnNwb3J0IiwidmVyIjoiMS4wIiwiYXBwaWQiOiI0QkQwRDNDMi05N0RGLTQwOEItQTZENC1BOEZDRjg0MDMwQzMifQ.TVHPfokM1zFnCueAeKYeMIm9bqHgqYbpm8B8_S71-TDQkCYmmAc4LkveWFQXrNwbRUFl7WzBsh0vhCRF7tiwRBxVi9UeLCqPYk_LfC6Ay4gDATAe971suIoYmCO5lOuWi3i36NCy7OMJ9wHXF2a3fSXCpWZE0GK3qelwxROw4KJIXyqhHx95pZo9U_VlPiP818wvAb05HLhfkaE18BiLJLPg8hbkg1zwXnH38nTq9Nrwkm5fx3hnTaAWlntH_2bhtdK1AV1FyjMWiCrwi0FY_o67_y1AIfsjzLDjOxBiyLBgdfKABgXCelyOYH1YER3QMP22TL5pquDKpLsurKksXQ";
- context.OpenId = "oztIn1UUivm09DvuqJjI8HakCCho";
+ context.OpenId = "9987b011-217b-e711-81ca-0248aae46430";
context.ApiVersion = "v37.0";
context.InstanceUrl = "https://msdemo.veevlink.com";
context.RefreshTokenProxyUrl = "https://dev.veevlink.com/Proxy/SFDCAccessTokenProxy.aspx";