tremble %!s(int64=3) %!d(string=hai) anos
achega
0a4d5dcea3

+ 3 - 0
.browserslistrc

@@ -0,0 +1,3 @@
+> 1%
+last 2 versions
+not dead

+ 17 - 0
.eslintrc.js

@@ -0,0 +1,17 @@
+module.exports = {
+  root: true,
+  env: {
+    node: true
+  },
+  'extends': [
+    'plugin:vue/essential',
+    'eslint:recommended'
+  ],
+  parserOptions: {
+    parser: 'babel-eslint'
+  },
+  rules: {
+    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
+  }
+}

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 24 - 0
README.md

@@ -0,0 +1,24 @@
+# code
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ]
+}

BIN=BIN
code.zip


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 12035 - 0
package-lock.json


+ 30 - 0
package.json

@@ -0,0 +1,30 @@
+{
+  "name": "code",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "axios": "^0.21.1",
+    "core-js": "^3.6.5",
+    "mint-ui": "^2.2.13",
+    "vant": "^2.12.24",
+    "vue": "^2.6.11",
+    "vue-router": "^3.2.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-plugin-eslint": "~4.5.0",
+    "@vue/cli-plugin-router": "~4.5.0",
+    "@vue/cli-service": "~4.5.0",
+    "babel-eslint": "^10.1.0",
+    "eslint": "^6.7.2",
+    "eslint-plugin-vue": "^6.2.2",
+    "less": "^3.0.4",
+    "less-loader": "^5.0.0",
+    "vue-template-compiler": "^2.6.11"
+  }
+}

BIN=BIN
public/favicon.png


+ 17 - 0
public/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="">
+  <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,maximum=1.0,minimum=1.0,user-scalable=0" />
+    <link rel="icon" href="<%= BASE_URL %>favicon.png">
+    <title>博博会实景三维拍摄服务意向表</title>
+  </head>
+  <body>
+    <noscript>
+      <strong>高清VR拍摄,千万级流量曝光</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 26 - 0
src/App.vue

@@ -0,0 +1,26 @@
+<template>
+  <div id="app">
+    <Home/>
+  </div>
+</template>
+
+<script>
+import Home from '@/views/Home.vue'
+import '@/assets/style/reset.less'
+import '@/assets/style/public.less'
+
+export default {
+  components:{Home}
+};
+</script>
+
+<style lang="less">
+#app {
+ width: 100%;
+ height: 100%;
+ max-width:600px;
+ margin: 0 auto;
+ overflow: hidden;
+}
+
+</style>

BIN=BIN
src/assets/images/bg.jpg


BIN=BIN
src/assets/images/btn.png


BIN=BIN
src/assets/images/con_bg.png


BIN=BIN
src/assets/images/logo.png


BIN=BIN
src/assets/images/title-bg.png


+ 10 - 0
src/assets/style/public.less

@@ -0,0 +1,10 @@
+html,body{
+  width: 100%;
+  height: 100%;
+  -webkit-overflow-scrolling: touch;
+}
+
+input{
+  -webkit-appearance: none;
+  outline:none;
+}

+ 43 - 0
src/assets/style/reset.less

@@ -0,0 +1,43 @@
+/* reset */
+html,body,h1,h2,h3,h4,h5,h6,div,dl,dt,dd,ul,ol,li,p,blockquote,pre,hr,figure,table,caption,th,td,form,fieldset,legend,input,button,textarea,menu{margin:0;padding:0;}
+header,footer,section,article,aside,nav,hgroup,address,figure,figcaption,menu,details{display:block;}
+table{border-collapse:collapse;border-spacing:0;}
+caption,th{text-align:left;font-weight:normal;}
+html,body,fieldset,img,iframe,abbr{border:0;}
+i,cite,em,var,address,dfn{font-style:normal;}
+[hidefocus],summary{outline:0;}
+li{list-style:none;}
+h1,h2,h3,h4,h5,h6,small{font-size:100%;}
+sup,sub{font-size:83%;}
+pre,code,kbd,samp{font-family:inherit;}
+q:before,q:after{content:none;}
+textarea{overflow:auto;resize:none;}
+label,summary{cursor:default;}
+a,button{cursor:pointer;}
+h1,h2,h3,h4,h5,h6,em,strong,b{font-weight:bold;}
+del,ins,u,s,a,a:hover{text-decoration:none;}
+body,textarea,input,button,select,keygen,legend{font:14px/1.14;outline:0;}
+body{background:#fff;}
+*{box-sizing: border-box}
+a{text-decoration: none;}
+
+
+::-webkit-scrollbar {
+  width: 2px;
+  height: 8px;
+}
+
+::-webkit-scrollbar-thumb {
+  height: 50px;
+  background-color: #ddd;
+  -webkit-border-radius: 4px;
+  outline: 2px solid #fff;
+  outline-offset: -2px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+  height: 50px;
+  background-color: #9f9f9f;
+  -webkit-border-radius: 4px;
+}
+

+ 19 - 0
src/main.js

@@ -0,0 +1,19 @@
+import Vue from 'vue'
+import App from './App.vue'
+import browser from "@/utils/browser";
+import {MessageBox} from 'mint-ui'
+import 'mint-ui/lib/style.css'
+
+
+Vue.prototype.$message = MessageBox
+Vue.prototype.$browser = browser
+
+let {axios} = require('./utils/http.js')
+
+Vue.prototype.$http = axios
+
+Vue.config.productionTip = false
+
+new Vue({
+  render: h => h(App)
+}).$mount('#app')

+ 20 - 0
src/router/index.js

@@ -0,0 +1,20 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import Home from '../views/Home.vue'
+
+
+Vue.use(VueRouter)
+
+const routes = [
+  {
+    path: '/',
+    name: 'Home',
+    component: Home
+  }
+]
+
+const router = new VueRouter({
+  routes
+})
+
+export default router

+ 35 - 0
src/utils/browser.js

@@ -0,0 +1,35 @@
+function versions () {
+  var u = window.navigator.userAgent
+  return {
+    // IE内核
+    trident: u.indexOf('Trident') > -1,
+    // Firefox
+    firefox: u.indexOf('Firefox') > -1,
+    // edge
+    edge: u.indexOf('Edge') > -1,
+    // opera内核
+    presto: u.indexOf('Presto') > -1,
+    // 苹果、谷歌内核
+    webKit: u.indexOf('AppleWebKit') > -1,
+    // 火狐内核
+    gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') === -1,
+    // 是否为移动终端
+    mobile: /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent),
+    // ios终端
+    ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
+    // android终端或者uc浏览器
+    android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1,
+    // 是否为iPhone或者安卓QQ浏览器
+    iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1,
+    // 是否为iPad
+    iPad: u.indexOf('iPad') > -1,
+    // 是否为web应用程序,没有头部与底部
+    webApp: u.indexOf('Safari') === -1,
+    // 是否为微信浏览器
+    weixin: ~u.indexOf('MicroMessenger'),
+    // 获取浏览器语言
+    language: (navigator.browserLanguage || navigator.language).toLowerCase()
+  }
+}
+
+export default versions()

+ 73 - 0
src/utils/http.js

@@ -0,0 +1,73 @@
+import axios from 'axios'
+
+// import Vue from 'vue'
+// let vue = new Vue()
+
+/* const serverName = isProduction ? '/museumcms/' : 'https://shmuseum.4dage.com/museumcms/' */
+const serverName = 'https://project.4dage.com/bbh/'
+axios.defaults.baseURL = serverName
+axios.defaults.headers['X-Requested-with'] = 'XMLHttpRequest'
+
+// 拦截请求,做登陆,或head处理
+axios.interceptors.request.use(
+  function (config) {
+    // vue.$showLoading()
+    if (config.method === 'post') {
+      config.data = {
+        ...config.data,
+        rnd: Math.random()
+      }
+    } else if (config.method === 'get') {
+      config.params = {
+        rnd: Math.random(),
+        ...config.params
+      }
+    }
+    return config
+  }, function (error) {
+    // 对请求错误做些什么
+    return Promise.reject(error)
+  }
+)
+
+// 拦截返回,做错误统一处理
+axios.interceptors.response.use(
+  response => {
+    let data = response.data
+    let code = Number(response.data.status)
+    // vue.$hideLoading()
+
+    switch (code) {
+      case -1:
+        break
+      case 4500:
+       
+        break
+      case 5001:
+        
+        break
+      case 5002:
+        
+        break
+      case 500:
+        
+        break
+      case 0:
+        break
+    }
+    // tryHideFullScreenLoading()
+    return data
+  },
+  error => {
+    if (error.response) {
+      switch (error.response.status) {
+        case 500:
+         
+          break
+      }
+    }
+    return Promise.reject(error)
+  }
+)
+
+export { serverName, axios }

+ 266 - 0
src/views/Home.vue

@@ -0,0 +1,266 @@
+<template>
+  <div class="home" :style="{ 'background-image': `url(${require('@/assets/images/bg.jpg')})` }">
+    <div class="title">
+      <img :src="require('@/assets/images/title-bg.png')" alt="" />
+    </div>
+
+    <div
+      class="content"
+      :style="{
+        'background-image': `url(${require('@/assets/images/con_bg.png')})`,
+      }"
+    >
+      <p class="intro">实景三维拍摄,千万级流量曝光<br />打造永不闭幕的云展馆</p>
+      <p class="desc">请按要求完善以下信息并提交,谢谢!</p>
+      <ul>
+        <li v-for="(item, i) in arr" :key="i">
+          <p>{{ item.require ? "* " : "" }}{{ item.name }}</p>
+          <input type="text" v-model="form[item.id]" :placeholder="item.placeholder" />
+        </li>
+      </ul>
+      <p class="tech">实景三维拍摄服务由四维时代独家技术提供</p>
+      <img class="btn" @click="save" :src="require('@/assets/images/btn.png')" alt="" />
+
+      <div class="contract">
+        <p>相关咨询可联系:</p>
+        <div>
+          <span>商务联系:</span>
+          <div>
+            <p>沈小姐 <a href="tel:13798998979">13798998979</a></p>
+            <p>刘小姐 <a href="tel:15733737800">15733737800</a></p>
+          </div>
+        </div>
+
+        <p>添加微信:sales4dage</p>
+        <p>邮箱联系:liuliqian@4dage.com</p>
+      </div>
+    </div>
+
+    <div class="bottom">
+      <img :src="require('@/assets/images/logo.png')" alt="" />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "Home",
+  data() {
+    return {
+      arr: [
+        {
+          name: "姓名",
+          id: "name",
+          placeholder: "请输入您的名字",
+          require: true,
+        },
+        {
+          name: "电话号码",
+          id: "phone",
+          placeholder: "请输入您的电话号码",
+          require: true,
+        },
+        {
+          name: "单位名称",
+          id: "unit",
+          placeholder: "请输入您的单位名称",
+          require: true,
+        },
+        {
+          name: "职务",
+          id: "job",
+          placeholder: "请输入您的职务",
+        },
+        {
+          name: "展位号",
+          id: "boothNum",
+          placeholder: "请输入您的展位号",
+        },
+      ],
+      form: {
+        name: "",
+        phone: "",
+        unit: "",
+        job: "",
+        boothNum: "",
+      },
+    };
+  },
+
+  methods: {
+    reset() {
+      this.form = {
+        name: "",
+        phone: "",
+        unit: "",
+        job: "",
+        boothNum: "",
+      };
+    },
+    checkPhone(value) {
+      let reg = /^1[345789]\d{9}$/;
+      return reg.test(value);
+    },
+    async save() {
+      if (!this.form.name) {
+        this.$message("提示", "请填写姓名");
+        return;
+      }
+      if (!this.form.phone) {
+        this.$message("提示", "请填写电话号码");
+        return;
+      }
+      if (!this.checkPhone(this.form.phone)) {
+        this.$message("提示", "电话号码格式不正确");
+        return;
+      }
+      if (!this.form.unit) {
+        this.$message("提示", "请填写单位名称");
+        return;
+      }
+      let data = this.form;
+      let result = await this.$http({
+        method: "post",
+        data: data,
+        url: `/api/saveVisit`,
+      });
+      if (result && result["code"] === 0) {
+        this.reset();
+        this.$message("提示", "提交成功!感谢,将会有专人联系您,请关闭本页面");
+      } else {
+        this.$message("提示", result["msg"]);
+      }
+    },
+  },
+  mounted() {
+    // this.$message("提示", "请填写姓名");
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.home {
+  width: 100%;
+  height: 100%;
+  padding-bottom: 40px;
+  overflow-y: auto;
+  position: relative;
+  background-size: 100% 100%;
+  background-repeat: no-repeat;
+  background-position: center 0;
+  .title {
+    width: 68%;
+    margin: 0 auto;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    > img {
+      width: 100%;
+    }
+  }
+
+  .content {
+    width: 100%;
+    background-size: 100% 100%;
+    background-repeat: no-repeat;
+    text-align: center;
+    padding: 30px 0 40px;
+    margin-bottom: 10px;
+    .intro {
+      font-size: 18px;
+      font-weight: bold;
+      line-height: 24px;
+      color: #333333;
+      text-shadow: 0px 2px 6px #ffffff;
+    }
+    .desc,
+    .tech {
+      font-size: 12px;
+      font-weight: bold;
+      line-height: 14px;
+      color: #8ec31f;
+      margin-top: 10px;
+      transform: scale(0.9);
+    }
+    .tech {
+      color: rgba(51, 51, 51, 0.5);
+      margin: 6px auto 10px;
+    }
+    .btn {
+      margin: 16px auto 10px;
+      width: 80%;
+    }
+    .contract {
+      color: #8ec31f;
+      width: 100%;
+      text-align: center;
+      margin: auto auto;
+      font-weight: bold;
+      >p,>div {
+        font-size: 12px;
+        font-weight: normal;
+        line-height: 1.5;
+        &:first-of-type {
+          font-size: 12px;
+          margin-bottom: 4px;
+          font-weight: normal;
+        }
+        a {
+          color: #8ec31f;
+          text-decoration: underline;
+        }
+      }
+      >div{
+        display: flex;
+        justify-content: center;
+        *{
+          font-size: 12px;
+        }
+      }
+    }
+    > ul {
+      width: 80%;
+      margin: 0 auto;
+      text-align: left;
+      > li {
+        > p {
+          font-size: 12px;
+          line-height: 14px;
+          margin: 8px 0 6px 8px;
+          color: #333333;
+        }
+        > input {
+          line-height: 40px;
+          background: #fff;
+          height: 40px;
+          border: #8ec31f 1px solid;
+          border-radius: 0;
+          width: 100%;
+          padding-left: 20px;
+          font-size: 14px;
+          &::placeholder {
+            color: rgba(51, 51, 51, 0.35);
+          }
+        }
+      }
+    }
+  }
+
+  .bottom {
+    position: fixed;
+    bottom: 0;
+    min-height: 40px;
+    background: linear-gradient(to top, rgba(255, 255, 255, 1), rgba(255, 255, 255, 1) 84%, rgba(227, 227, 227, 1) 100%);
+    width: 100%;
+    max-width: 600px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    > img {
+      width: 350px;
+      max-width: 90%;
+      margin: 12px 0 10px;
+    }
+  }
+}
+</style>

+ 4 - 0
vue.config.js

@@ -0,0 +1,4 @@
+
+module.exports = {
+  publicPath: "./",
+};