提交 2760ba3a authored 作者: 王鹏飞's avatar 王鹏飞

update

上级 e149869f
module.exports = {
presets: ["@vue/cli-plugin-babel/preset"]
};
presets: ['@vue/cli-plugin-babel/preset'],
plugins: [
[
'import',
{
libraryName: 'vant',
libraryDirectory: 'es',
style: true
}
]
]
}
......@@ -898,7 +898,6 @@
"version": "7.8.7",
"resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.8.7.tgz?cache=0&sync_timestamp=1583373863450&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.8.7.tgz",
"integrity": "sha1-j+/OmALbVIgbpZ+Quyhxm0mWMk0=",
"dev": true,
"requires": {
"regenerator-runtime": "^0.13.4"
}
......@@ -1108,11 +1107,15 @@
"integrity": "sha1-aQoUdbhPKohP0HzXl8APXzE1bqg=",
"dev": true
},
"@vant/icons": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@vant/icons/-/icons-1.2.1.tgz",
"integrity": "sha512-5ivsKQR4ySbdBW5UPoQDVqO6rdc1um3rvq/0VL+ZSA7Y3MdBQ3E4/NL0hoAY5/sZZeYfIDKEP21gpjUzdeEDQQ=="
},
"@vue/babel-helper-vue-jsx-merge-props": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0.tgz",
"integrity": "sha1-BI/leZWNpAj7eosqPsBQtQpmEEA=",
"dev": true
"integrity": "sha1-BI/leZWNpAj7eosqPsBQtQpmEEA="
},
"@vue/babel-plugin-transform-vue-jsx": {
"version": "1.1.2",
......@@ -2063,6 +2066,37 @@
"integrity": "sha1-fjPY99RJs/ZzzXLeuavcVS2+Uo4=",
"dev": true
},
"axios": {
"version": "0.19.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
"integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
"requires": {
"follow-redirects": "1.5.10"
},
"dependencies": {
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
},
"follow-redirects": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
"requires": {
"debug": "=3.1.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"babel-eslint": {
"version": "10.1.0",
"resolved": "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.1.0.tgz?cache=0&sync_timestamp=1582676152339&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-eslint%2Fdownload%2Fbabel-eslint-10.1.0.tgz",
......@@ -2098,6 +2132,16 @@
"object.assign": "^4.1.0"
}
},
"babel-plugin-import": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.0.tgz",
"integrity": "sha512-bHU8m0SrY89ub2hBBuYjbennOeH0YUYkVpH6jxKFk0uD8rhN+0jNHIPtXnac+Vn7N/hgkLGGDcIoYK7je3Hhew==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/runtime": "^7.0.0"
}
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
......@@ -9214,8 +9258,7 @@
"regenerator-runtime": {
"version": "0.13.5",
"resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.5.tgz?cache=0&sync_timestamp=1584052392667&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.5.tgz",
"integrity": "sha1-2Hih0JS0MG0QuQlkhLM+vVXiZpc=",
"dev": true
"integrity": "sha1-2Hih0JS0MG0QuQlkhLM+vVXiZpc="
},
"regenerator-transform": {
"version": "0.14.3",
......@@ -11088,6 +11131,17 @@
"spdx-expression-parse": "^3.0.0"
}
},
"vant": {
"version": "2.5.5",
"resolved": "https://registry.npmjs.org/vant/-/vant-2.5.5.tgz",
"integrity": "sha512-w7APepClXcEMFJvvYsJkNDWCCb+a5SR9eAMMIYM/1VCwn7r7AxoAtJSCaZsmw3vhSxnMSnM/+Ftz7t3o0eoK4Q==",
"requires": {
"@babel/runtime": "7.x",
"@vant/icons": "1.2.1",
"@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
"vue-lazyload": "1.2.3"
}
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
......@@ -11154,6 +11208,11 @@
"integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
"dev": true
},
"vue-lazyload": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-1.2.3.tgz",
"integrity": "sha512-DC0ZwxanbRhx79tlA3zY5OYJkH8FYp3WBAnAJbrcuoS8eye1P73rcgAZhyxFSPUluJUTelMB+i/+VkNU/qVm7g=="
},
"vue-loader": {
"version": "15.9.0",
"resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.0.tgz?cache=0&sync_timestamp=1581493588582&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.0.tgz",
......@@ -11175,6 +11234,21 @@
}
}
},
"vue-meta": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.3.3.tgz",
"integrity": "sha512-FmeekLkd5+BI7NFBnU4bEnTpVZqmu3q8ztW4R4U3GBQljgDM7QAuwMXs8/aJP0U1tjtxobX8T6HcyZXimGj1DQ==",
"requires": {
"deepmerge": "^4.2.2"
},
"dependencies": {
"deepmerge": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
}
}
},
"vue-router": {
"version": "3.1.6",
"resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.1.6.tgz?cache=0&sync_timestamp=1584203273341&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.1.6.tgz",
......@@ -11214,6 +11288,11 @@
"integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=",
"dev": true
},
"vuex": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.3.tgz",
"integrity": "sha512-k8vZqNMSNMgKelVZAPYw5MNb2xWSmVgCKtYKAptvm9YtZiOXnRXFWu//Y9zQNORTrm3dNj1n/WaZZI26tIX6Mw=="
},
"watchpack": {
"version": "1.6.0",
"resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz",
......
......@@ -8,9 +8,13 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^0.19.2",
"core-js": "^3.6.4",
"vant": "^2.5.5",
"vue": "^2.6.11",
"vue-router": "^3.1.5"
"vue-meta": "^2.3.3",
"vue-router": "^3.1.5",
"vuex": "^3.1.3"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.2.0",
......@@ -19,6 +23,7 @@
"@vue/cli-service": "~4.2.0",
"@vue/eslint-config-prettier": "^6.0.0",
"babel-eslint": "^10.0.3",
"babel-plugin-import": "^1.13.0",
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.1.1",
"eslint-plugin-vue": "^6.1.2",
......
......@@ -3,9 +3,12 @@
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"
/>
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
<title><%= htmlWebpackPlugin.options.title %></title>
<title>紫荆办事大厅</title>
<script>
;(function(win, doc) {
function resizeRoot() {
......
<template>
<div id="app">
<router-view />
<router-view :key="$route.fullPath" />
</div>
</template>
......
......@@ -97,3 +97,66 @@ body {
'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
background-color: #f4f4f4;
}
.fixed-box {
height: 70px;
padding: 15px 0;
}
.fixed-inner {
position: fixed;
left: 0;
right: 0;
bottom: 0;
padding: 15px 30px;
max-width: 750px;
margin: 0 auto;
background: rgba(255, 255, 255, 1);
box-shadow: 0px -4px 8px 0px rgba(0, 0, 0, 0.05);
}
.fixed-button {
height: 40px;
line-height: 40px;
text-align: center;
color: #fff;
background: linear-gradient(
180deg,
rgba(255, 155, 150, 1) 0%,
rgba(206, 62, 58, 1) 100%
);
border-radius: 5px;
cursor: pointer;
}
.empty {
margin-top: 100px;
padding-top: 140px;
font-size: 15px;
color: #333;
background: url('~@/assets/img/icon_warning.png') no-repeat center top;
background-size: 93px 93px;
text-align: center;
}
.form-tips {
padding: 0 30px 10px;
font-size: 12px;
color: #999;
}
.form {
padding: 0 14px 30px;
}
.form .van-cell {
flex-direction: column;
}
.form input.van-field__control,
.form textarea.van-field__control {
height: 40px;
padding: 0 20px;
border: 1px solid #999;
}
.form .van-field__label {
margin-bottom: 10px;
}
.form .van-field--error .van-field__control,
.form .van-field--error .van-field__control::placeholder {
color: #999;
-webkit-text-fill-color: currentColor;
}
<template>
<div class="card">
<div class="card-title">{{ data.title }}</div>
<div class="card-main">
<div class="card-content">
<div class="p-item" v-for="item in fields" :key="item.name">
<div class="p-title">{{ item.label }}</div>
<div class="p-content">{{ data[item.name] }}</div>
</div>
</div>
<div class="card-aside">
<div class="card-status">
<div class="icon-seal"></div>
</div>
<div class="card-tools">
<div class="card-button" @click="onEdit">编辑</div>
<div class="card-button" @click="onRemove">删除</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'Card',
props: {
data: Object,
fields: {
type: Array,
default() {
return []
}
}
},
methods: {
onEdit() {
this.$router.push({ name: 'create', query: this.$route.query })
},
onRemove() {
this.$emit('remove', this.data)
}
}
}
</script>
<style lang="scss" scoped>
.card {
margin: 15px 0 20px;
padding: 10px 20px 20px;
background: rgba(255, 255, 255, 1);
box-shadow: 0px 3px 15px 0px rgba(0, 0, 0, 0.06);
}
.is-red {
color: #ab2824;
}
.card-title {
font-size: 15px;
color: #333;
}
.p-item {
margin-top: 10px;
display: flex;
}
.p-title {
font-size: 12px;
color: #999;
}
.p-content {
font-size: 12px;
color: #333;
}
.card-main {
display: flex;
}
.card-content {
flex: 1;
overflow: hidden;
}
.card-aside {
width: 60px;
margin-left: 20px;
display: flex;
flex-direction: column;
}
.card-status {
flex: 1;
.icon-seal {
margin-left: -10px;
width: 90px;
height: 70px;
background: url('~@/assets/img/icon_seal.png') no-repeat;
background-size: contain;
}
}
.card-tools {
padding: 10px 0 0 0;
}
.card-button {
margin-top: 18px;
width: 60px;
height: 25px;
font-size: 12px;
line-height: 25px;
text-align: center;
color: #999;
border-radius: 5px;
border: 1px solid rgba(153, 153, 153, 1);
cursor: pointer;
&:first-child {
margin-top: 0;
}
}
</style>
<template>
<van-form
ref="form"
class="form"
validate-trigger="onChange"
v-bind="$attrs"
v-on="$listeners"
>
<template v-for="(item, index) in fields">
<div class="form-item" :key="index">
<!-- 时间 -->
<template v-if="item.fieldType === 'datetime'">
<van-field
readonly
clickable
:border="false"
v-bind="item"
v-model="ruleForm[item.name]"
@click="showDatetimePicker(item.name)"
/>
</template>
<!-- 上传图片 -->
<van-field
:border="false"
:label="item.label"
v-else-if="item.fieldType === 'uploader'"
>
<template #input>
<van-uploader v-model="ruleForm[item.name]" />
</template>
</van-field>
<!-- 文本框 -->
<van-field
:border="false"
v-bind="item"
v-model="ruleForm[item.name]"
v-else
/>
<van-popup v-model="timePickerVisible" position="bottom">
<van-datetime-picker
type="datetime"
:value="timePickerValue"
:min-date="minDate"
@confirm="handleTimePickerConfirm"
@cancel="timePickerVisible = false"
/>
</van-popup>
</div>
</template>
</van-form>
</template>
<script>
export default {
name: 'VForm',
props: {
params: {
type: Object,
default() {
return {}
}
},
fields: {
type: Array,
required: true,
default() {
return []
}
}
},
data() {
return {
ruleForm: this.params,
timePickerVisible: false,
timePickerName: '',
timePickerValue: '',
minDate: new Date()
}
},
methods: {
showDatetimePicker(name) {
this.timePickerVisible = true
this.timePickerName = name
this.timePickerValue = this.ruleForm[name]
},
handleTimePickerConfirm(time) {
this.ruleForm[this.timePickerName] = time
this.timePickerVisible = false
},
submit() {
return this.$refs.form.submit()
}
}
}
</script>
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br />
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener"
>vue-cli documentation</a
>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li>
<a
href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel"
target="_blank"
rel="noopener"
>babel</a
>
</li>
<li>
<a
href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router"
target="_blank"
rel="noopener"
>router</a
>
</li>
<li>
<a
href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint"
target="_blank"
rel="noopener"
>eslint</a
>
</li>
</ul>
<h3>Essential Links</h3>
<ul>
<li>
<a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a>
</li>
<li>
<a href="https://forum.vuejs.org" target="_blank" rel="noopener"
>Forum</a
>
</li>
<li>
<a href="https://chat.vuejs.org" target="_blank" rel="noopener"
>Community Chat</a
>
</li>
<li>
<a href="https://twitter.com/vuejs" target="_blank" rel="noopener"
>Twitter</a
>
</li>
<li>
<a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a>
</li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li>
<a href="https://router.vuejs.org" target="_blank" rel="noopener"
>vue-router</a
>
</li>
<li>
<a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a>
</li>
<li>
<a
href="https://github.com/vuejs/vue-devtools#vue-devtools"
target="_blank"
rel="noopener"
>vue-devtools</a
>
</li>
<li>
<a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener"
>vue-loader</a
>
</li>
<li>
<a
href="https://github.com/vuejs/awesome-vue"
target="_blank"
rel="noopener"
>awesome-vue</a
>
</li>
</ul>
</div>
</template>
<script>
export default {
name: "HelloWorld",
props: {
msg: String
}
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss">
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>
<template>
<div class="main-layout">
<header class="main-header">
<menu class="menu" :class="{ 'is-show': menuVisible }">
<div class="inner">
<div class="menu-icon" @click="toggleMenu">
<span></span><span></span><span></span>
</div>
<ul class="menu-list">
<li @click="toPage({ name: 'channel' })">首页</li>
<li @click="toPage({ name: 'list', query: { channel: '1' } })">
学术活动
</li>
<li @click="toPage({ name: 'list', query: { channel: '2' } })">
乐分享
</li>
<li @click="toPage({ name: 'list', query: { channel: '3' } })">
重修
</li>
<li @click="$router.back()">返回上一页</li>
</ul>
</div>
</menu>
</header>
<div class="main-body">
<router-view />
</div>
</div>
</template>
<script>
export default {
name: 'PageContainer',
data() {
return {
menuVisible: false
}
},
methods: {
toggleMenu() {
this.menuVisible = !this.menuVisible
},
toPage(route) {
this.menuVisible = false
this.$router.push({
name: route.name,
query: Object.assign({}, this.$route.query, route.query)
})
}
}
}
</script>
<style lang="scss">
.menu {
height: 60px;
}
.menu .inner {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 60px;
padding: 20px 30px;
z-index: 100;
background-color: #fff;
max-width: 750px;
margin: 0 auto;
}
.menu.is-show {
.menu-list {
display: block;
}
.menu-icon {
width: 18px;
height: 20px;
flex-direction: inherit;
}
.menu-icon span {
width: 2px;
height: 18px;
}
}
.menu-icon {
position: absolute;
right: 30px;
width: 20px;
height: 18px;
cursor: pointer;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.menu-icon span {
width: 20px;
height: 2px;
background: #333;
}
.menu-list {
position: absolute;
top: 20px;
right: 25px;
display: none;
margin-top: 30px;
width: 180px;
background: #fff;
box-shadow: 0px 2px 20px 0px rgba(0, 0, 0, 0.2);
li {
height: 60px;
line-height: 60px;
color: #333;
text-align: center;
border-top: 1px solid #f5f5f5;
cursor: pointer;
&:first-child {
border: 0;
}
}
&::before {
position: absolute;
top: -6px;
right: 8px;
content: ' ';
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 6px;
border-top-width: 0;
border-bottom-color: #fff;
}
}
</style>
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import router from './router/index.js'
import store from '@/store'
// vue-meta
import VueMeta from 'vue-meta'
Vue.use(VueMeta)
// vant
import { Notify } from 'vant'
Vue.use(Notify)
import { Dialog } from 'vant'
Vue.use(Dialog)
import { Popup } from 'vant'
Vue.use(Popup)
import { Overlay } from 'vant'
Vue.use(Overlay)
import { Form } from 'vant'
Vue.use(Form)
import { Field } from 'vant'
Vue.use(Field)
import { Checkbox, CheckboxGroup } from 'vant'
Vue.use(Checkbox)
Vue.use(CheckboxGroup)
import { RadioGroup, Radio } from 'vant'
Vue.use(Radio)
Vue.use(RadioGroup)
import { DatetimePicker } from 'vant'
Vue.use(DatetimePicker)
import { Uploader } from 'vant'
Vue.use(Uploader)
import { List } from 'vant'
Vue.use(List)
// 公共css
import '@/assets/css/base.css'
......@@ -8,6 +49,7 @@ import '@/assets/css/base.css'
Vue.config.productionTip = false
new Vue({
store,
router,
render: h => h(App)
}).$mount('#app')
import Vue from 'vue'
import VueRouter from 'vue-router'
// 账号
import account from './views/account/router.js'
// 频道
import channel from './views/channel/router.js'
// 学术活动
import learn from './views/learn/router.js'
// 乐分享
import share from './views/share/router.js'
// 重修
import rebuild from './views/rebuild/router.js'
Vue.use(VueRouter)
const routes = [
{ path: '/', redirect: '/channel' },
...account,
...channel,
...learn,
...share,
...rebuild
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
import Vue from 'vue'
import VueRouter from 'vue-router'
// import Home from '../views/Home.vue'
import Layout from '@/components/Layout.vue'
Vue.use(VueRouter)
const routes = [
// {
// path: '/',
// name: 'Home',
// component: Home
// },
{ path: '/', redirect: '/channel' },
{
path: '/login',
name: 'Login',
component: () =>
import(/* webpackChunkName: "login" */ '../views/Login.vue')
name: 'channel',
path: '/channel',
component: () => import('@/views/Channel.vue')
},
{
path: '/list',
component: Layout,
children: [
{ name: 'list', path: '', component: () => import('@/views/List.vue') }
]
},
{
path: '/create',
component: Layout,
children: [
{
name: 'create',
path: '',
component: () => import('@/views/Create.vue')
}
]
},
{
path: '/edit',
component: Layout,
children: [
{ name: 'edit', path: '', component: () => import('@/views/Edit.vue') }
]
}
]
......
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
menuCollapse: false
},
mutations: {
toggleMenuCollapse(state, collapse) {
state.menuCollapse = collapse
}
},
actions: {}
})
import axios from 'axios'
// import qs from 'qs'
import { Toast } from 'vant'
// import router from '@/router'
// import store from '../store'
const httpRequest = axios.create({
baseURL: 'https://some-domain.com/api/',
timeout: 60000,
headers: { token: 'token' }
})
// 请求拦截
httpRequest.interceptors.request.use(
function(config) {
return config
},
function(error) {
return Promise.reject(error)
}
)
// 响应拦截
httpRequest.interceptors.response.use(
function(response) {
return response.data
},
function(error) {
Toast({ type: 'error', message: error })
return Promise.reject(error)
}
)
export default httpRequest
export default {
// 学术活动
1: {
list: {
title: '学术活动',
emptyText: '您还没有申请过学术活动',
buttonText: '申请新的活动',
card: {
fields: [
{ name: 'time', label: '活动时间' },
{ name: 'user', label: '主讲人' },
{ name: 'status', label: '审核状态' },
{ name: 'time2', label: '审核时间' },
{ name: 'beizhu', label: '备注' }
]
}
},
create: {
title: '申请新的学术活动',
tips:
'温馨提示:学生自发组织的各类校友活动,包括并不限于:论坛、讲座、沙龙、参访、拓展、游学等,接受紫荆-索菲亚金融方向工商管理硕士学位中心的监督与指导。',
buttonText: '提交',
form: {
fields: [
{
name: 'name',
label: '名称',
required: true,
placeholder: '请输入学术活动名称',
rules: [{ required: true, message: '请输入学术活动名称' }]
},
{
fieldType: 'datetime',
name: 'time',
label: '时间',
required: true,
placeholder: '请选择学术活动时间',
rules: [{ required: true, message: '请选择学术活动时间' }]
},
{
name: 'user',
label: '主讲人',
required: true,
placeholder: '请输入主讲人姓名',
rules: [{ required: true, message: '请输入主讲人姓名' }]
},
{
name: 'address',
label: '地址',
required: true,
placeholder: '请输入活动地址',
rules: [{ required: true, message: '请输入活动地址' }]
},
{
type: 'textarea',
name: 'content',
label: '内容',
required: true,
placeholder: '请输入学术活动内容',
rules: [{ required: true, message: '请输入学术活动内容' }]
}
]
}
},
edit: {}
},
// 乐分享
2: {
list: {
title: '乐分享',
emptyText: '您还没有申请过乐分享',
buttonText: '申请新的分享',
card: {
fields: [
{ name: 'time', label: '班级' },
{ name: 'user', label: '申请人' },
{ name: 'tel', label: '电话' },
{ name: 'status', label: '审核状态' },
{ name: 'time2', label: '审核时间' },
{ name: 'beizhu', label: '备注' }
]
}
},
create: {
title: '申请新的分享',
buttonText: '提交',
form: {
fields: [
{
name: 'name',
label: '姓名',
required: true,
placeholder: '请输入姓名',
rules: [{ required: true, message: '请输入姓名' }]
},
{
name: 'type',
label: '行业',
required: true,
placeholder: '请输入行业',
rules: [{ required: true, message: '请输入行业' }]
},
{
name: 'age',
label: '年龄',
required: true,
placeholder: '请输入年龄',
rules: [{ required: true, message: '请输入年龄' }]
},
{
name: 'level',
label: '班级',
required: true,
placeholder: '请输入班级',
rules: [{ required: true, message: '请输入班级' }]
},
{
type: 'tel',
name: 'tel',
label: '电话',
required: true,
placeholder: '请输入电话',
rules: [{ required: true, message: '请输入电话' }]
},
{
type: 'textarea',
name: 'content',
label: '内容',
required: true,
placeholder: '请输入乐分享内容',
rules: [{ required: true, message: '请输入乐分享内容' }]
}
]
}
},
edit: {}
},
// 重修
3: {
list: {
title: '重修',
emptyText: '您还没有申请过重修',
buttonText: '申请重修',
card: {
fields: [
{ name: 'time', label: '班级' },
{ name: 'user', label: '挂科学期' },
{ name: 'status', label: '审核状态' },
{ name: 'time2', label: '审核时间' },
{ name: 'beizhu', label: '备注' }
]
}
},
create: {
title: '申请重修',
buttonText: '提交',
form: {
fields: [
{
name: 'name',
label: '姓名',
required: true,
placeholder: '请输入姓名',
rules: [{ required: true, message: '请输入姓名' }]
},
{
name: 'level',
label: '班级',
required: true,
placeholder: '请输入班级',
rules: [{ required: true, message: '请输入班级' }]
},
{
name: 'level',
label: '挂科学期',
required: true,
placeholder: '请选择挂科学期',
rules: [{ required: true, message: '请选择挂科学期' }]
},
{
name: 'tel',
label: '重修课程名称',
required: true,
placeholder: '请选择重修课程名称',
rules: [{ required: true, message: '请选择重修课程名称' }]
},
{
fieldType: 'uploader',
name: 'uploader',
label: '上传缴费凭证',
required: true,
placeholder: '请上传缴费凭证',
rules: [{ required: true, message: '请上传缴费凭证' }]
}
]
}
},
edit: {}
}
}
<template>
<div class="choose">
<h2 class="choose-title">请选择事务</h2>
<div class="choose-list">
<van-radio-group v-model="radio">
<div class="choose-item" v-for="item in list" :key="item.value">
<van-radio :name="item.value">{{ item.label }}</van-radio>
</div>
</van-radio-group>
</div>
<div class="fixed-box">
<div class="fixed-inner">
<div class="fixed-button" @click="toListPage">下一步</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
list: [
{ value: '1', label: '学术活动' },
{ value: '2', label: '乐分享' },
{ value: '3', label: '重修' }
],
radio: '1'
}
},
methods: {
toListPage() {
this.$router.push({
name: 'list',
query: Object.assign(this.$route.query, { channel: this.radio })
})
}
}
}
</script>
<style lang="scss">
.choose {
padding: 30px;
}
.choose-title {
font-size: 19px;
font-weight: normal;
}
.choose-list {
margin-top: 46px;
}
.choose-item {
margin-bottom: 50px;
}
</style>
<template>
<div class="choose">
<h2 class="choose-title">请选择事务</h2>
<div class="choose-list">
<ul>
<li></li>
</ul>
</div>
</div>
</template>
<script>
export default {
data() {
return {}
}
}
</script>
<style lang="scss"></style>
<template>
<div class="main">
<div class="form-tips">{{ page.tips }}</div>
<v-form ref="form" :fields="page.form.fields" @submit="onSubmit"></v-form>
<div class="fixed-box">
<div class="fixed-inner">
<div class="fixed-button" @click="onSubmit">提交</div>
</div>
</div>
</div>
</template>
<script>
import pages from '@/utils/pages.js'
import VForm from '@/components/Form'
export default {
name: 'Create',
components: { VForm },
metaInfo() {
return {
title: this.page.title
}
},
data() {
return {}
},
watch: {
$route: {
immediate: true,
deep: true,
handler(route) {
if (!route.query.channel) {
this.$dialog
.alert({
message: '请选择事务'
})
.then(() => {
this.$router.replace({
name: 'channel',
query: this.$route.query
})
})
}
}
}
},
computed: {
// 页面配置
page() {
const channel = this.$route.query.channel
return pages[channel] ? pages[channel]['create'] : {}
}
},
methods: {
onSubmit() {
this.$refs.form.submit()
console.log(this.form)
}
}
}
</script>
<style lang="scss"></style>
<template>
<div class="main">
<div class="form-tips">{{ page.tips }}</div>
<v-form ref="form" :fields="page.form.fields" @submit="onSubmit"></v-form>
<div class="fixed-box">
<div class="fixed-inner">
<div class="fixed-button" @click="onSubmit">提交</div>
</div>
</div>
</div>
</template>
<script>
import pages from '@/utils/pages.js'
import VForm from '@/components/Form'
export default {
name: 'Create',
components: { VForm },
metaInfo() {
return {
title: this.page.title
}
},
data() {
return {}
},
watch: {
$route: {
immediate: true,
deep: true,
handler(route) {
if (!route.query.channel) {
this.$dialog
.alert({
message: '请选择事务'
})
.then(() => {
this.$router.replace({
name: 'channel',
query: this.$route.query
})
})
}
}
}
},
computed: {
// 页面配置
page() {
const channel = this.$route.query.channel
return pages[channel] ? pages[channel]['create'] : {}
}
},
methods: {
onSubmit() {
this.$refs.form.submit()
console.log(this.form)
}
}
}
</script>
<style lang="scss"></style>
<template>
<div class="list">
<van-list
v-model="loading"
:finished="finished"
finished-text="没有更多了"
@load="onLoad"
v-if="list.length"
>
<card
v-for="item in list"
:fields="page.card.fields"
:data="item"
:key="item.id"
@remove="onRemove"
></card>
</van-list>
<div class="empty" v-else>{{ page.emptyText }}</div>
<div class="fixed-box">
<div class="fixed-inner">
<div class="fixed-button" @click="toCreatePage">
{{ page.buttonText }}
</div>
</div>
</div>
</div>
</template>
<script>
import pages from '@/utils/pages.js'
import Card from '@/components/Card.vue'
export default {
components: { Card },
metaInfo() {
return {
title: this.page.title
}
},
data() {
return {
list: [
{
id: '0',
title: '金融沙龙活动',
time: '2020.02.10',
user: '王鹏飞',
time2: '2020.02.10'
},
{
id: '1',
title: '金融沙龙活动234234',
time: '2020.02.10',
user: '王鹏飞sdf',
time2: '2020.02.10'
}
],
loading: false,
finished: true
}
},
watch: {
$route: {
immediate: true,
deep: true,
handler(route) {
if (!route.query.channel) {
this.$dialog
.alert({
message: '请选择事务'
})
.then(() => {
this.$router.replace({
name: 'channel',
query: this.$route.query
})
})
}
}
}
},
computed: {
// 页面配置
page() {
const channel = this.$route.query.channel
return pages[channel] ? pages[channel]['list'] : {}
}
},
methods: {
getList() {},
onLoad() {
this.getList()
},
toCreatePage() {
this.$router.push({ name: 'create', query: this.$route.query })
},
onRemove() {
this.$dialog
.confirm({
title: '提示',
confirmButtonText: '确定',
message: '确定删除'
})
.then(() => {
// on confirm
})
.catch(() => {
// on cancel
})
}
}
}
</script>
<style lang="scss">
.list {
}
</style>
......@@ -7,34 +7,50 @@
<div class="login-bd">
<div class="login-form">
<div class="login-form__item">
<input
type="text"
class="login-input"
placeholder="手机/邮箱/用户名"
/>
<input type="text" class="login-input" placeholder="手机/邮箱/用户名" v-model="form.account" />
</div>
<div class="login-form__item">
<input type="password" class="login-input" placeholder="密码" />
<input type="password" class="login-input" placeholder="密码" v-model="form.password" />
</div>
<div class="login-form__item">
<label>
<input type="checkbox" class="login-checkbox" /> 下次自动登录
</label>
<van-checkbox v-model="checked" shape="square">下次自动登录</van-checkbox>
</div>
<div class="login-form__item">
<div class="login-button">登录</div>
<div class="login-button" @click="handleSubmit">登录</div>
</div>
</div>
</div>
<div class="login-ft">
<p class="login-tips">
登录遇到困难?请点击<a href="">找回密码</a>
登录遇到困难?请点击
<a href>找回密码</a>
<!-- <router-link :to="{ name: forgetPassword }">找回密码</router-link> -->
</p>
</div>
</div>
</template>
<script>
export default {
data() {
return {
form: {
account: '',
password: ''
},
checked: false
}
},
methods: {
handleSubmit() {
if (!this.form.account) {
this.$notify('请输入手机/邮箱/用户名')
} else if (!this.form.password) {
this.$notify('请输入密码')
}
}
}
}
</script>
<style lang="scss">
.login {
min-height: 100vh;
......@@ -44,13 +60,13 @@
.logo {
width: 136px;
height: 44px;
background: url('../assets/img/logo.png') no-repeat;
background: url('~@/assets/img/logo.png') no-repeat;
background-size: contain;
}
.login-hd {
min-height: 170px;
padding: 30px 0 0 30px;
background: url('../assets/img/login_bg.png') no-repeat right top;
background: url('~@/assets/img/login_bg.png') no-repeat right top;
background-size: 152px 170px;
}
.login-title {
......@@ -91,7 +107,7 @@
padding-right: 90px;
font-size: 15px;
line-height: 60px;
background: url('../assets/img/login_button.png') no-repeat right center;
background: url('~@/assets/img/login_button.png') no-repeat right center;
background-size: contain;
cursor: pointer;
}
......
export default [
{
path: '/login',
meta: { title: '登录' },
component: () =>
import(/* webpackChunkName: "account" */ './components/Login.vue')
}
]
<template>
<div class="choose">
<h2 class="choose-title">请选择事务</h2>
<div class="choose-list">
<van-radio-group v-model="radio">
<div class="choose-item" v-for="item in list" :key="item.value">
<van-radio :name="item.value">{{ item.label }}</van-radio>
</div>
</van-radio-group>
</div>
<div class="fixed-box">
<div class="fixed-inner">
<div class="fixed-button" @click="handClick">下一步</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
list: [
{ value: '1', label: '学术活动' },
{ value: '2', label: '乐分享' },
{ value: '3', label: '重修' }
],
radio: '1'
}
},
methods: {
handClick() {
const map = {
1: 'learn',
2: 'share',
3: 'rebuild'
}
const routeName = map[this.radio]
this.$router.push({ name: routeName, query: this.$router.query })
}
}
}
</script>
<style lang="scss">
.choose {
padding: 30px;
}
.choose-title {
font-size: 19px;
font-weight: normal;
}
.choose-list {
margin-top: 46px;
}
.choose-item {
margin-bottom: 50px;
}
</style>
export default [
{
path: '/channel',
meta: { title: '紫荆办事大厅' },
component: () => import('./components/Index.vue')
}
]
import httpRequest from '@/utils/axios'
// 登录
export function login(data) {
return httpRequest({
url: '/api/login',
method: 'post',
data
})
}
<template>
<div class="main">
<div class="form-tips">
温馨提示:学生自发组织的各类校友活动,包括并不限于:论坛、讲座、沙龙、参访、拓展、游学等,接受紫荆-索菲亚金融方向工商管理硕士学位中心的监督与指导。
</div>
<van-form
@submit="onSubmit"
ref="form"
class="form"
validate-trigger="onChange"
>
<van-field
v-model="form.name"
label="名称"
required
placeholder="请输入学术活动名称"
:border="false"
:rules="[{ required: true, message: '请输入学术活动名称' }]"
/>
<van-field
readonly
clickable
v-model="form.time"
label="时间"
required
placeholder="请选择学术活动时间"
:border="false"
:rules="[{ required: true, message: '请选择学术活动时间' }]"
@click="timePickerVisible = true"
/>
<van-popup v-model="timePickerVisible" position="bottom">
<van-datetime-picker
type="datetime"
:value="form.time"
:min-date="minDate"
@confirm="handleTimePickerConfirm"
@cancel="timePickerVisible = false"
/>
</van-popup>
<van-field
v-model="form.user"
label="主讲人"
required
placeholder="请输入主讲人姓名"
:border="false"
:rules="[{ required: true, message: '请输入主讲人姓名' }]"
/>
<van-field
v-model="form.address"
label="地址"
required
placeholder="请输入活动地址"
:border="false"
:rules="[{ required: true, message: '请输入活动地址' }]"
/>
<van-field
v-model="form.content"
type="textarea"
label="内容"
required
placeholder="请输入学术活动内容"
:border="false"
:rules="[{ required: true, message: '请输入学术活动内容' }]"
/>
</van-form>
<div class="fixed-box">
<div class="fixed-inner">
<div class="fixed-button" @click="onSubmit">提交</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
form: {
name: '',
time: '',
user: '',
address: '',
content: ''
},
timePickerVisible: false,
minDate: new Date()
}
},
methods: {
handleTimePickerConfirm(time) {
this.form.time = time
this.timePickerVisible = false
},
onSubmit() {
this.$refs.form.submit()
console.log(this.form)
}
}
}
</script>
<style lang="scss"></style>
<template>
<div></div>
</template>
<script>
export default {}
</script>
<style lang="scss">
</style>
\ No newline at end of file
<template>
<div class="list">
<van-list
v-model="loading"
:finished="finished"
finished-text="没有更多了"
@load="onLoad"
v-if="list.length"
>
<van-cell v-for="item in list" :key="item" :title="item" />
</van-list>
<div class="empty" v-else>您还没有申请过学术活动</div>
<div class="fixed-box">
<div class="fixed-inner">
<div
class="fixed-button"
@click="$router.push({ name: 'learnCreate' })"
>
申请新的活动
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
list: [],
loading: false,
finished: true
}
},
methods: {
getList() {},
onLoad() {
this.getList()
}
}
}
</script>
<style lang="scss">
.list {
overflow: hidden;
min-height: 100vh;
}
</style>
<template>
<div class="card">
<div class="card-title"></div>
<div class="card-main">
<div class="card-content">
<div class="p-item">
<div class="p-title">班级:</div>
<div class="p-content"></div>
</div>
<div class="p-item">
<div class="p-title">申请人:</div>
<div class="p-content"></div>
</div>
<div class="p-item">
<div class="p-title">电话:</div>
<div class="p-content"></div>
</div>
<div class="p-item">
<div class="p-title">审核状态:</div>
<div class="p-content"></div>
</div>
<div class="p-item">
<div class="p-title">审核时间:</div>
<div class="p-content"></div>
</div>
</div>
</div>
<div class="card-tools">
<div class="card-button">编辑</div>
<div class="card-button">删除</div>
</div>
</div>
</template>
<script>
export default {
name: 'Card',
props: {
data: Object
},
data() {
return {
}
}
}
</script>
<style lang="scss" scoped>
.card {
}
.is-red {
color: #ab2824;
}
.p-title {
font-size: 12px;
color: #999;
}
.p-content {
font-size: 12px;
color: #333;
}
.card-button {
width: 60px;
height: 25px;
border-radius: 5px;
border: 1px solid rgba(153, 153, 153, 1);
}
</style>
export default [
{
name: 'learn',
path: '/learn',
meta: { title: '学术活动' },
component: () =>
import(/* webpackChunkName: "learn" */ './components/List.vue')
},
{
name: 'learnCreate',
path: '/learn/create',
meta: { title: '申请新的活动' },
component: () =>
import(/* webpackChunkName: "learn" */ './components/Edit.vue')
},
{
name: 'learnItem',
path: '/learn/item',
meta: { title: '学术活动' },
component: () =>
import(/* webpackChunkName: "learn" */ './components/Item.vue')
}
]
import httpRequest from '@/utils/axios'
// 登录
export function login(data) {
return httpRequest({
url: '/api/login',
method: 'post',
data
})
}
<template>
<div class="main">
<van-form
@submit="onSubmit"
ref="form"
class="form"
validate-trigger="onChange"
>
<van-field
v-model="form.name"
label="姓名"
required
placeholder="请输入姓名"
:border="false"
:rules="[{ required: true, message: '请输入姓名' }]"
/>
<van-field
v-model="form.user"
label="班级"
required
placeholder="请输入班级"
:border="false"
:rules="[{ required: true, message: '请输入班级' }]"
/>
<van-field
v-model="form.address"
label="挂科学期"
required
placeholder="请选择挂科学期"
:border="false"
:rules="[{ required: true, message: '请选择挂科学期' }]"
/>
<van-field
v-model="form.content"
label="重修课程名称"
required
placeholder="请选择重修课程名称"
:border="false"
:rules="[{ required: true, message: '请选择重修课程名称' }]"
/>
<van-field label="上传缴费凭证">
<template #input>
<van-uploader v-model="form.uploader" />
</template>
</van-field>
</van-form>
<div class="fixed-box">
<div class="fixed-inner">
<div class="fixed-button" @click="onSubmit">提交</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
form: {
name: '',
time: '',
user: '',
address: '',
content: ''
}
}
},
methods: {
onSubmit() {
this.$refs.form.submit()
console.log(this.form)
}
}
}
</script>
<style lang="scss"></style>
<template>
<div></div>
</template>
<script>
export default {}
</script>
<style lang="scss">
</style>
\ No newline at end of file
<template>
<div class="list">
<van-list
v-model="loading"
:finished="finished"
finished-text="没有更多了"
@load="onLoad"
v-if="list.length"
>
<van-cell v-for="item in list" :key="item" :title="item" />
</van-list>
<div class="empty" v-else>您还没有申请过重修</div>
<div class="fixed-box">
<div class="fixed-inner">
<div
class="fixed-button"
@click="$router.push({ name: 'rebuildCreate' })"
>
申请重修
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
list: [],
loading: false,
finished: true
}
},
methods: {
getList() {},
onLoad() {
this.getList()
}
}
}
</script>
<style lang="scss">
.list {
overflow: hidden;
min-height: 100vh;
}
</style>
export default [
{
name: 'rebuild',
path: '/rebuild',
meta: { title: '学术活动' },
component: () =>
import(/* webpackChunkName: "rebuild" */ './components/List.vue')
},
{
name: 'rebuildCreate',
path: '/rebuild/create',
meta: { title: '学术活动' },
component: () =>
import(/* webpackChunkName: "rebuild" */ './components/Edit.vue')
},
{
name: 'rebuildItem',
path: '/rebuild/item',
meta: { title: '学术活动' },
component: () =>
import(/* webpackChunkName: "rebuild" */ './components/Item.vue')
}
]
import httpRequest from '@/utils/axios'
// 登录
export function login(data) {
return httpRequest({
url: '/api/login',
method: 'post',
data
})
}
<template>
<div class="main">
<van-form @submit="onSubmit" ref="form" class="form" validate-trigger="onChange">
<van-field
v-model="form.name"
label="姓名"
required
placeholder="请输入姓名"
:border="false"
:rules="[{ required: true, message: '请输入姓名' }]"
/>
<van-field
v-model="form.type"
label="行业"
required
placeholder="请输入行业"
:border="false"
:rules="[{ required: true, message: '请输入行业' }]"
/>
<van-field
v-model="form.age"
label="年龄"
required
placeholder="请输入年龄"
:border="false"
:rules="[{ required: true, message: '请输入年龄' }]"
/>
<van-field
v-model="form.level"
label="班级"
required
placeholder="请输入班级"
:border="false"
:rules="[{ required: true, message: '请输入班级' }]"
/>
<van-field
v-model="form.tel"
type="tel"
label="电话"
required
placeholder="请输入电话"
:border="false"
:rules="[{ required: true, message: '请输入电话' }]"
/>
<van-field
v-model="form.content"
type="textarea"
label="内容"
required
autosize
placeholder="请输入乐分享内容"
:border="false"
:rules="[{ required: true, message: '请输入乐分享内容' }]"
/>
</van-form>
<div class="fixed-box">
<div class="fixed-inner">
<div class="fixed-button" @click="onSubmit">提交</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
form: {
name: '',
type: '',
age: '',
level: '',
content: ''
}
}
},
methods: {
onSubmit() {
this.$refs.form.submit()
console.log(this.form)
}
}
}
</script>
<style lang="scss"></style>
<template>
<div></div>
</template>
<script>
export default {}
</script>
<style lang="scss">
</style>
\ No newline at end of file
<template>
<div class="list">
<van-list
v-model="loading"
:finished="finished"
finished-text="没有更多了"
@load="onLoad"
v-if="list.length"
>
<van-cell v-for="item in list" :key="item" :title="item" />
</van-list>
<div class="empty" v-else>您还没有申请过乐分享</div>
<div class="fixed-box">
<div class="fixed-inner">
<div
class="fixed-button"
@click="$router.push({ name: 'shareCreate' })"
>
申请新的乐分享
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
list: [],
loading: false,
finished: true
}
},
methods: {
getList() {},
onLoad() {
this.getList()
}
}
}
</script>
<style lang="scss">
.list {
overflow: hidden;
min-height: 100vh;
}
</style>
export default [
{
name: 'share',
path: '/share',
meta: { title: '学术活动' },
component: () =>
import(/* webpackChunkName: "share" */ './components/List.vue')
},
{
name: 'shareCreate',
path: '/share/create',
meta: { title: '学术活动' },
component: () =>
import(/* webpackChunkName: "share" */ './components/Edit.vue')
},
{
name: 'shareItem',
path: '/share/item',
meta: { title: '学术活动' },
component: () =>
import(/* webpackChunkName: "share" */ './components/Item.vue')
}
]
module.exports = {}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论