master
xy 2 years ago
parent 4286e7d097
commit 0ef20d829c

@ -2,5 +2,5 @@
ENV='development'
# base api
VUE_APP_BASE_API=http://dongtuo.ali251.langye.net
VUE_APP_UPLOAD_API=http://dongtuo.ali251.langye.net/api/admin/upload-file
VUE_APP_BASE_API=https://dongtuo.ali251.langye.net
VUE_APP_UPLOAD_API=https://dongtuo.ali251.langye.net/api/admin/upload-file

@ -2,5 +2,5 @@
ENV = 'production'
# base api
VUE_APP_BASE_API=http://dongtuo.ali251.langye.net
VUE_APP_UPLOAD_API=http://dongtuo.ali251.langye.net/api/admin/upload-file
VUE_APP_BASE_API=https://dongtuo.ali251.langye.net
VUE_APP_UPLOAD_API=https://dongtuo.ali251.langye.net/api/admin/upload-file

@ -0,0 +1,64 @@
import request from "@/utils/request";
export function sendSms (params,isLoading = false) {
return request({
method: 'get',
url: '/api/admin/other/send_sms',
params,
isLoading
})
}
export function login (params,isLoading = false) {
return request({
method: 'get',
url: '/api/admin/other/login',
params,
isLoading
})
}
export function register (data,isLoading = false) {
return request({
method: 'post',
url: '/api/admin/other/register',
data,
isLoading
})
}
export function meetingList (params,isLoading = false) {
return request({
method: 'get',
url: '/api/admin/other/meeting',
params,
isLoading
})
}
export function exhibitorList (params,isLoading = false) {
return request({
method: 'get',
url: '/api/admin/other/exhibitor_files',
params,
isLoading
})
}
export function exhibitorSave (data,isLoading = false) {
return request({
method: 'post',
url: '/api/admin/other/exhibitor_files_save',
data,
isLoading
})
}
export function exhibitorDelete (params,isLoading = false) {
return request({
method: 'get',
url: '/api/admin/other/exhibitor_files_delete',
params,
isLoading
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

@ -288,6 +288,12 @@ export default {
flex-shrink: 0;
flex-basis: 50%;
}
.ivu-message{
z-index: 5000 !important;
}
</style>
<style scoped lang="scss">
.el-form-item__error{
white-space: nowrap;
word-break: keep-all !important;
@ -295,8 +301,5 @@ export default {
left: calc(100% - 80px) !important;
transform: translateX(-100%);
}
.ivu-message{
z-index: 5000 !important;
}
</style>

@ -8,7 +8,7 @@ import getPageTitle from '@/utils/get-page-title'
NProgress.configure({ showSpinner: false }) // NProgress Configuration
const whiteList = ['/login'] // no redirect whitelist
const whiteList = ['/login','/h5/login'] // no redirect whitelist
router.beforeEach(async(to, from, next) => {
// start progress bar
@ -18,12 +18,19 @@ router.beforeEach(async(to, from, next) => {
document.title = getPageTitle(to.meta.title)
// determine whether the user has logged in
const hasToken = getToken()
const hasToken = !!(getToken() && getToken() !== 'undefined' && getToken() !== 'null')
if (whiteList.indexOf(to.path) !== -1) {
// in the free login whitelist, go directly
next()
return
}
if (hasToken) {
if (to.path === '/login') {
if (to.path === '/login' || to.path === '/h5/login') {
// if is logged in, redirect to the home page
next({ path: '/' })
let isH5 = to.path !== '/login'
next({ path: isH5 ? '/h5' : '/' })
NProgress.done()
} else {
// determine whether the user has obtained his permission roles through getInfo
@ -34,24 +41,25 @@ router.beforeEach(async(to, from, next) => {
try {
// get user info
// note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
const { roles } = await store.dispatch('user/getInfo')
// generate accessible routes map based on roles
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
if (!/^\/h5.*/.test(to.path)) {
const { roles } = await store.dispatch('user/getInfo')
//console.log(accessRoutes)
// dynamically add accessible routes
router.addRoutes(accessRoutes)
// generate accessible routes map based on roles
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
// hack method to ensure that addRoutes is complete
// set the replace: true, so the navigation will not leave a history record
next({ ...to, replace: true })
//console.log(accessRoutes)
// dynamically add accessible routes
router.addRoutes(accessRoutes)
next({ ...to, replace: true })
} else {
next();
}
} catch (error) {
console.log(error)
// remove token and go to login page to re-login
await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
next(`/login?redirect=${to.path}`)
next(`${/^\/h5.*/.test(to.path) ? '/h5/login' : '/login'}?redirect=${to.path}`)
NProgress.done()
}
}
@ -64,7 +72,7 @@ router.beforeEach(async(to, from, next) => {
next()
} else {
// other pages that do not have permission to access are redirected to the login page.
next(`/login?redirect=${to.path}`)
next(`${/^\/h5.*/.test(to.path) ? '/h5/login' : '/login'}?redirect=${to.path}`)
NProgress.done()
}
}

@ -73,7 +73,28 @@ export const constantRoutes = [{
icon: 'dashboard'
}
}, ]
}
},
{
path: "/h5/index",
component: () => import("@/views/h5/index.vue"),
meta: {
title: "首页",
},
hidden: true
},
{
path: '/h5/login',
component:() => import("@/views/h5/login/login.vue"),
meta: {
title: "登录",
},
hidden: true
},
{
path: '/h5',
redirect: '/h5/index'
},
]

@ -47,3 +47,10 @@
.el-range-separator {
box-sizing: content-box;
}
@media (max-width: 768px) {
.el-message {
width: 90vw;
min-width: 200px;
}
}

@ -1,15 +1,18 @@
import Cookies from 'js-cookie'
const TokenKey = 'dongtuo_token'
const TokenKey_h5 = 'dongtuo_token_h5'
export function getToken() {
return Cookies.get(TokenKey)
let flag = /\/h5.*/.test(window.location.href)
return Cookies.get(flag ? TokenKey_h5 : TokenKey)
}
export function setToken(token) {
return Cookies.set(TokenKey, token)
let flag = /\/h5.*/.test(window.location.href)
return Cookies.set(flag ? TokenKey_h5 : TokenKey, token)
}
export function removeToken() {
return Cookies.remove(TokenKey)
let flag = /\/h5.*/.test(window.location.href)
return Cookies.remove(flag ? TokenKey_h5 : TokenKey)
}

@ -24,7 +24,7 @@ export default {
props: {
title: "新增",
visible: this.dialogVisible,
width: "74vw",
width: "600",
},
on: {
"update:visible": (val) => {

@ -0,0 +1,266 @@
<template>
<div class="form">
<el-form
ref="elForm"
:model="form"
:rules="rules"
label-position="top"
size="small"
>
<el-form-item
v-for="(value, key) in form"
:prop="key"
:label="formLabel[key]"
>
<template v-if="key === 'meeting_id'">
<el-input
:value="meetingInput"
clearable
suffix-icon="el-icon-arrow-down"
readonly
:placeholder="'请选择' + formLabel[key]"
@focus="modalShow = true"
>
</el-input>
</template>
<template v-else-if="key === 'fujian'">
<el-upload
:action="action"
:before-upload="uploadBefore"
:on-success="uploadSuccess"
:on-remove="uploadRemove"
:limit="1"
:file-list="fileList"
>
<el-button size="small" type="primary">选取文件</el-button>
<div slot="tip" class="el-upload__tip">大小不超过5Mb</div>
</el-upload>
</template>
<template v-else-if="key === 'remark'">
<el-input
v-model="form[key]"
clearable
type="textarea"
:autosize="{ minRows: 3 }"
:placeholder="'请输入' + formLabel[key]"
>
</el-input>
</template>
<template v-else>
<el-input
v-model="form[key]"
clearable
:placeholder="'请输入' + formLabel[key]"
>
</el-input>
</template>
</el-form-item>
<el-form-item style="padding-top: 10px">
<div style="display: flex">
<Button :loading="isLoading" long type="primary" @click="submit"
> </Button
>
</div>
</el-form-item>
</el-form>
<Modal
:fullscreen="fullscreen"
v-model="modalShow"
title="会议选择"
@on-ok="modalOk"
>
<Table
:row-class-name="rowClassName"
size="small"
highlight-row
:data="meetings"
:columns="columns"
@on-current-change="pickMeeting"
></Table>
<div style="display: flex; justify-content: center; margin-top: 10px">
<Page
:total="meetingTotal"
:page-size="meetingSelect.page_size"
size="small"
show-total
@on-change="e => {
meetingSelect.page = e;
getMeetings();
}"
/>
</div>
</Modal>
</div>
</template>
<script>
import { meetingList, exhibitorSave } from "@/api/h5";
export default {
data() {
return {
clientW: document.body.clientWidth,
fileList: [],
action: process.env.VUE_APP_UPLOAD_API,
isLoading: false,
form: {
meeting_id: "",
fujian: "",
remark: "",
},
formLabel: {
meeting_id: "会议",
fujian: "附件",
remark: "备注",
},
rules: {
meeting_id: [
{
required: true,
message: "请选择会议",
trigger: "change",
},
],
fujian: [
{
required: true,
message: "请上传附件",
trigger: "blur",
},
],
},
modalShow: false,
meetingTotal: 0,
meetings: [],
columns: [
{
type: "index",
width: 20,
title: "\r",
align: "center",
},
{
key: "name",
title: "名称",
},
{
key: "start_date",
title: "开始时间",
width: 100,
align: "center",
},
{
key: "end_date",
title: "结束时间",
width: 100,
align: "center",
},
],
meetingSelect: {
page_size: 10,
page: 1,
sort_name: "start_date",
},
pickedMeeting: {},
};
},
methods: {
modalOk() {
this.pickedMeeting.id
? (this.form.meeting_id = this.pickedMeeting.id)
: "";
},
pickMeeting(cur, pre) {
if (new Date().getTime() > new Date(cur.end_date).getTime()) {
this.pickedMeeting = pre;
} else {
this.pickedMeeting = cur;
}
},
rowClassName(row, index) {
if (new Date().getTime() > new Date(row.end_date).getTime()) {
return "tb-row-disabled";
} else {
return "";
}
},
uploadBefore(file) {
if (file.size / 1000 / 1000 > 5) {
this.$message({
type: "warning",
message: "上传大小超过5Mb",
});
return false;
}
},
uploadSuccess(res) {
this.form.fujian = res.id;
},
uploadRemove () {
this.form.fujian = '';
},
async getMeetings() {
const res = await meetingList(this.meetingSelect);
this.meetings = res.data;
this.meetingTotal = res.total;
},
submit () {
this.$refs['elForm'].validate(res => {
if (res) {
this.isLoading = true;
exhibitorSave(this.form).then(res => {
this.isLoading = false;
this.$message({
type: 'success',
message: '上传成功'
})
this.$refs['elForm'].resetFields();
this.$emit('success');
})
}
})
}
},
computed: {
fullscreen() {
return this.clientW < 768;
},
meetingInput() {
return this.form.meeting_id ? this.pickedMeeting.name : "";
},
},
created() {
window.onresize = () => {
this.clientW = document.body.clientWidth;
};
this.getMeetings();
},
destroyed() {
window.onresize = null;
},
};
</script>
<style scoped lang="scss">
::v-deep .el-form--label-top .el-form-item__label {
line-height: 20px;
font-size: 13px;
}
</style>
<style>
.ivu-table .tb-row-disabled td {
background: #aaac !important;
color: #eee;
text-shadow: 1px 1px #999;
cursor: not-allowed;
}
</style>

@ -0,0 +1,104 @@
<template>
<div style="position: relative;">
<Spin style="position:absolute;left: 50%;top: 50%;transform: translate(-50%,-50%);z-index: 2;" v-show="isLoading"></Spin>
<Card v-for="item in exhibitors">
<template #title>
<p>
<Icon type="md-calendar" />
{{ item.meeting_id_meetings_id_relation ? item.meeting_id_meetings_id_relation.name : '' }}
</p>
</template>
<Tag :color="tagColor(item.status)">{{ status(item.status) }}</Tag>
<div class="item">
<div class="item__title">附件</div>
<div class="item__value">
<a href="">111</a>
</div>
</div>
</Card>
<div style="display: flex; justify-content: center;margin-top: 20px;">
<Page
:total="exhibitorTotal"
:page-size="exhibitorSelect.page_size"
show-total
@on-change="
(e) => {
exhibitorSelect.page = e;
getExhibitors();
}
"
/>
</div>
</div>
</template>
<script>
import { exhibitorList } from "@/api/h5";
export default {
data() {
return {
isLoading: false,
exhibitorTotal: 0,
exhibitors: [],
exhibitorSelect: {
table_name: 'exhibitor_files',
page: 1,
page_size: 10,
},
};
},
methods: {
async getExhibitors(isRefresh = false) {
try {
this.isLoading = true
if (isRefresh) {
this.exhibitorSelect.page = 1;
}
const res = await exhibitorList(this.exhibitorSelect);
this.exhibitorTotal = res.total;
this.exhibitors = res.data;
this.isLoading = false;
}catch (e) {
this.isLoading = false;
}
},
},
computed: {
status() {
return function (status) {
let map = new Map([
[1, "待审核"],
[2, "已通过"],
[3, "未通过"],
]);
return map.get(status);
};
},
tagColor() {
return function (status) {
let map = new Map([
[1, "warning"],
[2, "success"],
[3, "error"],
]);
return map.get(status);
};
},
},
created() {
//this.getExhibitors();
},
};
</script>
<style scoped lang="scss">
.item {
display: flex;
&__title {
font-weight: 600;
}
}
</style>

@ -0,0 +1,79 @@
<template>
<div class="page">
<Tabs type="card" :animated="false" @on-click="tabClick">
<TabPane label="资料上传">
<div class="tabpane-container">
<subForm @success="$refs['myExhibitor'].getExhibitors(true)"></subForm>
</div>
</TabPane>
<TabPane label="我的资料">
<div class="tabpane-container">
<myExhibitor ref="myExhibitor"></myExhibitor>
</div>
</TabPane>
</Tabs>
</div>
</template>
<script>
import myExhibitor from '@/views/h5/exhibitor/myExhibitor.vue';
import subForm from '@/views/h5/exhibitor/form.vue';
export default {
components: {
subForm,
myExhibitor
},
data() {
return {
}
},
methods: {
tabClick (index) {
if (index === 1) {
this.$refs['myExhibitor'].getExhibitors(true);
}
}
},
computed: {
},
destroyed() {
},
created() {
}
}
</script>
<style scoped lang="scss">
.page {
width: 100%;
height: 100%;
background: #eee;
padding: 20px;
}
::v-deep .ivu-tabs-ink-bar {
transition: none;
}
::v-deep .ivu-tabs-tab-active {
border-color: $primaryColor !important;
}
::v-deep .ivu-tabs-bar {
border-color: $primaryColor !important;
margin-bottom: 0!important;
}
.tabpane-container {
background: #fff;
border: 1px solid $primaryColor;
border-top: none;
padding: 20px;
border-radius: 0 0 4px 4px;
}
@media (min-width: 768px) {
.page {
padding: 40px;
}
}
@media (max-width: 768px) {
}
</style>

@ -0,0 +1,128 @@
<template>
<div class="form">
<el-form ref="elForm" hide-required-asterisk :model="form" :rules="rules" label-position="top" size="small">
<el-form-item v-for="(value,key) in form" :prop="key" :label="formLabel[key]">
<el-input v-model="form[key]"
clearable
:placeholder="'请输入'+formLabel[key]">
<template #append v-if="key === 'mobile'">
<el-button :disabled="isVerify" @click="sendVerify">
{{ time ? time+'秒重新获取' : '发送验证码'}}
</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item style="padding-top: 10px;">
<div style="display: flex;">
<Button long type="primary" ghost @click="$emit('toRegister')"> </Button>
<Button :loading="isLoading" long type="primary" @click="login"> </Button>
</div>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { login, sendSms } from "@/api/h5";
import { setToken } from "@/utils/auth";
export default {
data() {
return {
form: {
mobile: '',
code: '',
},
formLabel: {
mobile: '手机号码',
code: '验证码'
},
rules: {
mobile: [
{
required: true,
message: '请输入手机号',
trigger: 'blur'
},
{
validator:(rule, value, callback) => {
const reg = /^1[3456789]\d{9}$/;
if (reg.test(value)) {
callback()
} else {
callback(new Error('手机号格式错误'))
}
}
}
],
code: [
{
required: true,
message: '请输入验证码',
trigger: 'blur'
}
]
},
isLoading: false,
isVerify: false,
timer: null,
time: 0,
}
},
methods: {
sendVerify () {
if (this.isVerify) return
this.$refs['elForm'].validateField('mobile',(res) => {
if (!res) {
sendSms({
mobile: this.form.mobile,
type: 4
}).then(res => {
this.time = 60;
this.isVerify = true;
this.timer = setInterval(() => {
this.time > 0 ? (this.time--) : (clearInterval(this.timer),this.isVerify = false)
},1000)
})
}
})
},
login () {
this.$refs['elForm'].validate(res => {
if (res) {
this.isLoading = true;
login(this.form).then(res => {
this.isLoading = false;
setToken(res.token);
this.$router.push('/h5')
}).catch(_ => this.isLoading = false)
}
})
}
},
computed: {},
}
</script>
<style scoped lang="scss">
::v-deep .el-form--label-top .el-form-item__label {
line-height: 20px;
font-size: 13px;
}
::v-deep .el-input-group__append > button {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
color: #fff;
transition: all .2s;
&:not([disabled^=disabled]) {
background: #de6d48;
}
}
::v-deep .el-button.is-disabled {
background: #999;
color: #fff;
}
</style>

@ -0,0 +1,127 @@
<template>
<div class="panel">
<div class="logo">
<img :src="require('@/assets/logo.png')" alt="">
</div>
<div class="title">
<h2>展商{{ isLogin ? '登录' : '注册'}}</h2>
<h5>请输入{{ isLogin ? '登录' : '注册'}}信息</h5>
</div>
<transition name="panel">
<template v-if="isLogin">
<login @toRegister="isLogin = false"></login>
</template>
<template v-else>
<register @toLogin="isLogin = true"></register>
</template>
</transition>
<div class="footer">2023 © 盐城东拓国际会展服务有限公司</div>
</div>
</template>
<script>
import register from "./register.vue";
import login from "./login.vue";
//import { sendSms,login } from "@/api/h5";
export default {
components: {
register,
login
},
data() {
return {
isLogin: true,
}
},
methods: {
},
computed: {},
}
</script>
<style scoped lang="scss">
.panel {
background: #fff;
display: flex;
flex-direction: column;
justify-content: center;
}
.logo {
display: flex;
align-items: center;
justify-content: left;
position: absolute;
top: 40px;
left: 40px;
& > img {
height: 30px;
object-fit: contain;
}
}
.title {
color: $primaryColor;
text-align: center;
margin-bottom: 4vh;
& > h5 {
color: #999;
padding-top: 8px;
}
}
.footer {
text-align: center;
font-size: 12px;
color: #9ba6ac;
transform: translateX(-50%);
word-break: keep-all;
position: absolute;
bottom: 40px;
left: 50%;
}
@media (max-width: 768px) {
.panel {
padding: 0 20px;
}
.logo {
display: none;
}
}
@media (min-width: 768px) {
.panel {
padding: 0 40px;
}
.title {
margin-top: 20px;
}
}
.panel-enter-active {
animation: fade-in-fwd 0.6s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
}
@keyframes fade-in-fwd {
0% {
transform: translateZ(-80px);
opacity: 0;
}
100% {
transform: translateZ(0);
opacity: 1;
}
}
.panel-leave-active {
}
</style>

@ -0,0 +1,169 @@
<template>
<div class="form">
<el-form ref="elForm" hide-required-asterisk :model="form" :rules="rules" label-position="top" size="small">
<el-form-item v-for="(value,key) in form" :prop="key" :label="formLabel[key]">
<el-input v-model="form[key]"
clearable
:placeholder="'请输入'+formLabel[key]">
<template #append v-if="key === 'mobile'">
<el-button :disabled="isVerify" @click="sendVerify">
{{ time ? time+'秒重新获取' : '发送验证码'}}
</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item style="padding-top: 10px;">
<div style="display: flex;">
<Button long type="primary" ghost @click="$emit('toLogin')"></Button>
<Button :loading="isLoading" long type="primary" @click="register"></Button>
</div>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { sendSms, register } from "@/api/h5";
export default {
data() {
return {
form: {
name: '',
lianxiren: '',
lianxidianhua: '',
mobile: '',
code: '',
},
formLabel: {
name: '公司名称',
lianxiren: '联系人',
lianxidianhua: '联系电话',
mobile: '手机号',
code: '验证码'
},
rules: {
name: [
{
required: true,
message: '请输入公司名称',
trigger: 'blur'
},
],
lianxiren: [
{
required: true,
message: '请输入联系人',
trigger: 'blur'
},
],
lianxidianhua: [
// {
// required: true,
// message: '',
// trigger: 'blur'
// },
{
validator:(rule, value, callback) => {
const mobile = /^1[3456789]\d{9}$/;
const phone = /^((0\d{2,3})-)?(\d{7,8})$/;
if (mobile.test(value) || phone.test(value)) {
callback()
} else {
callback(new Error('联系电话格式错误'))
}
}
}
],
mobile: [
{
required: true,
message: '请输入手机号',
trigger: 'blur'
},
{
validator:(rule, value, callback) => {
const reg = /^1[3456789]\d{9}$/;
if (reg.test(value)) {
callback()
} else {
callback(new Error('手机号格式错误'))
}
}
}
],
code: [
{
required: true,
message: '请输入验证码',
trigger: 'blur'
},
]
},
isLoading: false,
isVerify: false,
timer: null,
time: 0,
}
},
methods: {
sendVerify () {
if (this.isVerify) return
this.$refs['elForm'].validateField('mobile',(res) => {
if (!res) {
sendSms({
mobile: this.form.mobile,
type: 5
}).then(res => {
this.time = 60;
this.isVerify = true;
this.timer = setInterval(() => {
this.time > 0 ? (this.time--) : (clearInterval(this.timer),this.isVerify = false)
},1000)
})
}
})
},
register () {
//this.$emit('toLogin');
this.$refs['elForm'].validate((res) => {
if (res) {
this.isLoading = true;
register(this.form).then(res => {
this.isLoading = false;
this.$Message.success({
content: '注册成功'
});
setTimeout(() => this.$emit('toLogin'),1500);
}).catch(err => this.isLoading = false)
}
})
}
},
computed: {},
}
</script>
<style scoped lang="scss">
::v-deep .el-form--label-top .el-form-item__label {
line-height: 20px;
font-size: 13px;
}
::v-deep .el-input-group__append > button {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
color: #fff;
transition: all .2s;
&:not([disabled^=disabled]) {
background: #de6d48;
}
}
::v-deep .el-button.is-disabled {
background: #999;
color: #fff;
}
</style>

@ -0,0 +1,102 @@
<template>
<div class="body">
<loginPanel class="login-panel"></loginPanel>
<div class="bkg">
<div class="words">
<h2>欢迎使用本平台</h2>
<div>
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" ><path d="M470.9888 261.77536l0 98.54976c0 13.3632-10.83392 24.19712-24.19712 24.19712-47.68768 0-73.6256 48.90624-77.21984 145.43872l77.21984 0c13.3632 0 24.19712 10.84416 24.19712 24.19712l0 208.0768c0 13.3632-10.83392 24.19712-24.19712 24.19712L240.90624 786.432c-13.37344 0-24.19712-10.84416-24.19712-24.19712l0-208.0768c0-46.27456 4.6592-88.73984 13.84448-126.22848 9.4208-38.44096 23.87968-72.04864 42.96704-99.90144 19.64032-28.6208 44.20608-51.07712 73.02144-66.72384 29.00992-15.73888 62.74048-23.72608 100.25984-23.72608C460.15488 237.57824 470.9888 248.41216 470.9888 261.77536zM783.09376 384.52224c13.3632 0 24.19712-10.84416 24.19712-24.19712l0-98.54976c0-13.3632-10.83392-24.19712-24.19712-24.19712-37.50912 0-71.23968 7.9872-100.2496 23.72608-28.81536 15.64672-53.39136 38.10304-73.03168 66.72384-19.08736 27.8528-33.54624 61.46048-42.96704 99.91168-9.17504 37.49888-13.83424 79.96416-13.83424 126.21824l0 208.0768c0 13.3632 10.83392 24.19712 24.19712 24.19712l205.8752 0c13.3632 0 24.19712-10.84416 24.19712-24.19712l0-208.0768c0-13.3632-10.83392-24.19712-24.19712-24.19712L706.9696 529.96096C710.51264 433.42848 736.07168 384.52224 783.09376 384.52224z" fill="#ffffff"></path></svg>
<span>本平台为展商提供资料上传</span>
<svg viewBox="0 0 1024 1024" ><path d="M553.0112 762.23488l0-98.54976c0-13.3632 10.84416-24.19712 24.19712-24.19712 47.68768 0 73.6256-48.896 77.21984-145.42848l-77.21984 0c-13.3632 0-24.19712-10.84416-24.19712-24.19712l0-208.0768c0-13.3632 10.84416-24.19712 24.19712-24.19712l205.88544 0c13.3632 0 24.19712 10.84416 24.19712 24.19712l0 208.0768c0 46.27456-4.66944 88.7296-13.83424 126.22848-9.4208 38.44096-23.87968 72.04864-42.97728 99.90144-19.63008 28.6208-44.20608 51.07712-73.0112 66.72384-29.02016 15.73888-62.75072 23.72608-100.27008 23.72608C563.84512 786.432 553.0112 775.58784 553.0112 762.23488zM240.90624 639.47776c-13.3632 0-24.19712 10.84416-24.19712 24.19712l0 98.54976c0 13.3632 10.83392 24.19712 24.19712 24.19712 37.49888 0 71.24992-7.9872 100.2496-23.72608 28.81536-15.64672 53.39136-38.0928 73.02144-66.72384 19.0976-27.8528 33.55648-61.46048 42.97728-99.92192 9.17504-37.49888 13.83424-79.95392 13.83424-126.208l0-208.0768c0-13.3632-10.84416-24.19712-24.19712-24.19712L240.90624 237.568c-13.3632 0-24.19712 10.84416-24.19712 24.19712l0 208.0768c0 13.3632 10.83392 24.19712 24.19712 24.19712l76.1344 0C313.48736 590.58176 287.91808 639.47776 240.90624 639.47776z" fill="#ffffff"></path></svg>
</div>
<h5>-盐城国际会议展览中心-</h5>
</div>
</div>
</div>
</template>
<script>
import loginPanel from "./component/loginPanel.vue";
export default {
components: {
loginPanel
},
data() {
return {
}
},
methods: {},
computed: {},
}
</script>
<style scoped lang="scss">
.body {
height: 100vh;
width: 100vw;
position: relative;
}
.login-panel {
position: absolute;
top: 0;
left: 0;
bottom: 0;
}
@media (max-width: 768px) {
.login-panel {
width: 100%;
}
.bkg {
display: none;
}
.words {
display: none;
}
}
@media (min-width: 768px) {
.login-panel {
width: 34vw;
box-shadow: 1px 0 10px 8px rgba(0,0,0,.04);
}
.bkg {
height: 100%;
width: 66vw;
float: right;
background: url("../../../assets/h5bkg.jpeg") no-repeat;
background-size: cover;
position: relative;
.words {
color: #fff;
text-align: center;
transform: translateX(-50%);
position: absolute;
bottom: 80px;
left: 50%;
& > div {
font-weight: 600;
font-size: 16px;
word-break: keep-all;
align-items: center;
display: flex;
padding: 4px 0;
& > span {
padding: 0 8px;
}
& > svg {
width: 32px;
height: 32px;
}
}
}
}
}
</style>

@ -25,7 +25,7 @@ module.exports = {
* Detail: https://cli.vuejs.org/config/#publicpath
*/
publicPath: '/admin/',
outputDir: '/Users/mac/Documents/Work/s-苏州东拓/code/dongtuo-meet-service/public/admin',
outputDir: './dist',
assetsDir: 'static',
css: {
loaderOptions: { // 向 CSS 相关的 loader 传递选项

Loading…
Cancel
Save