Commit 173d4244 authored by hanfeng zhang's avatar hanfeng zhang

initiate page

parent 33dc8a1f
.DS_Store .DS_Store
<<<<<<< HEAD
node_modules/*
.vscode/
=======
/node_modules /node_modules
npm-debug.log npm-debug.log
.vscode .vscode
...@@ -12,4 +8,3 @@ package-lock.json ...@@ -12,4 +8,3 @@ package-lock.json
yarn.lock yarn.lock
yarn-error.log yarn-error.log
dist/ dist/
>>>>>>> develop-xhx
module.exports = { module.exports = {
presets: [ presets: [
'@vue/cli-plugin-babel/preset' '@vue/cli-plugin-babel/preset'
],
plugins: [
['import', {
libraryName: 'vant',
libraryDirectory: 'es',
style: true
}, 'vant'],
['import', {
libraryName: 'ant-design-vue',
libraryDirectory: 'lib',
style: true
}, 'ant-design-vue']
] ]
} }
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -15,27 +15,21 @@ ...@@ -15,27 +15,21 @@
"ant-design-vue": "^1.7.5", "ant-design-vue": "^1.7.5",
"bip39": "^3.0.4", "bip39": "^3.0.4",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"crypto-js": "^4.0.0",
"dexie": "^3.0.3", "dexie": "^3.0.3",
"ethereumjs-tx": "^2.1.2",
"ethereumjs-util": "^7.0.10",
"ethereumjs-wallet": "^1.0.1",
"jsqr": "^1.4.0", "jsqr": "^1.4.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"quagga": "^0.12.1", "quagga": "^0.12.1",
"register-service-worker": "^1.7.1", "register-service-worker": "^1.7.1",
"vant": "^2.12.21",
"vue": "^2.6.11", "vue": "^2.6.11",
"vue-date-pick": "^1.4.1",
"vue-router": "^3.2.0", "vue-router": "^3.2.0",
"vue-toast-mobile": "^2.0.0",
"vuescroll": "^4.17.3", "vuescroll": "^4.17.3",
"vuex": "^3.4.0", "vuex": "^3.4.0"
"web3": "^1.3.6"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.14.3", "@babel/core": "^7.14.3",
"@babel/preset-env": "^7.14.2", "@babel/preset-env": "^7.14.2",
"@types/animejs": "^3.1.3",
"@types/crypto-js": "^4.0.1",
"@types/lodash": "^4.14.170", "@types/lodash": "^4.14.170",
"@typescript-eslint/eslint-plugin": "^4.26.1", "@typescript-eslint/eslint-plugin": "^4.26.1",
"@typescript-eslint/parser": "^4.26.1", "@typescript-eslint/parser": "^4.26.1",
...@@ -54,6 +48,8 @@ ...@@ -54,6 +48,8 @@
"css-loader": "^5.2.6", "css-loader": "^5.2.6",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"eslint-plugin-vue": "^7.10.0", "eslint-plugin-vue": "^7.10.0",
"less": "^2.5.3",
"less-loader": "^5.0.0",
"postcss": "^7.0.35", "postcss": "^7.0.35",
"tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.2", "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.2",
"typescript": "~4.1.5", "typescript": "~4.1.5",
...@@ -64,6 +60,6 @@ ...@@ -64,6 +60,6 @@
"description": "## Project setup ``` yarn install ```", "description": "## Project setup ``` yarn install ```",
"main": "babel.config.js", "main": "babel.config.js",
"keywords": [], "keywords": [],
"author": "", "author": "hanfeng zhang",
"license": "ISC" "license": "ISC"
} }
<template> <template>
<div>
<div class="text-sm px-6 py-2 text-center cursor-pointer rounded my-3" :class="getSize && border" @click="eventEmit"> <div class="text-xs px-3 py-2 text-center cursor-pointer rounded my-3" :class="getSize && border" @click="eventEmit">
{{text}} {{text}}
</div> </div>
</div>
</template> </template>
<script lang="ts"> <script lang="ts">
...@@ -20,7 +20,6 @@ export default Vue.extend({ ...@@ -20,7 +20,6 @@ export default Vue.extend({
type: String, type: String,
required: true required: true
}, },
border:{ border:{
type: String, type: String,
default:'border border-app-dark-4' default:'border border-app-dark-4'
......
<template> <template>
<div v-if="!customize">
<a-icon :type="type" :class="color" /> <a-icon v-if="!customize" :type="type" :class="color" />
</div>
<div v-else> <app-icon v-else :type="type" class="color" :style='{fontSize:size,lineHeight:size,color:color}'></app-icon>
<app-icon :type="type" :class="color" :style='{fontSize:size}'></app-icon>
</div>
</template> </template>
<script lang="ts"> <script lang="ts">
...@@ -24,11 +23,11 @@ export default Vue.extend({ ...@@ -24,11 +23,11 @@ export default Vue.extend({
}, },
size:{ size:{
type:String, type:String,
default:'16px' default:'14px'
}, },
color:{ color:{
type:String, type:String,
default:' text-white' default:'#ffffff'
} }
}, },
components:{ components:{
......
<template>
<div v-if="show" class="fixed bottom-0 left-0 w-full">
<van-picker
show-toolbar
title="Title"
:columns="columns"
@confirm="onConfirm"
@cancel="onCancel"
@change="onChange"
/>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import { Picker } from 'vant';
Vue.use(Picker);
export default Vue.extend({
data() {
return {
columns: ['Delaware', 'Florida', 'Georqia', 'Indiana', 'Maine'],
show:false
};
},
methods:{
onConfirm() {
console.log(1);
},
onChange() {
console.log(2);
},
onCancel() {
console.log(3);
},
}
});
</script>
<template>
<div class="app-selector relative">
<div class="selector-input border pl-2 border-app-white w-48 py-2 rounded flex justify-around align-middle items-center" @click="toggleOptions">
<div class="input-value flex-grow text-xs">
<div class="flex align-middle">
<div v-if="selectedItem.icon" class="flex-grow-0 self-center">
<app-icon :type="'icon-'+selectedItem.icon" customize size='text-lg'></app-icon>
</div>
<div class='flex-grow self-center'>{{selectedValue}}</div>
</div>
</div>
<div class="input-icon flex align-middle opacity-60 flex-grow-0">
<app-icon :type="open?'up':'down'" size='text-xs'></app-icon>
</div>
</div>
<transition :css="false" @enter='handleEnter' @leave='handleLeave'>
<div class="item-list w-48 fixed" v-if="open">
<section v-for="i in listArr" :key ='i.value' class="item border border-app-dark-4 bg-opacity-95 bg-app-dark-3 text-app-dark-4 py-2 px-2 s-3" @click="selected(i)">{{i.text}}</section>
</div>
</transition>
</div>
</template>
<script lang="ts">
import anime, { AnimeInstance} from 'animejs'
import Vue,{PropType} from 'vue';
const options = {
// delay: (el:any, i:number) => i * 100,
duration: 500,
easing: "easeOutCubic"
}
interface Item {
text:string,
value?:number,
icon?:string
}
export default Vue.extend({
name: 'app-selector',
data(){
return{
open:false,
// uiAnime: {} as AnimeInstance,
selectedItem:{},
selectedValue:'',
coinIcon:''
}
},
props:{
listArr:{
type: Array as PropType<Item[]>,
required: true
},
defaultItem:{
type: Boolean,
default:false
}
},
components:{
'app-icon':()=>import('@/components/Icon.vue')
},
mounted(){
if(this.defaultItem){
this.selectedItem = this.listArr[0]
this.selectedValue = this.listArr[0].text
this.$emit('selected', this.selectedItem)
}
},
methods:{
handleEnter(el:any,done:any){
const section =
Array.from(el.querySelectorAll('section'))
anime({
targets:section,
tanslateY:[-50,0],
opacity:[0,1],
...options,
complete:done
})
},
handleLeave: (el:any, done:any) => {
const sections = Array.from(el.querySelectorAll("section"))
anime({
targets: sections.reverse(),
translateY: 0,
opacity: 0,
...options,
complete: done
})
},
selected(item:any){
if(item.text === this.selectedValue){
this.open = !this.open;
return;
}
this.selectedValue = item.text
this.selectedItem = item
this.$emit('selected', item)
if(this.open){
this.open = !this.open
}
},
toggleOptions(){
this.open = !this.open
},
}
});
</script>
import {CoinList} from '@/types/appTypes'
export const ERC20_COINS = [
{
name:'ethereum',
cn_title:'以太坊',
alis:'ETH',
main_chain:true
},
{
name:'Tether',
cn_title:'泰达币',
alis:'USDT',
c_addr:'0xdac17f958d2ee523a2206206994597c13d831ec7',
main_chain:false
},
{
name:'USD Coin',
cn_title:'',
alis:'USDC',
c_addr:'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
main_chain:false
},
{
name:'Uniswap',
cn_title:'',
alis:'UNI',
c_addr:'0x1f9840a85d5af5bf1d1762f925bdaddc4201f984',
main_chain:false
},
{
name:'Chainlink',
cn_title:'',
alis:'LINK',
c_addr:'0x514910771af9ca656af840dff83e8264ecf986ca',
main_chain:false
},
{
name:'Polygon',
cn_title:'',
alis:'MATIC',
c_addr:'0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0',
main_chain:false
},
{
name:'Binance USD',
cn_title:'',
alis:'BUSD',
c_addr:'0x4Fabb145d64652a948d72533023f6E7A623C7C53',
main_chain:false
},
{
name:'Wrapped Bitcoin',
cn_title:'',
alis:'WBTC',
c_addr:'0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',
main_chain:false
},
{
name:'Dai',
cn_title:'',
alis:'DAI',
c_addr:'0x6b175474e89094c44da98b954eedeac495271d0f',
main_chain:false
},
{
name:'Aave',
cn_title:'',
alis:'AAVE',
c_addr:'0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9',
main_chain:false
},
{
name:'SHIBA INU',
cn_title:'',
alis:'SHIB',
c_addr:'0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce',
main_chain:false
},
{
name:'Maker',
cn_title:'',
alis:'MKR',
c_addr:'0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2',
main_chain:false
},
{
name:'Crypto.com Coin',
cn_title:'',
alis:'CRO',
c_addr:'0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b',
main_chain:false
},
{
name:'FTX Token',
cn_title:'',
alis:'FTT',
c_addr:'0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9',
main_chain:false
}
]
const CHAIN33_COINS = [
{
name:'btyuan',
cn_title:'比特元',
alis:'BTY',
main_chain:true
}
]
const binanceList = [
{
name:'Cardano',
cn_title:'',
alis:'ADA',
c_addr:'0x3ee2200efb3400fabb9aacf31297cbdd1d435d47',
main_chain:false
},
{
name:'XRP',
cn_title:'',
alis:'XRP',
c_addr:'0x1d2f0da169ceb9fc7b3144628db156f3f6c60dbe',
main_chain:false
},
{
name:'Dogecoin',
cn_title:'',
alis:'DOGE',
c_addr:'0xba2ae424d960c26247dd6c32edc70b295c744c43',
main_chain:false
},
{
name:'Polkadot',
cn_title:'',
alis:'DOT',
c_addr:'0x7083609fce4d1d8dc0c979aab8c869ea2c873402',
main_chain:false
},
{
name:'Bitcoin Cash',
cn_title:'',
alis:'BCH',
c_addr:'0x8fF795a6F4D97E7887C79beA79aba5cc76444aDf',
main_chain:false
},
{
name:'Litecoin',
cn_title:'',
alis:'LTC',
c_addr:'0x4338665cbb7b2485a8855a139b75d5e34ab0db94',
main_chain:false
},
{
name:'EOS',
cn_title:'',
alis:'EOS',
c_addr:'0x56b6fb708fc5732dec1afc8d8556423a2edccbd6',
main_chain:false
},
{
name:'Filecoin',
cn_title:'',
alis:'FIL',
c_addr:'0x0d8ce2a99bb6e3b7db580ed848240e4a0f9ae153',
main_chain:false
},
{
name:'PancakeSwap',
cn_title:'',
alis:'CAKE',
c_addr:'0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82',
main_chain:false
},
]
\ No newline at end of file
export const currences = [
{
tag:'USD',
symbol:"$"
},
{ tag:'RMB', symbol:"¥"}
];
\ No newline at end of file
// 静态数据的存放地址
\ No newline at end of file
import Web3 from 'web3'
interface Web3Obj{
provider:Web3
id?:string
url:string
port?:string
}
interface ProviderConfig{
id?:string
url:string
port?:string
}
/**
* @description 默认使用infura
* @param id 用户账户 必填
* @param url provider地址
* @param version 版本号
* @returns
*/
export const ETH_PROVIDER = (config:ProviderConfig):Web3Obj=>{
let {id,url,port} = config
id = id?id:''
url = url?url:'https://ropsten.infura.io/v3/'
port = port?port:''
const provider = new Web3(url+port+id)
return {provider,id,url,port}
}
// /**
// * @description 默认使用infura
// * @param id 用户账户 必填
// * @param url provider地址
// * @param version 版本号
// * @returns
// */
// export const BIAN_PROVIDER = (id?: string,port=':443',url='https://bsc-dataseed1.binance.org/')=>{
// const provider = new Web3(url+port+id)
// return {provider,id,url,port}
// }
\ No newline at end of file
import Dexie, { IndexableType, Table } from 'dexie';
import { decryptCiphertext, encryptPlaintext } from './util';
import { Account, Chains, Excer } from "@/types/appTypes"
export const data_config = {
name:'MxM_wallet',
version:1,
tables:{
account:'++id,encryptedPrivateKey,publicKey,address,excer',
processes:'++id,coin_name,amount,execer,is_main,c_addr,status',
coin:'++id,name,excer,is_main,c_addr,amount,process_amount'
}
}
export class DB extends Dexie {
account: Table<Account, IndexableType>
processes: Table<Chains, IndexableType>
constructor() {
super(data_config.name);
this.version(data_config.version).stores(data_config.tables);
this.account = this.table('account');
this.processes = this.table('processes');
}
async getAccountList(): Promise<Account[]> {
const arr = await this.account.toArray();
return arr;
}
addAccount(key: string, { privateKey, publicKey, address , excer }: { privateKey: string, publicKey: string, address: string, excer: Excer }) {
return this.account.add({
encryptedPrivateKey: encryptPlaintext(key, privateKey),
publicKey,
address,
excer
})
}
/**
* @description 用地址获取账户
* @param address
* @returns
*/
async getAccount(address: string): Promise<Account | undefined> {
const account = await this.account.where('address').equals(address).first();
return account
}
async getPrivateKey(address: string, key: string): Promise<string | undefined> {
const account = await this.getAccount(address)
if (account) {
const encryptedPrivateKey = account.encryptedPrivateKey
const privateKey = decryptCiphertext(key, encryptedPrivateKey)
return privateKey;
}
return undefined
}
deleteAccount(address: string) {
return this.account.where('address').equals(address).delete()
}
}
import CryptoJS from "crypto-js";
export function encryptPlaintext(key: string, plaintext: string) {
const obj = {
plaintext,
mark: true,
}
return AES_ECB_ENCRYPT(JSON.stringify(obj), key);
}
export function decryptCiphertext(key: string, ciphertext: string) {
const str = AES_ECB_DECRYPT(ciphertext, key);
try {
const obj = JSON.parse(str)
if (obj.mark === true) {
return obj.plaintext;
} else {
throw new Error('密码错误')
}
} catch (err) {
throw new Error('密码错误')
}
}
/**
* AES-256-ECB对称加密
* @param text {string} 要加密的明文
* @param secretKey {string} 密钥,43位随机大小写与数字
* @returns {string} 加密后的密文,Base64格式
*/
function AES_ECB_ENCRYPT(text: string, secretKey: string) {
const keyHex = CryptoJS.enc.Base64.parse(secretKey);
const messageHex = CryptoJS.enc.Utf8.parse(text);
const encrypted = CryptoJS.AES.encrypt(messageHex, keyHex, {
"mode": CryptoJS.mode.ECB,
"padding": CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
/**
* AES-256-ECB对称解密
* @param textBase64 {string} 要解密的密文,Base64格式
* @param secretKey {string} 密钥,43位随机大小写与数字
* @returns {string} 解密后的明文
*/
function AES_ECB_DECRYPT(textBase64: string, secretKey: string) {
const keyHex = CryptoJS.enc.Base64.parse(secretKey);
const decrypt = CryptoJS.AES.decrypt(textBase64, keyHex, {
"mode": CryptoJS.mode.ECB,
"padding": CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Utf8.stringify(decrypt);
}
\ No newline at end of file
<template> <template>
<div class="Layout font-sans text-base bg-app-drak-1 page text-white"> <div class="Layout font-sans text-base bg-app-drak-1 page text-white">
<!-- <header>header</header> --> <!-- <header>header</header> -->
<app-overlay></app-overlay> <app-overlay></app-overlay>
<div class='content'> <div class='content'>
<slot> <slot>
...@@ -8,6 +9,7 @@ ...@@ -8,6 +9,7 @@
</slot> </slot>
</div> </div>
<app-navigator></app-navigator> <app-navigator></app-navigator>
<app-picker></app-picker>
<!-- <footer>mxmwebsite</footer> --> <!-- <footer>mxmwebsite</footer> -->
</div> </div>
</template> </template>
...@@ -21,7 +23,8 @@ export default Vue.extend({ ...@@ -21,7 +23,8 @@ export default Vue.extend({
name: 'Layout', name: 'Layout',
components:{ components:{
'app-overlay':()=>import('./overlay.vue'), 'app-overlay':()=>import('./overlay.vue'),
'app-navigator':()=>import('./navigator.vue') 'app-navigator':()=>import('./navigator.vue'),
'app-picker':()=>import('@/components/common/Picker.vue')
} }
}); });
</script> </script>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="flex fixed w-full justify-around bg-app-blue-1 " :class="getPosition"> <div class="flex fixed w-full justify-around bg-app-blue-1 " :class="getPosition">
<div v-for="(i,index) in navRoutes" :key="index" class="py-3 flex flex-col text-center " @click="navigating(i,index)"> <div v-for="(i,index) in navRoutes" :key="index" class="py-3 flex flex-col text-center " @click="navigating(i,index)">
<div class="self-center"> <div class="self-center">
<app-icon customize :type='i.meta.icon' size='20px' :color='index===activedIndex?"text-app-yellow-1":" text-white"'></app-icon> <app-icon customize :type='i.meta.icon' size='18px' :color='index===activedIndex?"#FFBB00":" #FFFFFF"'></app-icon>
</div> </div>
<div class=" pt-1 text-xs self-center" :class='index===activedIndex?"text-app-yellow-1":" text-white"'>{{i.meta.text}}</div> <div class=" pt-1 text-xs self-center" :class='index===activedIndex?"text-app-yellow-1":" text-white"'>{{i.meta.text}}</div>
</div> </div>
......
...@@ -12,3 +12,4 @@ declare module 'vue/types/vue' { ...@@ -12,3 +12,4 @@ declare module 'vue/types/vue' {
} }
} }
declare module 'vue-date-pick';
\ No newline at end of file
...@@ -23,3 +23,36 @@ body{ ...@@ -23,3 +23,36 @@ body{
height: calc(100vh - 390px) ; height: calc(100vh - 390px) ;
overflow-y: scroll; overflow-y: scroll;
} }
.vdpComponent{
font-size: 14px;
padding-left: 10px;
}
.vdpComponent input{
padding: 8px;
border-radius: 5px;
font-size: 14px;
box-shadow: inset 1px 1px rgb(146, 146, 146);
}
.vdpArrowPrev:after {
border-right-color: #cc99cd;
}
.vdpArrowNext:after {
border-left-color: #cc99cd;
}
.vdpCell.selectable:hover .vdpCellContent,
.vdpCell.selected .vdpCellContent {
background: #cc99cd;
}
.vdpCell.today {
color: #cc99cd;
}
.vdpTimeUnit > input:hover,
.vdpTimeUnit > input:focus {
border-bottom-color: #a117a3;
}
\ No newline at end of file
declare module 'vue-date-pick';
\ No newline at end of file
<template> <template>
<div class="flex flex-col"> <div>
发起 <initiate-founder v-if="isFounder"></initiate-founder>
</div> </div>
</template> </template>
...@@ -12,10 +12,13 @@ export default Vue.extend({ ...@@ -12,10 +12,13 @@ export default Vue.extend({
name: "Initiate", name: "Initiate",
data() { data() {
return { return {
isFounder: true
}; };
}, },
components:{
'initiate-founder':()=>import('./initiate_comp/founder_initiate.vue'),
// 'initiate-user':()=>import('./initiate_comp/user_initiate.vue')
}
}); });
</script> </script>
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
<div class="list w-full" @scroll="scrollStart"> <div class="list w-full" @scroll="scrollStart">
<app-card class=" mb-2"></app-card> <app-card class=" mb-2"></app-card>
<app-card2></app-card2> <app-card2></app-card2>
<div class="list-mergeup h-9"></div>
</div> </div>
</div> </div>
</div> </div>
......
<template>
<div>
<div class="title text-center text-lg py-10">发起活动</div>
<div class="form-contianer w-11/12 rounded-lg mx-auto border border-app-blue-3">
<div class="form p-3 text-sm">
<div class="time-picker py-3">
<div class='flex justify-between'>
<div>投票开始时间</div>
<div class='flex items-center'>
<span class=" text-xs">{{dateStart}}</span>
<date-pick v-model="dateStart" class=" self-center" >
<template v-slot:default="{toggle}">
<div @click="toggle">
<app-icon customize type='icon-rili' size='20px'> </app-icon>
</div>
</template>
</date-pick>
</div>
</div>
<input type="number" placeholder="请输入开始区块 当前区块3923288" class="w-full text-sm py-2 px-3 mt-2 rounded text-app-blue-1">
</div>
<div class="time-picker py-3">
<div class='flex justify-between'>
<div>投票截止时间</div>
<div class='flex items-center'>
<span class=" text-xs">{{dateEnd}}</span>
<date-pick v-model="dateEnd" >
<template v-slot:default="{toggle}">
<div @click="toggle" class="items-center">
<app-icon customize type='icon-rili' size='20px'> </app-icon>
</div>
</template>
</date-pick>
</div>
</div>
<input type="number" placeholder="请输入开始区块 当前区块3923288" class="w-full text-sm py-2 px-3 mt-2 rounded text-app-blue-1">
</div>
<div class="cell flex justify-between items-center border-b py-2 border-app-dark-4 ">
<div>每人参与次数设置</div>
<div class="flex items-center cursor-pointer" @click="pickToggle">
<div class=" text-xs">
每天一次
</div>
<app-icon customize type='icon-arrow-right-copy-copy'></app-icon>
</div>
</div>
<div class="cell flex justify-between items-center py-2 ">
<div>是否公开投票</div>
<van-switch v-model="checked" size="18px"/>
</div>
<div class="space h-11"></div>
</div>
</div>
<div class="w-11/12 mx-auto mt-5">
<app-btn text='发起活动' size="full" border='border-none' class=" bg-app-blue-3 rounded py-3"></app-btn>
</div>
</div>
</template>
<script lang="ts">
import DatePick from 'vue-date-pick';
import Vue from "vue";
import 'vue-date-pick/dist/vueDatePick.css';
import { Switch } from 'vant';
Vue.use(Switch);
export default Vue.extend({
components:{
DatePick,
"app-icon":()=>import('@/components/common/Icon.vue'),
"app-btn":()=>import('@/components/common/Btn.vue')
},
data() {
return {
dateStart: '2019-01-01',
dateEnd:'2019-02-02',
checked:true
};
},
methods:{
pickToggle(){
console.log(2222);
}
}
});
</script>
<style scoped>
input::placeholder{
font-size: 0.75rem;
}
</style>
\ No newline at end of file
<template>
<div class="flex flex-col">
首页
</div>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
data() {
return {
};
},
});
</script>
module.exports = { module.exports = {
// ...other vue-cli plugin options... // ...other vue-cli plugin options...
css: {
loaderOptions: {
less: {
javascriptEnabled: true, // 加载LESS 需要把JS设置一下
}
}
},
pwa: { pwa: {
name: 'My App', name: 'My App',
themeColor: '#4DBA87', themeColor: '#4DBA87',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment