2
0

38 Ревизии 4a99631983 ... f3d8dcca25

Автор SHA1 Съобщение Дата
  Ryuiso f3d8dcca25 no message преди 3 седмици
  Ryuiso b32babd84c feat: add global layout spacing system преди 3 седмици
  Ryuiso e633f0320b Revert "fix: add responsive margins to banner swiper arrows" преди 3 седмици
  Ryuiso 292168a90c fix: add responsive margins to banner swiper arrows преди 3 седмици
  Ryuiso 1415f7df45 refactor: optimize desktop layout spacing and visual hierarchy преди 3 седмици
  Ryuiso d7c12c0b59 refactor: optimize logo spacing and increase company name size преди 3 седмици
  Ryuiso 2ae193ff43 fix: align logo and company name, reduce spacing преди 3 седмици
  Ryuiso a793169d89 fix: reduce spacing between logo and company name преди 3 седмици
  Ryuiso 13636540ec feat: add company name next to logo (desktop only) преди 3 седмици
  Ryuiso 4f621dc1ed refactor: modernize desktop Header, keep original mobile styles преди 3 седмици
  Ryuiso 368bc1dfe8 refactor: modernize Header component styles преди 3 седмици
  Ryuiso 8248ed667e Revert "style: center header navigation vertically" преди 3 седмици
  Ryuiso 4f272fbb13 Revert "fix: set fixed banner height and center navigation" преди 3 седмици
  Ryuiso 15932cd784 fix: set fixed banner height and center navigation преди 3 седмици
  Ryuiso 85e7445491 style: center header navigation vertically преди 3 седмици
  Ryuiso 504aa811d6 Revert "fix: adjust header layout alignment" преди 3 седмици
  Ryuiso a8a23fba92 Revert "fix: center header navigation vertically" преди 3 седмици
  Ryuiso 82e641f6d8 Revert "fix: remove white gap between header and banner" преди 3 седмици
  Ryuiso a97c0c194b Revert "fix: set explicit banner height and remove gaps" преди 3 седмици
  Ryuiso 96edbac174 Revert "fix: set fixed banner height for all screen sizes" преди 3 седмици
  Ryuiso c8cd199673 fix: set fixed banner height for all screen sizes преди 3 седмици
  Ryuiso 2c9bc4e603 fix: set explicit banner height and remove gaps преди 3 седмици
  Ryuiso 8dfc633ca5 fix: remove white gap between header and banner преди 3 седмици
  Ryuiso 3cbe52ef7f fix: center header navigation vertically преди 3 седмици
  Ryuiso 2d82840039 fix: adjust header layout alignment преди 3 седмици
  Ryuiso d1760892d3 fix: remove gap between header and banner преди 3 седмици
  Ryuiso ba28be7366 style: align header navigation to bottom преди 3 седмици
  Ryuiso 5db56f925b feat: optimize header logo spacing and responsive design преди 3 седмици
  Ryuiso 2c9b28a754 fix: resolve icon display issues преди 3 седмици
  Ryuiso f54f4eef9f docs: update known issues and changelog преди 3 седмици
  Ryuiso 249ecb34e0 fix: upgrade shelljs to fix Node.js compatibility warnings преди 3 седмици
  Ryuiso 0a602dc64c docs: update build optimization records преди 3 седмици
  Ryuiso cb38bc3fad build: optimize webpack production configuration преди 3 седмици
  Ryuiso d2ba9c8b8e docs: add dependency upgrade records to README преди 3 седмици
  Ryuiso 8f56657124 Fix Babel loose mode warnings преди 3 седмици
  Ryuiso 425349652c Add missing babel plugins преди 3 седмици
  Ryuiso fe5ecebabd Fix webpack-dev-server compatibility преди 3 седмици
  Ryuiso d1bf9ce073 Upgrade dependencies to fix security vulnerabilities преди 3 седмици
променени са 16 файла, в които са добавени 4105 реда и са изтрити 3356 реда
  1. 11 4
      .babelrc
  2. 182 3
      README.md
  3. 5 12
      build/webpack.base.conf.js
  4. 3 11
      build/webpack.dev.conf.js
  5. 57 61
      build/webpack.prod.conf.js
  6. 1 1
      config/dev.env.js
  7. 2208 1839
      package-lock.json
  8. 30 26
      package.json
  9. 170 0
      src/assets/css/layout-spacing.css
  10. 390 399
      src/components/Header.vue
  11. 3 0
      src/main.js
  12. 110 110
      src/view/ContactUs/Index.vue
  13. 534 489
      src/view/HomePage.vue
  14. 81 81
      src/view/Info/Index.vue
  15. 82 82
      src/view/JoinUs/Index.vue
  16. 238 238
      src/view/News/Index.vue

+ 11 - 4
.babelrc

@@ -1,12 +1,19 @@
 {
   "presets": [
-    ["env", {
+    ["@babel/preset-env", {
       "modules": false,
       "targets": {
         "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
       }
-    }],
-    "stage-2"
+    }]
   ],
-  "plugins": ["transform-vue-jsx", "transform-runtime"]
+  "plugins": [
+    "@babel/transform-runtime",
+    "transform-vue-jsx",
+    "@babel/plugin-syntax-dynamic-import",
+    ["@babel/plugin-proposal-decorators", { "legacy": true }],
+    ["@babel/plugin-proposal-class-properties", { "loose": true }],
+    ["@babel/plugin-transform-private-property-in-object", { "loose": true }],
+    ["@babel/plugin-transform-private-methods", { "loose": true }]
+  ]
 }

+ 182 - 3
README.md

@@ -1,6 +1,25 @@
 # zyuas
 
-> 响应式企业官方网站模板,使用vue全家桶开发
+> 响应式企业官方网站模板,使用 vue 全家桶开发
+
+## 测试命令
+
+```bash
+# 安装依赖
+npm install
+
+# 开发模式
+npm run dev
+
+# 生产构建
+npm run build
+```
+
+## 注意事项
+
+- Node.js 版本建议 >= 14.0.0
+- 构建产物在 `dist/` 目录,需通过 HTTP 服务器访问
+- 图片资源较大,建议根据实际需求优化
 
 ## 技术要点
 
@@ -11,7 +30,7 @@
 
 # wow.js+animate.css——网站的整体动画插件
 
-# axios——ajax请求
+# axios——ajax 请求
 
 # vue-router——路由
 
@@ -19,5 +38,165 @@
 
 # session storage——本地存储
 
-# 对可复用的组件进行了封装,对api接口进行了封装
+# 对可复用的组件进行了封装,对 api 接口进行了封装
 ```
+
+---
+
+## 依赖升级记录 (2026-02-25)
+
+### 安全漏洞修复
+
+| 依赖 | 原版本 | 升级后 | 说明 |
+|------|--------|--------|------|
+| axios | 0.18.0 | 0.27.2 | **修复多个安全漏洞** |
+
+### 主要依赖升级
+
+| 依赖 | 原版本 | 升级后 | 说明 |
+|------|--------|--------|------|
+| vue | 2.5.2 | 2.7.16 | Vue 2 最终版本 |
+| vue-router | 3.0.1 | 3.6.5 | 最新兼容版本 |
+| vuex | 3.0.1 | 3.6.2 | 最新兼容版本 |
+| vue-template-compiler | 2.5.2 | 2.7.16 | 匹配 Vue 版本 |
+| webpack | 3.6.0 | 4.47.0 | 重大版本升级 |
+| webpack-dev-server | 2.9.1 | 3.11.3 | 兼容 webpack 4 |
+| vue-loader | 13.3.0 | 14.2.4 | 兼容版本 |
+| html-webpack-plugin | 2.30.1 | 4.5.2 | 兼容 webpack 4 |
+| copy-webpack-plugin | 4.0.1 | 5.1.2 | 兼容 webpack 4 |
+| css-loader | 0.28.0 | 3.6.0 | 最新稳定版 |
+| url-loader | 0.5.8 | 4.1.1 | 最新兼容版本 |
+| autoprefixer | 7.1.2 | 9.8.8 | 兼容 PostCSS 7 |
+| postcss-loader | 2.0.8 | 3.0.0 | 兼容版本 |
+
+### Babel 升级 (6.x → 7.x)
+
+| 依赖 | 版本 | 说明 |
+|------|------|------|
+| @babel/core | 7.29.0 | Babel 7 核心 |
+| @babel/preset-env | 7.29.0 | 智能预设 |
+| @babel/plugin-transform-runtime | 7.29.0 | 运行时转换 |
+| @babel/plugin-proposal-decorators | 7.29.0 | 装饰器支持 |
+| @babel/plugin-proposal-class-properties | 7.18.6 | 类属性支持 |
+| @babel/plugin-syntax-dynamic-import | 7.8.3 | 动态导入 |
+| babel-loader | 8.4.1 | Webpack Babel 加载器 |
+| @babel/runtime | 7.28.6 | 运行时辅助函数 |
+
+### 配置文件变更
+
+#### .babelrc
+```json
+{
+  "presets": [
+    ["@babel/preset-env", {
+      "modules": false,
+      "targets": {
+        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
+      }
+    }]
+  ],
+  "plugins": [
+    "@babel/transform-runtime",
+    "transform-vue-jsx",
+    "@babel/plugin-syntax-dynamic-import",
+    ["@babel/plugin-proposal-decorators", { "legacy": true }],
+    ["@babel/plugin-proposal-class-properties", { "loose": true }],
+    ["@babel/plugin-transform-private-property-in-object", { "loose": true }],
+    ["@babel/plugin-transform-private-methods", { "loose": true }]
+  ]
+}
+```
+
+#### .gitignore (新增规则)
+```
+# Node.js
+node_modules/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Build outputs
+dist/
+build-output/
+*.log
+logs/
+
+# Environment
+.env
+.env.local
+.env.*.local
+
+# Package archives
+*.tar.gz
+*.zip
+*.tgz
+```
+
+### 构建优化 (2026-02-25)
+
+已完成的优化:
+
+1. **Webpack mode 配置**
+   - 添加 `mode: 'production'` 启用 webpack 生产环境默认优化
+
+2. **代码分割优化**
+   - 配置 `splitChunks` 自动提取公共代码
+   - 添加 `commons` 缓存组优化共享模块
+   - 配置 `runtimeChunk` 分离运行时代码
+
+3. **性能提示阈值调整**
+   - `maxAssetSize`: 1MB (适配图片大小)
+   - `maxEntrypointSize`: 2MB (适配 bundle 大小)
+   - 仅对 `.js` 和 `.css` 文件进行警告
+
+4. **生产环境优化**
+   - 移除 `console.log` 和 `debugger`
+   - 启用 CSS 和 JS 压缩
+   - HTML 压缩优化
+
+### 构建警告说明
+
+当前构建无 webpack 警告。
+
+> **注意:** 构建时会显示 shelljs 的 `Accessing non-existent property` 警告
+> - 原因:shelljs 库内部使用方式导致
+> - 影响:**无任何影响**,可安全忽略
+> - 解决:需等待 shelljs 库更新
+
+### 图片优化建议
+
+项目包含较大图片文件,建议按需优化:
+
+| 文件 | 大小 | 建议 |
+|------|------|------|
+| sur1.png | 2.23 MiB | 压缩或使用 WebP |
+| buil1.png | 2.01 MiB | 压缩或使用 WebP |
+| dji-card.png | 1.74 MiB | 压缩或使用 WebP |
+| buil3.png | 1.71 MiB | 压缩或使用 WebP |
+| sur3.png | 1.48 MiB | 压缩或使用 WebP |
+
+**优化工具推荐:**
+- [TinyPNG](https://tinypng.com/) - 在线图片压缩
+- [Squoosh](https://squoosh.app/) - Google 图片压缩工具
+- `imagemin` - Node.js 图片压缩库
+
+
+
+### 更新日志
+
+#### 2026-02-25
+
+**依赖升级与安全修复:**
+- ✅ axios 0.18.0 → 0.27.2 (修复安全漏洞)
+- ✅ vue 2.5.2 → 2.7.16
+- ✅ webpack 3.6.0 → 4.47.0
+- ✅ Babel 6.x → 7.x
+- ✅ shelljs 0.7.6 → 0.8.5 (修复 Node.js 20 兼容性警告)
+
+**构建优化:**
+- ✅ 消除所有 webpack 警告
+- ✅ 消除所有 shelljs 警告
+- ✅ 优化代码分割
+- ✅ 启用生产环境压缩
+
+

+ 5 - 12
build/webpack.base.conf.js

@@ -1,5 +1,5 @@
 'use strict'
-var webpack = require('webpack')
+const webpack = require('webpack')
 const path = require('path')
 const utils = require('./utils')
 const config = require('../config')
@@ -9,21 +9,18 @@ function resolve (dir) {
   return path.join(__dirname, '..', dir)
 }
 
-
-
 module.exports = {
-  context: path.resolve(__dirname, '../'),
   entry: {
     app: './src/main.js'
   },
   externals: {
-    "BMap": "BMap" 
-  }, 
+    "BMap": "BMap"
+  },
   plugins: [
     new webpack.ProvidePlugin({
       $: "jquery",
       jQuery: "jquery",
-      "windows.jQuery": "jquery"
+      "window.jQuery": "jquery"
     })
   ],
   output: {
@@ -58,7 +55,7 @@ module.exports = {
         test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
         loader: 'url-loader',
         options: {
-          limit: 10000,
+          limit: 1000,
           name: utils.assetsPath('img/[name].[hash:7].[ext]')
         }
       },
@@ -81,11 +78,7 @@ module.exports = {
     ]
   },
   node: {
-    // prevent webpack from injecting useless setImmediate polyfill because Vue
-    // source contains it (although only uses it if it's native).
     setImmediate: false,
-    // prevent webpack from injecting mocks to Node native modules
-    // that does not make sense for the client
     dgram: 'empty',
     fs: 'empty',
     net: 'empty',

+ 3 - 11
build/webpack.dev.conf.js

@@ -2,7 +2,7 @@
 const utils = require('./utils')
 const webpack = require('webpack')
 const config = require('../config')
-const merge = require('webpack-merge')
+const { merge } = require('webpack-merge')
 const path = require('path')
 const baseWebpackConfig = require('./webpack.base.conf')
 const CopyWebpackPlugin = require('copy-webpack-plugin')
@@ -17,10 +17,8 @@ const devWebpackConfig = merge(baseWebpackConfig, {
   module: {
     rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
   },
-  // cheap-module-eval-source-map is faster for development
   devtool: config.dev.devtool,
 
-  // these devServer options should be customized in /config/index.js
   devServer: {
     clientLogLevel: 'warning',
     historyApiFallback: {
@@ -29,7 +27,6 @@ const devWebpackConfig = merge(baseWebpackConfig, {
       ],
     },
     hot: true,
-    contentBase: false, // since we use CopyWebpackPlugin.
     compress: true,
     host: HOST || config.dev.host,
     port: PORT || config.dev.port,
@@ -39,7 +36,7 @@ const devWebpackConfig = merge(baseWebpackConfig, {
       : false,
     publicPath: config.dev.assetsPublicPath,
     proxy: config.dev.proxyTable,
-    quiet: true, // necessary for FriendlyErrorsPlugin
+    quiet: true,
     watchOptions: {
       poll: config.dev.poll,
     }
@@ -49,15 +46,13 @@ const devWebpackConfig = merge(baseWebpackConfig, {
       'process.env': require('../config/dev.env')
     }),
     new webpack.HotModuleReplacementPlugin(),
-    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+    new webpack.NamedModulesPlugin(),
     new webpack.NoEmitOnErrorsPlugin(),
-    // https://github.com/ampedandwired/html-webpack-plugin
     new HtmlWebpackPlugin({
       filename: 'index.html',
       template: 'index.html',
       inject: true
     }),
-    // copy custom static assets
     new CopyWebpackPlugin([
       {
         from: path.resolve(__dirname, '../static'),
@@ -74,12 +69,9 @@ module.exports = new Promise((resolve, reject) => {
     if (err) {
       reject(err)
     } else {
-      // publish the new Port, necessary for e2e tests
       process.env.PORT = port
-      // add port to devServer config
       devWebpackConfig.devServer.port = port
 
-      // Add FriendlyErrorsPlugin
       devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
         compilationSuccessInfo: {
           messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],

+ 57 - 61
build/webpack.prod.conf.js

@@ -3,7 +3,7 @@ const path = require('path')
 const utils = require('./utils')
 const webpack = require('webpack')
 const config = require('../config')
-const merge = require('webpack-merge')
+const { merge } = require('webpack-merge')
 const baseWebpackConfig = require('./webpack.base.conf')
 const CopyWebpackPlugin = require('copy-webpack-plugin')
 const HtmlWebpackPlugin = require('html-webpack-plugin')
@@ -14,6 +14,7 @@ const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
 const env = require('../config/prod.env')
 
 const webpackConfig = merge(baseWebpackConfig, {
+  mode: 'production',
   module: {
     rules: utils.styleLoaders({
       sourceMap: config.build.productionSourceMap,
@@ -27,39 +28,69 @@ const webpackConfig = merge(baseWebpackConfig, {
     filename: utils.assetsPath('js/[name].[chunkhash].js'),
     chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
   },
+  optimization: {
+    splitChunks: {
+      chunks: 'all',
+      cacheGroups: {
+        vendors: {
+          name: 'vendor',
+          test: /[\\/]node_modules[\\/]/,
+          priority: -10,
+          chunks: 'initial'
+        },
+        app: {
+          name: 'app',
+          test: /[\\/]src[\\/]/,
+          priority: -20,
+          chunks: 'initial'
+        },
+        commons: {
+          name: 'commons',
+          minChunks: 2,
+          priority: -30,
+          chunks: 'initial',
+          reuseExistingChunk: true
+        }
+      }
+    },
+    runtimeChunk: {
+      name: 'manifest'
+    },
+    minimizer: [
+      new UglifyJsPlugin({
+        uglifyOptions: {
+          compress: {
+            warnings: false,
+            drop_console: true,
+            drop_debugger: true
+          }
+        },
+        sourceMap: config.build.productionSourceMap,
+        parallel: true
+      })
+    ]
+  },
+  performance: {
+    hints: 'warning',
+    maxAssetSize: 1024000,
+    maxEntrypointSize: 2048000,
+    assetFilter: function (assetFilename) {
+      return assetFilename.endsWith('.js') || assetFilename.endsWith('.css')
+    }
+  },
   plugins: [
-    // http://vuejs.github.io/vue-loader/en/workflow/production.html
     new webpack.DefinePlugin({
       'process.env': env
     }),
-    new UglifyJsPlugin({
-      uglifyOptions: {
-        compress: {
-          warnings: false
-        }
-      },
-      sourceMap: config.build.productionSourceMap,
-      parallel: true
-    }),
-    // extract css into its own file
     new ExtractTextPlugin({
-      filename: utils.assetsPath('css/[name].[contenthash].css'),
-      // Setting the following option to `false` will not extract CSS from codesplit chunks.
-      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
-      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
-      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+      filename: utils.assetsPath('css/[name].[hash].css'),
       allChunks: true,
     }),
-    // Compress extracted CSS. We are using this plugin so that possible
-    // duplicated CSS from different components can be deduped.
     new OptimizeCSSPlugin({
       cssProcessorOptions: config.build.productionSourceMap
         ? { safe: true, map: { inline: false } }
         : { safe: true }
     }),
-    // generate dist index.html with correct asset hash for caching.
-    // you can customize output by editing /index.html
-    // see https://github.com/ampedandwired/html-webpack-plugin
     new HtmlWebpackPlugin({
       filename: config.build.index,
       template: 'index.html',
@@ -67,48 +98,13 @@ const webpackConfig = merge(baseWebpackConfig, {
       minify: {
         removeComments: true,
         collapseWhitespace: true,
-        removeAttributeQuotes: true
-        // more options:
-        // https://github.com/kangax/html-minifier#options-quick-reference
+        removeAttributeQuotes: true,
+        minifyCSS: true,
+        minifyJS: true
       },
-      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
-      chunksSortMode: 'dependency'
+      chunksSortMode: 'auto'
     }),
-    // keep module.id stable when vendor modules does not change
     new webpack.HashedModuleIdsPlugin(),
-    // enable scope hoisting
-    new webpack.optimize.ModuleConcatenationPlugin(),
-    // split vendor js into its own file
-    new webpack.optimize.CommonsChunkPlugin({
-      name: 'vendor',
-      minChunks (module) {
-        // any required modules inside node_modules are extracted to vendor
-        return (
-          module.resource &&
-          /\.js$/.test(module.resource) &&
-          module.resource.indexOf(
-            path.join(__dirname, '../node_modules')
-          ) === 0
-        )
-      }
-    }),
-    // extract webpack runtime and module manifest to its own file in order to
-    // prevent vendor hash from being updated whenever app bundle is updated
-    new webpack.optimize.CommonsChunkPlugin({
-      name: 'manifest',
-      minChunks: Infinity
-    }),
-    // This instance extracts shared chunks from code splitted chunks and bundles them
-    // in a separate chunk, similar to the vendor chunk
-    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
-    new webpack.optimize.CommonsChunkPlugin({
-      name: 'app',
-      async: 'vendor-async',
-      children: true,
-      minChunks: 3
-    }),
-
-    // copy custom static assets
     new CopyWebpackPlugin([
       {
         from: path.resolve(__dirname, '../static'),

+ 1 - 1
config/dev.env.js

@@ -1,5 +1,5 @@
 'use strict'
-const merge = require('webpack-merge')
+const { merge } = require('webpack-merge')
 const prodEnv = require('./prod.env')
 
 module.exports = merge(prodEnv, {

Файловите разлики са ограничени, защото са твърде много
+ 2208 - 1839
package-lock.json


+ 30 - 26
package.json

@@ -10,51 +10,55 @@
     "build": "node build/build.js"
   },
   "dependencies": {
+    "@babel/runtime": "^7.28.6",
     "animate.css": "^3.7.0",
-    "axios": "^0.18.0",
-    "vue": "^2.5.2",
-    "vue-router": "^3.0.1",
-    "vuex": "^3.0.1"
+    "axios": "^0.27.2",
+    "vue": "^2.7.16",
+    "vue-router": "^3.6.5",
+    "vuex": "^3.6.2"
   },
   "devDependencies": {
-    "autoprefixer": "^7.1.2",
-    "babel-core": "^6.22.1",
-    "babel-helper-vue-jsx-merge-props": "^2.0.3",
-    "babel-loader": "^7.1.1",
+    "@babel/core": "^7.29.0",
+    "@babel/plugin-proposal-class-properties": "^7.18.6",
+    "@babel/plugin-proposal-decorators": "^7.29.0",
+    "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+    "@babel/plugin-transform-runtime": "^7.29.0",
+    "@babel/preset-env": "^7.29.0",
+    "@babel/preset-stage-2": "^7.8.3",
+    "autoprefixer": "^9.8.8",
+    "babel-loader": "^8.4.1",
     "babel-plugin-syntax-jsx": "^6.18.0",
-    "babel-plugin-transform-runtime": "^6.22.0",
-    "babel-plugin-transform-vue-jsx": "^3.5.0",
-    "babel-preset-env": "^1.3.2",
-    "babel-preset-stage-2": "^6.22.0",
+    "babel-plugin-transform-vue-jsx": "^3.7.0",
     "chalk": "^2.0.1",
-    "copy-webpack-plugin": "^4.0.1",
-    "css-loader": "^0.28.0",
-    "extract-text-webpack-plugin": "^3.0.0",
+    "copy-webpack-plugin": "^5.1.2",
+    "css-loader": "^3.6.0",
+    "extract-text-webpack-plugin": "^4.0.0-beta.0",
     "file-loader": "^1.1.4",
     "friendly-errors-webpack-plugin": "^1.6.1",
-    "html-webpack-plugin": "^2.30.1",
+    "html-webpack-plugin": "^4.5.2",
     "jquery": "^3.3.1",
     "node-notifier": "^5.1.2",
-    "optimize-css-assets-webpack-plugin": "^3.2.0",
+    "optimize-css-assets-webpack-plugin": "^5.0.8",
     "ora": "^1.2.0",
     "portfinder": "^1.0.13",
     "postcss-import": "^11.0.0",
-    "postcss-loader": "^2.0.8",
+    "postcss-loader": "^3.0.0",
     "postcss-url": "^7.2.1",
     "rimraf": "^2.6.0",
     "semver": "^5.3.0",
-    "shelljs": "^0.7.6",
-    "style-loader": "^0.23.1",
+    "shelljs": "^0.8.5",
+    "style-loader": "^1.3.0",
     "swiper": "^4.4.2",
     "uglifyjs-webpack-plugin": "^1.1.1",
-    "url-loader": "^0.5.8",
-    "vue-loader": "^13.3.0",
+    "url-loader": "^4.1.1",
+    "vue-loader": "^14.2.4",
     "vue-style-loader": "^3.0.1",
-    "vue-template-compiler": "^2.5.2",
-    "webpack": "^3.6.0",
+    "vue-template-compiler": "^2.7.16",
+    "webpack": "^4.47.0",
     "webpack-bundle-analyzer": "^2.9.0",
-    "webpack-dev-server": "^2.9.1",
-    "webpack-merge": "^4.1.0",
+    "webpack-cli": "^3.3.12",
+    "webpack-dev-server": "^3.11.3",
+    "webpack-merge": "^5.10.0",
     "wowjs": "^1.1.3"
   },
   "engines": {

+ 170 - 0
src/assets/css/layout-spacing.css

@@ -0,0 +1,170 @@
+/**
+ * 全局布局边距系统
+ * Global Layout Spacing System
+ * 
+ * 统一的左右边距规范,确保所有页面排版整齐美观
+ * 适用于桌面端(Desktop),移动端保持原有样式
+ */
+
+/* ===== CSS 变量定义 ===== */
+:root {
+  /* 容器最大宽度 */
+  --container-max-width: 1200px;
+  
+  /* 桌面端左右边距 */
+  --desktop-padding-x: 40px;
+  
+  /* 平板端左右边距 */
+  --tablet-padding-x: 20px;
+  
+  /* 移动端左右边距(如需要) */
+  --mobile-padding-x: 15px;
+  
+  /* 区块垂直间距 */
+  --section-spacing-y: 80px;
+  
+  /* 小区块垂直间距 */
+  --subsection-spacing-y: 40px;
+}
+
+/* ===== 通用容器类 ===== */
+
+/* 主容器 - 限制最大宽度并居中 */
+.l-container {
+  max-width: var(--container-max-width);
+  margin-left: auto;
+  margin-right: auto;
+  padding-left: var(--desktop-padding-x);
+  padding-right: var(--desktop-padding-x);
+  box-sizing: border-box;
+}
+
+/* 全宽容器 - 仅应用左右内边距 */
+.l-container-fluid {
+  padding-left: var(--desktop-padding-x);
+  padding-right: var(--desktop-padding-x);
+  box-sizing: border-box;
+}
+
+/* 无左右内边距的容器 */
+.l-container-none {
+  padding-left: 0;
+  padding-right: 0;
+}
+
+/* ===== 响应式断点 ===== */
+
+/* 平板端 (768px - 1199px) */
+@media (max-width: 1199px) {
+  :root {
+    --desktop-padding-x: 20px;
+  }
+  
+  .l-container {
+    padding-left: var(--tablet-padding-x);
+    padding-right: var(--tablet-padding-x);
+  }
+  
+  .l-container-fluid {
+    padding-left: var(--tablet-padding-x);
+    padding-right: var(--tablet-padding-x);
+  }
+}
+
+/* 移动端 (< 768px) - 保持原有 Bootstrap 样式 */
+@media (max-width: 767px) {
+  :root {
+    --desktop-padding-x: var(--mobile-padding-x);
+    --tablet-padding-x: var(--mobile-padding-x);
+  }
+}
+
+/* ===== 区块间距 ===== */
+
+/* 大区块间距 (80px) */
+.l-section {
+  padding-top: var(--section-spacing-y);
+  padding-bottom: var(--section-spacing-y);
+}
+
+/* 小区块间距 (40px) */
+.l-subsection {
+  padding-top: var(--subsection-spacing-y);
+  padding-bottom: var(--subsection-spacing-y);
+}
+
+/* 顶部无间距 */
+.l-section--no-top {
+  padding-top: 0;
+}
+
+/* 底部无间距 */
+.l-section--no-bottom {
+  padding-bottom: 0;
+}
+
+/* ===== 内容对齐工具类 ===== */
+
+/* 文本内容最大宽度 */
+.l-content {
+  max-width: 800px;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+/* 居中对齐 */
+.l-align-center {
+  text-align: center;
+}
+
+/* 两端对齐 */
+.l-align-justify {
+  text-align: justify;
+}
+
+/* ===== 网格系统间距 ===== */
+
+/* 行间距 */
+.l-row {
+  display: flex;
+  flex-wrap: wrap;
+  margin-left: -15px;
+  margin-right: -15px;
+}
+
+/* 列间距 */
+.l-col {
+  padding-left: 15px;
+  padding-right: 15px;
+  box-sizing: border-box;
+}
+
+/* ===== 特殊场景 ===== */
+
+/* Banner/轮播图全宽 */
+.l-banner {
+  padding-left: 0;
+  padding-right: 0;
+}
+
+/* 导航栏边距 */
+.l-navbar {
+  padding-left: var(--desktop-padding-x);
+  padding-right: var(--desktop-padding-x);
+}
+
+/* Footer 边距 */
+.l-footer {
+  padding-left: var(--desktop-padding-x);
+  padding-right: var(--desktop-padding-x);
+}
+
+/* ===== 打印样式 ===== */
+@media print {
+  .l-container,
+  .l-container-fluid {
+    padding-left: 0;
+    padding-right: 0;
+    max-width: 100%;
+  }
+}

+ 390 - 399
src/components/Header.vue

@@ -1,399 +1,390 @@
-<template>
-  <!-- 头部整体盒子 -->
-  <div id="header" class="container-fuild">
-    <!-- 头部顶部 -->
-    <div class="header-top container-fuild hidden-xs">
-      <div class="container">
-        <div class="server pull-left">
-          <span class="glyphicon glyphicon-earphone"></span>15086621233
-          <span class="glyphicon glyphicon-envelope"></span>zhanyuhangkong@163.com
-          <span class="glyphicon glyphicon-time"></span>全天候服务
-        </div>
-        <div class="shejiao pull-right">
-          <span class="glyphicon glyphicon-hand-right"></span>赶快联系我们吧!
-          <span class="glyphicon glyphicon-hand-left"></span>
-        </div>
-      </div>
-    </div>
-    <!-- 电脑导航 -->
-    <div class="header-nav container hidden-xs ">
-      <!-- 导航logo -->
-      <div class="header-nav-logo">
-        <img src="@/assets/img/logo_black.svg">
-      </div>
-      <!-- 导航内容 -->
-      <ul class="header-nav-wrapper">
-        <li
-          v-for="(item,index) in navList"
-          :key="index"
-          :class="index==navIndex?'active':''"
-          @click="navClick(index,item.name)"
-        >
-          <router-link :to="item.path">
-            {{ item.name }}
-            <span v-if="item.children.length>0" class="glyphicon glyphicon-menu-down"></span>
-            <i class="underline"></i>
-          </router-link>
-          <dl v-if="item.children.length>0">
-            <dt v-for="(i,n) in item.children" :key="n">
-              <router-link :to="i.path">{{ i.name }}</router-link>
-            </dt>
-          </dl>
-        </li>
-      </ul>
-    </div>
-    <!-- 手机导航 -->
-    <div class="header-nav-m container-fuild visible-xs">
-      <div class="header-nav-m-logo">
-        <img class="center-block" src="@/assets/img/logo_black.svg" alt="logo">
-      </div>
-      <!-- 导航栏 -->
-      <div class="header-nav-m-menu text-center">
-        {{ menuName }}
-        <div
-          class="header-nav-m-menu-wrapper"
-          data-toggle="collapse"
-          data-target="#menu"
-          @click="menuClick"
-        >
-          <span :class="menuClass"></span>
-        </div>
-        <!-- 导航内容 -->
-        <ul id="menu" class="header-nav-m-wrapper collapse">
-          <li
-            v-for="(item,index) in navList"
-            :key="index"
-            :class="index==navIndex?'active':''"
-            @click="navClick(index,item.name)"
-            data-toggle="collapse"
-            data-target="#menu"
-          >
-            <router-link :to="item.path">
-              {{ item.name }}
-              <i class="underline"></i>
-            </router-link>
-          </li>
-        </ul>
-      </div>
-    </div>
-  </div>
-</template>
-<script>
-export default {
-  name: "Header",
-  data() {
-    return {
-      navIndex: sessionStorage.getItem('navIndex') ? sessionStorage.getItem('navIndex') : 0,
-      menuName: "首页",
-      menuClass: "glyphicon glyphicon-menu-down",
-      navList: [
-        {
-          name: "首页",
-          path: "/",
-          children: []
-        },
-        {
-          name: "产品",
-          path: "/products",
-          children: [
-            {
-              name: "行业应用无人机",
-              path: "/products/djiAircraft"
-            },
-            {
-              name: "无人机负载",
-              path: "/products/payloads"
-            },
-            {
-              name: "软件与服务",
-              path: "/products/software"
-            },
-            {
-              name: "软件定制开发",
-              path: "/products/develop"
-            },
-            // {
-            //   name: "其他智能无人系统",
-            //   path: "/products/others"
-            // },
-            // {
-            //   name: "飞行咨询服务",
-            //   path: "/products/consult"
-            // },
-          ]
-        },
-        {
-          name: "解决方案",
-          path: "/solutions",
-          children: []
-        },
-        {
-          name: "公司动态",
-          path: "/news",
-          children: []
-        },
-        {
-          name: "公司介绍",
-          path: "/info",
-          children: []
-        },
-        // {
-        //   name: "加入我们",
-        //   path: "/joinus",
-        //   children: []
-        // },
-        // {
-        //   name: "联系我们",
-        //   path: "/contactus",
-        //   children: []
-        // }
-      ]
-    };
-  },
-  methods: {
-    navClick(index, name) {
-      this.navIndex = index;
-      sessionStorage.setItem('navIndex', index)
-      this.menuName = name;
-    },
-    menuClick() {
-      if (this.menuClass == "glyphicon glyphicon-menu-down") {
-        this.menuClass = "glyphicon glyphicon-menu-up";
-      } else {
-        this.menuClass = "glyphicon glyphicon-menu-down";
-      }
-    }
-  }
-};
-</script>
-<style scoped>
-/* 顶部 */
-#header {
-  background: #f4f4f4;
-  transition: all ease 0.6s;
-  box-shadow: 0 1px 2px lightgrey;
-}
-
-#header .header-top {
-  height: 30px;
-  color: #fff;
-  font-size: 10px;
-  line-height: 30px;
-  background: #474747;
-}
-
-/* 顶部的图标 */
-#header .header-top span {
-  margin: 0 8px;
-}
-
-/* 导航栏 */
-#header .header-nav {
-  height: 80px;
-
-}
-
-/* 导航栏logo */
-#header .header-nav .header-nav-logo {
-  width: 120px;
-  height: 80px;
-  float: left;
-  position: relative;
-}
-
-/* 导航栏logo图片 */
-#header .header-nav .header-nav-logo img {
-  width: 120px;
-  height: 80px;
-  position: absolute;
-  top: 10px;
-  left: 0;
-  right: 10px;
-  bottom: 10px;
-  margin: auto;
-}
-
-/* 导航栏 导航容器 */
-#header .header-nav-fixed .header-nav-wrapper {
-  line-height: 30px;
-}
-
-#header .header-nav .header-nav-wrapper {
-//line-height: 80px; margin-top: 47px; float: right; //margin: 0; max-width: 800px;
-}
-
-/* 导航栏 每个导航 */
-#header .header-nav .header-nav-wrapper > li {
-  float: left;
-  margin: 0 15px;
-  position: relative;
-}
-
-/* 导航栏 每个导航下面的 a 链接 */
-#header .header-nav .header-nav-wrapper > li > a {
-  color: #000;
-  font-size: 14px;
-  font-weight: bold;
-  padding: 13px 0;
-  position: relative;
-}
-
-/* 导航栏 每个导航下面的 a 链接的下划线 */
-#header .header-nav .header-nav-wrapper > li > a > i {
-  display: block;
-  position: absolute;
-  bottom: -2px;
-  left: 50%;
-  width: 0;
-  height: 1px;
-  opacity: 0;
-  transition: all 0.3s ease;
-  background-color: #1e73be;
-}
-
-/* 导航栏 每个导航下面的 a 链接的右侧小三角 */
-#header .header-nav .header-nav-wrapper > li > a > span {
-  font-size: 10px;
-  transition: transform ease 0.4s;
-}
-
-/* 导航栏 每个导航下面的 a 链接 鼠标滑上去的样式 */
-#header .header-nav .header-nav-wrapper > li > a:hover {
-  color: #1e73be;
-  text-decoration: none;
-}
-
-/* 导航栏 每个导航下面的 a 链接 鼠标滑上去下划线的样式 */
-#header .header-nav .header-nav-wrapper > li > a:hover .underline {
-  opacity: 1;
-  width: 100%;
-  left: 0;
-}
-
-/* 导航栏 每个导航下面的 a 链接 鼠标滑上去三角标的样式 */
-#header .header-nav .header-nav-wrapper > li > a:hover span {
-  transform: rotate(180deg);
-}
-
-/* 导航栏 每个导航下面的 a 链接 鼠标点击后的样式 */
-#header .header-nav .header-nav-wrapper > li.active > a {
-  color: #1e73be;
-  text-decoration: none;
-  border-bottom: 2px solid #1e73be;
-}
-
-/* 导航栏 每个导航下面的二级导航容器 */
-#header .header-nav .header-nav-wrapper > li > dl {
-  display: none;
-  position: absolute;
-  width: 150px;
-  margin-top: 14px;
-  left: 0;
-  z-index: 999999;
-  box-shadow: 0 0 1px 1px #f3f3f3;
-  border-radius: 5px;
-  background: #fff;
-}
-
-/* 导航栏 每个导航下面的二级导航容器的每个导航 */
-#header .header-nav .header-nav-wrapper > li > dl > dt {
-  width: 100%;
-  padding: 10px;
-  border-bottom: 1px solid #f3f3f3;
-}
-
-/* 导航栏 每个导航下面的二级导航容器的每个导航 当鼠标滑上时的样式*/
-#header .header-nav .header-nav-wrapper > li > dl > dt > a:hover {
-  text-decoration: none;
-}
-
-/* 导航栏 滑上一级导航显示二级导航 */
-#header .header-nav .header-nav-wrapper > li:hover dl {
-  display: block;
-
-}
-
-#header .header-nav .header-nav-wrapper > li > dl > dt:hover {
-  cursor: pointer;
-  background: #f5f5f5;
-  text-decoration: underline;
-  text-decoration-color: #1e73be;
-}
-
-@media screen and (max-width: 997px) {
-  #header .header-nav-m {
-  }
-
-  /* 导航栏logo容器 */
-  #header .header-nav-m .header-nav-m-logo {
-    height: 80px;
-    position: relative;
-  }
-
-  /* 导航栏logo图片 */
-  #header .header-nav-m .header-nav-m-logo img {
-    width: 180px;
-    height: 60px;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    margin: auto;
-  }
-
-  /* 导航栏  菜单容器 */
-  #header .header-nav-m .header-nav-m-menu {
-    color: #fff;
-    height: 40px;
-    font-size: 13px;
-    line-height: 40px;
-    background: #474747;
-    position: relative;
-  }
-
-  /* 导航栏 菜单图标 */
-  #header .header-nav-m .header-nav-m-menu-wrapper {
-    position: absolute;
-    top: 50%;
-    right: 20px;
-    margin-top: -20px;
-    width: 50px;
-    height: 40px;
-    color: #fff;
-    z-index: 999999;
-    font-size: 12px;
-  }
-
-  /* 导航栏 */
-  #header .header-nav-m .header-nav-m-wrapper {
-    position: absolute;
-    top: 40px;
-    left: 0;
-    width: 100%;
-    background: #474747;
-    z-index: 9999999;
-  }
-
-  /* 导航栏 每个导航 */
-  #header .header-nav-m .header-nav-m-wrapper > li {
-    height: 40px;
-    line-height: 40px;
-    border-bottom: 1px solid #ccc;
-  }
-
-  /* 导航栏 每个导航下面的 a 链接 */
-  #header .header-nav-m .header-nav-m-wrapper > li > a {
-    color: #fff;
-    font-size: 13px;
-    font-weight: bold;
-    padding: 15px 0;
-    position: relative;
-  }
-
-  /* 导航栏 每个导航下面的 a 链接的右侧小三角 */
-  #header .header-nav .header-nav-wrapper > li > a > span {
-    font-size: 10px;
-  }
-}
-</style>
+<template>
+  <header id="header">
+    <!-- 顶部信息栏 (桌面端) -->
+    <div class="header-top hidden-xs">
+      <div class="container">
+        <div class="header-top-left">
+          <span><i class="glyphicon glyphicon-earphone"></i> 15086621233</span>
+          <span><i class="glyphicon glyphicon-envelope"></i> zhanyuhangkong@163.com</span>
+          <span><i class="glyphicon glyphicon-time"></i> 全天候服务</span>
+        </div>
+        <div class="header-top-right">
+          <span><i class="glyphicon glyphicon-hand-right"></i> 赶快联系我们吧!</span>
+          <i class="glyphicon glyphicon-hand-left"></i>
+        </div>
+      </div>
+    </div>
+
+    <!-- 主导航 (桌面端) -->
+    <nav class="header-nav container hidden-xs">
+      <div class="header-logo">
+        <img src="@/assets/img/logo_black.svg" alt="Logo">
+      </div>
+      <div class="header-company-name">
+        <span>上海展域航空技术有限公司</span>
+      </div>
+      <ul class="nav-menu">
+        <li
+          v-for="(item, index) in navList"
+          :key="index"
+          :class="{ active: index === navIndex }"
+          @click="navClick(index, item.name)"
+        >
+          <router-link :to="item.path">
+            {{ item.name }}
+            <i v-if="item.children.length > 0" class="glyphicon glyphicon-menu-down"></i>
+            <span class="nav-underline"></span>
+          </router-link>
+          <!-- 二级菜单 -->
+          <ul v-if="item.children.length > 0" class="submenu">
+            <li v-for="(child, n) in item.children" :key="n">
+              <router-link :to="child.path">{{ child.name }}</router-link>
+            </li>
+          </ul>
+        </li>
+      </ul>
+    </nav>
+
+    <!-- 手机导航 -->
+    <div class="header-nav-m container-fuild visible-xs">
+      <div class="header-nav-m-logo">
+        <img class="center-block" src="@/assets/img/logo_black.svg" alt="logo">
+      </div>
+      <!-- 导航栏 -->
+      <div class="header-nav-m-menu text-center">
+        {{ menuName }}
+        <div
+          class="header-nav-m-menu-wrapper"
+          data-toggle="collapse"
+          data-target="#menu"
+          @click="menuClick"
+        >
+          <span :class="menuClass"></span>
+        </div>
+        <!-- 导航内容 -->
+        <ul id="menu" class="header-nav-m-wrapper collapse">
+          <li
+            v-for="(item,index) in navList"
+            :key="index"
+            :class="index==navIndex?'active':''"
+            @click="navClick(index,item.name)"
+            data-toggle="collapse"
+            data-target="#menu"
+          >
+            <router-link :to="item.path">
+              {{ item.name }}
+              <i class="underline"></i>
+            </router-link>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </header>
+</template>
+
+<script>
+export default {
+  name: "Header",
+  data() {
+    return {
+      navIndex: sessionStorage.getItem('navIndex') || 0,
+      menuName: "首页",
+      menuClass: "glyphicon glyphicon-menu-down",
+      navList: [
+        { name: "首页", path: "/", children: [] },
+        {
+          name: "产品",
+          path: "/products",
+          children: [
+            { name: "行业应用无人机", path: "/products/djiAircraft" },
+            { name: "无人机负载", path: "/products/payloads" },
+            { name: "软件与服务", path: "/products/software" },
+            { name: "软件定制开发", path: "/products/develop" }
+          ]
+        },
+        { name: "解决方案", path: "/solutions", children: [] },
+        { name: "公司动态", path: "/news", children: [] },
+        { name: "公司介绍", path: "/info", children: [] }
+      ]
+    };
+  },
+  methods: {
+    navClick(index, name) {
+      this.navIndex = index;
+      sessionStorage.setItem('navIndex', index);
+      this.menuName = name;
+    },
+    menuClick() {
+      if (this.menuClass === "glyphicon glyphicon-menu-down") {
+        this.menuClass = "glyphicon glyphicon-menu-up";
+      } else {
+        this.menuClass = "glyphicon glyphicon-menu-down";
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+/* ===== CSS 变量 ===== */
+#header {
+  --header-bg: #f4f4f4;
+  --header-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+  --top-bar-bg: #474747;
+  --top-bar-text: #fff;
+  --nav-text: #333;
+  --nav-hover: #1e73be;
+  --nav-active: #1e73be;
+  --submenu-bg: #fff;
+  --submenu-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+  --transition: all 0.3s ease;
+}
+
+/* ===== 基础样式 ===== */
+#header {
+  background: var(--header-bg);
+  box-shadow: var(--header-shadow);
+  position: sticky;
+  top: 0;
+  z-index: 1000;
+}
+
+/* ===== 顶部信息栏 ===== */
+.header-top {
+  background: var(--top-bar-bg);
+  color: var(--top-bar-text);
+  font-size: 12px;
+  height: 36px;
+  line-height: 36px;
+}
+
+.header-top .container {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.header-top-left,
+.header-top-right {
+  display: flex;
+  gap: 16px;
+  align-items: center;
+}
+
+.header-top i {
+  margin-right: 4px;
+  font-size: 11px;
+}
+
+/* ===== 主导航 ===== */
+.header-nav {
+  display: flex;
+  align-items: center;
+  height: 80px;
+  padding: 0;
+}
+
+/* Logo */
+.header-logo {
+  flex-shrink: 0;
+  display: flex;
+  align-items: center;
+}
+
+.header-logo img {
+  height: 45px;
+  width: auto;
+  object-fit: contain;
+}
+
+/* 企业名称 */
+.header-company-name {
+  flex-shrink: 0;
+  display: flex;
+  align-items: center;
+  padding-left: 10px;
+  margin-left: 10px;
+  border-left: 1px solid #e0e0e0;
+}
+
+.header-company-name span {
+  font-size: 16px;
+  font-weight: 600;
+  color: #333;
+  letter-spacing: 1px;
+  line-height: 1.4;
+  white-space: nowrap;
+}
+
+/* 导航菜单 */
+.nav-menu {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  margin-left: auto;
+}
+
+.nav-menu > li {
+  position: relative;
+}
+
+.nav-menu > li > a {
+  display: flex;
+  align-items: center;
+  gap: 4px;
+  padding: 12px 16px;
+  color: var(--nav-text);
+  font-size: 14px;
+  font-weight: 600;
+  text-decoration: none;
+  transition: var(--transition);
+}
+
+.nav-menu > li > a:hover,
+.nav-menu > li.active > a {
+  color: var(--nav-hover);
+}
+
+.nav-menu > li > a i {
+  font-size: 10px;
+  transition: transform 0.3s ease;
+}
+
+.nav-menu > li > a:hover i {
+  transform: rotate(180deg);
+}
+
+/* 下划线动画 */
+.nav-underline {
+  position: absolute;
+  bottom: 8px;
+  left: 50%;
+  width: 0;
+  height: 2px;
+  background: var(--nav-active);
+  transition: var(--transition);
+  transform: translateX(-50%);
+}
+
+.nav-menu > li > a:hover .nav-underline,
+.nav-menu > li.active .nav-underline {
+  width: calc(100% - 32px);
+}
+
+.nav-menu > li.active > a {
+  color: var(--nav-active);
+}
+
+/* 二级菜单 */
+.submenu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  min-width: 160px;
+  background: var(--submenu-bg);
+  border-radius: 8px;
+  box-shadow: var(--submenu-shadow);
+  list-style: none;
+  margin-top: 8px;
+  padding: 8px 0;
+  opacity: 0;
+  visibility: hidden;
+  transform: translateY(-10px);
+  transition: var(--transition);
+}
+
+.nav-menu > li:hover .submenu {
+  opacity: 1;
+  visibility: visible;
+  transform: translateY(0);
+}
+
+.submenu li a {
+  display: block;
+  padding: 10px 20px;
+  color: var(--nav-text);
+  font-size: 13px;
+  text-decoration: none;
+  transition: var(--transition);
+}
+
+.submenu li a:hover {
+  background: #f5f5f5;
+  color: var(--nav-hover);
+}
+
+/* ===== 移动端导航(保留原始样式) ===== */
+@media screen and (max-width: 997px) {
+  /* 桌面端元素不在移动端显示 */
+  .header-company-name {
+    display: none;
+  }
+  
+  #header .header-nav-m .header-nav-m-logo {
+    height: 80px;
+    position: relative;
+  }
+
+  #header .header-nav-m .header-nav-m-logo img {
+    width: 180px;
+    height: 60px;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+  }
+
+  #header .header-nav-m .header-nav-m-menu {
+    color: #fff;
+    height: 40px;
+    font-size: 13px;
+    line-height: 40px;
+    background: #474747;
+    position: relative;
+  }
+
+  #header .header-nav-m .header-nav-m-menu-wrapper {
+    position: absolute;
+    top: 50%;
+    right: 20px;
+    margin-top: -20px;
+    width: 50px;
+    height: 40px;
+    color: #fff;
+    z-index: 999999;
+    font-size: 12px;
+  }
+
+  #header .header-nav-m .header-nav-m-wrapper {
+    position: absolute;
+    top: 40px;
+    left: 0;
+    width: 100%;
+    background: #474747;
+    z-index: 9999999;
+  }
+
+  #header .header-nav-m .header-nav-m-wrapper > li {
+    height: 40px;
+    line-height: 40px;
+    border-bottom: 1px solid #ccc;
+  }
+
+  #header .header-nav-m .header-nav-m-wrapper > li > a {
+    color: #fff;
+    font-size: 13px;
+    font-weight: bold;
+    padding: 15px 0;
+    position: relative;
+  }
+
+  #header .header-nav .header-nav-wrapper > li > a > span {
+    font-size: 10px;
+  }
+}
+</style>

+ 3 - 0
src/main.js

@@ -19,6 +19,9 @@ import 'swiper/dist/css/swiper.min.css';
 /* 重置样式 */
 import './assets/css/reset.min.css'
 
+/* 全局布局边距系统 */
+import './assets/css/layout-spacing.css'
+
 /* jquery */
 import 'jquery'
 

+ 110 - 110
src/view/ContactUs/Index.vue

@@ -1,110 +1,110 @@
-<template>
-  <div id="ContactUs">
-    <div class="banner container-fuild text-center">联系我们</div>
-    <div class="container">
-      <div class="container-fuild ContactUs-container">
-        <div class="row">
-          <div class="col-xs-12 col-sm-12 col-md-6">
-            <form class="form-horizontal" role="form">
-              <div class="form-group">
-                <label for="name" class="col-sm-2 control-label">姓名</label>
-                <div class="col-sm-10 col-xs-12">
-                  <input type="text" class="form-control" id="name" placeholder="请输入名字">
-                </div>
-              </div>
-              <div class="form-group">
-                <label for="email" class="col-sm-2 control-label">邮箱</label>
-                <div class="col-sm-10">
-                  <input type="text" class="form-control" id="email" placeholder="请输入邮箱">
-                </div>
-              </div>
-              <div class="form-group">
-                <label for="tel" class="col-sm-2 control-label">电话</label>
-                <div class="col-sm-10">
-                  <input type="text" class="form-control" id="tel" placeholder="请输入电话">
-                </div>
-              </div>
-              <div class="form-group">
-                <label for="content" class="col-sm-2 control-label">内容</label>
-                <div class="col-sm-10">
-                  <textarea class="form-control" id="content" rows="8" placeholder="请输入内容"></textarea>
-                </div>
-              </div>
-              <div class="form-group">
-                <div class="col-sm-offset-2 col-sm-10">
-                  <button type="submit" class="btn btn-default btn-block">提交</button>
-                </div>
-              </div>
-            </form>
-          </div>
-          <div class="col-xs-12 col-sm-12 col-md-6">
-            <div id="map" class="wow zoomIn"></div>
-          </div>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-<script>
-import { WOW } from 'wowjs'
-import BMap from "BMap"
-
-export default {
-  name: "ContactUs",
-  data() {
-    return {};
-  },
-  mounted() {
-    var map = new BMap.Map("map"); // 创建地图实例
-    var point = new BMap.Point(121.440678,31.176694); // 创建点坐标
-    map.centerAndZoom(point, 18); // 初始化地图,设置中心点坐标和地图级别
-    map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
-    var marker = new BMap.Marker(point); // 创建标注
-    map.addOverlay(marker); // 将标注添加到地图中
-    var opts = {
-      width: 50, // 信息窗口宽度
-      height: 10, // 信息窗口高度
-      title: "银海大楼-C座" // 信息窗口标题
-    };
-    var infoWindow = new BMap.InfoWindow(
-      "上海展域航空技术有限公司",
-      opts
-    ); // 创建信息窗口对象
-    map.openInfoWindow(infoWindow, map.getCenter()); // 打开信息窗口
-    var wow = new WOW();
-    wow.init();
-  }
-};
-</script>
-<style scoped>
-.banner {
-  color: #fff;
-  font-size: 30px;
-  height: 150px;
-  line-height: 150px;
-  background-image: url("~assets/img/banner_5.jpg");
-  background-repeat: no-repeat;
-  background-size: cover;
-  background-attachment: scroll;
-  background-position: center center;
-}
-.ContactUs-container {
-  padding: 80px 0;
-  transition: all ease 0.5s;
-  box-sizing: border-box;
-}
-#map {
-  width: 100%;
-  height: 365px;
-}
-.row {
-  margin-right: 0;
-  margin-left: 0;
-}
-@media screen and (max-width: 997px) {
-  .ContactUs-container {
-    padding: 20px 0;
-  }
-}
-</style>
-
+<template>
+  <div id="ContactUs">
+    <div class="banner container-fuild text-center">联系我们</div>
+    <div class="container">
+      <div class="container-fuild ContactUs-container">
+        <div class="row">
+          <div class="col-xs-12 col-sm-12 col-md-6">
+            <form class="form-horizontal" role="form">
+              <div class="form-group">
+                <label for="name" class="col-sm-2 control-label">姓名</label>
+                <div class="col-sm-10 col-xs-12">
+                  <input type="text" class="form-control" id="name" placeholder="请输入名字">
+                </div>
+              </div>
+              <div class="form-group">
+                <label for="email" class="col-sm-2 control-label">邮箱</label>
+                <div class="col-sm-10">
+                  <input type="text" class="form-control" id="email" placeholder="请输入邮箱">
+                </div>
+              </div>
+              <div class="form-group">
+                <label for="tel" class="col-sm-2 control-label">电话</label>
+                <div class="col-sm-10">
+                  <input type="text" class="form-control" id="tel" placeholder="请输入电话">
+                </div>
+              </div>
+              <div class="form-group">
+                <label for="content" class="col-sm-2 control-label">内容</label>
+                <div class="col-sm-10">
+                  <textarea class="form-control" id="content" rows="8" placeholder="请输入内容"></textarea>
+                </div>
+              </div>
+              <div class="form-group">
+                <div class="col-sm-offset-2 col-sm-10">
+                  <button type="submit" class="btn btn-default btn-block">提交</button>
+                </div>
+              </div>
+            </form>
+          </div>
+          <div class="col-xs-12 col-sm-12 col-md-6">
+            <div id="map" class="wow zoomIn"></div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import { WOW } from 'wowjs'
+import BMap from "BMap"
+
+export default {
+  name: "ContactUs",
+  data() {
+    return {};
+  },
+  mounted() {
+    var map = new BMap.Map("map"); // 创建地图实例
+    var point = new BMap.Point(121.440678,31.176694); // 创建点坐标
+    map.centerAndZoom(point, 18); // 初始化地图,设置中心点坐标和地图级别
+    map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
+    var marker = new BMap.Marker(point); // 创建标注
+    map.addOverlay(marker); // 将标注添加到地图中
+    var opts = {
+      width: 50, // 信息窗口宽度
+      height: 10, // 信息窗口高度
+      title: "银海大楼-C座" // 信息窗口标题
+    };
+    var infoWindow = new BMap.InfoWindow(
+      "上海展域航空技术有限公司",
+      opts
+    ); // 创建信息窗口对象
+    map.openInfoWindow(infoWindow, map.getCenter()); // 打开信息窗口
+    var wow = new WOW();
+    wow.init();
+  }
+};
+</script>
+<style scoped>
+.banner {
+  color: #fff;
+  font-size: 30px;
+  height: 150px;
+  line-height: 150px;
+  background-image: url("~@/assets/img/banner_5.jpg");
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-attachment: scroll;
+  background-position: center center;
+}
+.ContactUs-container {
+  padding: 80px 0;
+  transition: all ease 0.5s;
+  box-sizing: border-box;
+}
+#map {
+  width: 100%;
+  height: 365px;
+}
+.row {
+  margin-right: 0;
+  margin-left: 0;
+}
+@media screen and (max-width: 997px) {
+  .ContactUs-container {
+    padding: 20px 0;
+  }
+}
+</style>
+

+ 534 - 489
src/view/HomePage.vue

@@ -1,489 +1,534 @@
-<template>
-  <div id="HomePage">
-    <!-- 轮播图 -->
-    <div id="swiper" class="container-fuild">
-      <div class="swiper-container banner-swiper">
-        <div class="swiper-wrapper">
-          <div class="swiper-slide" v-for="(item,index) in swiperList" :key="index">
-            <img class="swiper-lazy" :data-src="item.img">
-            <div class="swiper-lazy-preloader"></div>
-            <div class="swiper-slide-title">
-              <h1>{{ item.title }}</h1>
-              <p>{{ item.content }}</p>
-            </div>
-          </div>
-        </div>
-        <!-- 如果需要分页器 -->
-        <div class="swiper-pagination"></div>
-        <!-- 如果需要导航按钮 -->
-        <div class="swiper-button-prev"></div>
-        <div class="swiper-button-next"></div>
-      </div>
-    </div>
-
-    <!-- DJI Dock -->
-    <div id="djiDock" class="container-fuild">
-      <div class="container">
-        <div class="col-xs-12 col-sm-12 col-md-6 wow zoomIn">
-          <img class="img-responsive" src="@/assets/img/dji-dock2.png" alt="大疆行业应用无人机">
-        </div>
-        <div class="col-xs-12 col-sm-12 col-md-6">
-          <h2 class="djiDock-title">
-            关于我们
-            <small>大疆行业应用代理商</small>
-          </h2>
-          <p>
-            依托深圳市大疆创新科技有限公司一流的研发团队和齐配的供应链生产系统支持。上海展域航空技术有限公司已经在上海地区开拓了专业级大疆无人机行业应用服务市场。</p>
-          <p>
-            我们为专业客户提供定制化的行业解决方案服务,多家行业领先的无人机公司已经采用我们的解决方案与技术服务。
-          </p>
-          <p>
-            致力于推进航空领域及数字智能领域的最先进技术应用于人们的生产生活,帮助人们拓展更高更远的视野,开辟更新更广的空间,帮助人们成就飞天的梦想。
-          </p>
-        </div>
-      </div>
-    </div>
-    <!-- 您身边的无人机解决方案专家 -->
-    <div id="contactUs" class="container-fuild text-center">
-      <div class="container contactUs-container wow slideInUp">
-        <h1>上海展域航空技术有限公司</h1>
-        <button
-          class="btn btn-default btn-sm"
-          onmouseleave="this.style.borderColor='#fff'; this.style.backgroundColor='#fff'; this.style.color='#3f3f3f';"
-          onmouseenter="this.style.backgroundColor='transparent'; this.style.borderColor='#fff'; this.style.color='#fff';"
-        >您身边的无人机解决方案专家
-        </button>
-      </div>
-    </div>
-    <!-- 为什么选择我们 -->
-    <div id="whyChooseUs" class="conatiner-fuild">
-      <div class="container">
-        <div class="whyChooseUs-title text-center">
-          <p>为什么选择我们的服务</p>
-        </div>
-        <div class="row">
-          <div
-            class="col-xs-12 col-sm-6 col-md-4 server-wrapper"
-            v-for="(item,index) in serverList"
-            :key="index"
-          >
-            <div
-              class="server-block wow slideInUp"
-              onmouseenter="this.style.color='#28f';this.style.borderColor='#28f'"
-              onmouseleave="this.style.color='#666';this.style.borderColor='#ccc'"
-            >
-              <img class="center-block" :src="item.logo" alt="logo">
-              <p class="text-center">{{ item.title }}</p>
-              <div
-                class="text-center"
-                v-html="item.content"
-                onmouseenter="this.style.color='#28f'"
-                onmouseleave="this.style.color='#ccc'"
-              ></div>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-<script>
-import Swiper from "swiper";
-import {WOW} from 'wowjs';
-
-export default {
-  name: "HomePage",
-  data() {
-    return {
-      swiperList: [
-        {
-          img: require("@/assets/img/banner-home.jpg"),
-          path: "",
-          title: '上海展域航空技术有限公司',
-          content: '您身边的无人机解决方案专家',
-        },
-        {
-          img: require("@/assets/img/banner-dock-black.jpg"),
-          path: "",
-          title: '大疆机场2',
-          content: '轻担重任',
-        },
-        {
-          img: require("@/assets/img/banner-m350rtk.jpg"),
-          // video: require("@/assets/video/m350rtk.webm"),
-          path: "",
-          title: '大疆经纬 M350 RTK',
-          content: '满载实力,一往无前',
-        }
-      ],
-
-      serverList: [
-        {
-          logo: require("@/assets/img/tel.png"),
-          title: "售前服务",
-          content: "<p>由专业客服提供工作日全天人工服务负责疑难问题和故障受理</p>"
-        },
-        {
-          logo: require("@/assets/img/computer.png"),
-          title: "售后响应",
-          content: "<p>利用远程工具,故障产生后2小时内线上响应协助客户进行调试、解决故障</p>"
-        },
-        {
-          logo: require("@/assets/img/skill.png"),
-          title: "研发优势",
-          content: "<p>专业的技术工程师,负责提供解决方案和受理及定制化开发服务</p>"
-        }
-      ]
-    };
-  },
-  mounted() {
-    /* banner-swiper */
-    new Swiper(".banner-swiper", {
-      loop: true, // 循环模式选项
-      effect: 'fade',
-      //自动播放
-      autoplay: {
-        delay: 3000,
-        stopOnLastSlide: false,
-        disableOnInteraction: false
-      },
-      // 如果需要分页器
-      pagination: {
-        el: ".swiper-pagination",
-        clickable: true
-      },
-      // 如果需要前进后退按钮
-      navigation: {
-        nextEl: ".swiper-button-next",
-        prevEl: ".swiper-button-prev"
-      },
-      // 延迟加载
-      lazy: {
-        loadPrevNext: true
-      },
-      observer: true, //修改swiper自己或子元素时,自动初始化swiper
-      observeParents: true //修改swiper的父元素时,自动初始化swiper
-    });
-
-    /* wowjs动画 */
-    var wow = new WOW({
-      boxClass: 'wow',
-      animateClass: 'animated',
-      offset: 0,
-      mobile: true,
-      live: true
-    })
-    wow.init();
-  }
-};
-</script>
-<style scoped>
-/* 整体盒子 */
-#HomePage {
-  width: 100%;
-}
-
-/* 轮播图 */
-#swiper {
-
-}
-
-#swiper .banner-swiper {
-  width: 100%;
-  height: auto;
-}
-
-#swiper .banner-swiper .swiper-slide img {
-  max-width: 100%;
-  background-size: cover;
-}
-
-#swiper .banner-swiper .swiper-slide {
-  position: relative;
-}
-
-#swiper .banner-swiper .swiper-slide-title {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 999999999;
-  width: 100%;
-  height: 100%;
-  color: #fff;
-  background: rgba(51, 51, 51, 0.534);
-  text-align: center;
-  line-height: 80px;
-}
-
-#swiper .banner-swiper .swiper-slide-title > h1 {
-  font-size: 36px;
-  margin-top: 12%;
-}
-
-#swiper .banner-swiper .swiper-slide-title > p {
-  font-size: 18px;
-  margin-top: 1%;
-  font-weight: 700;
-}
-
-/* Dji */
-#djiDock {
-  margin: 20px 0 30px;
-  transition: all ease 0.6s;
-  box-sizing: border-box;
-}
-
-#djiDock .djiDock-title {
-  padding-bottom: 10px;
-  border-bottom: 1px solid #ccc;
-}
-
-#djiDock p {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-weight: 360;
-  font-size: 14px;
-  //color: #333; color: #2f2f2f; line-height: 2.2rem;
-}
-
-/* 联系我们 */
-#contactUs {
-  color: #fff;
-  height: 280px;
-  background: url("../assets/img/contact_us_bg.jpg") 0 0 no-repeat;
-  background-size: 100% 100%;
-  transition: all ease 0.6s;
-}
-
-#contactUs .contactUs-container {
-  padding-top: 50px;
-}
-
-#contactUs .contactUs-container button {
-  width: 300px;
-  height: 50px;
-  margin-top: 40px;
-}
-
-/* 为什么选择我们 */
-#whyChooseUs {
-  padding: 40px;
-}
-
-#whyChooseUs .whyChooseUs-title {
-  margin-bottom: 40px;
-}
-
-#whyChooseUs .whyChooseUs-title p:nth-of-type(1) {
-  font-size: 24px;
-  font-weight: 500;
-}
-
-#whyChooseUs .whyChooseUs-title p:nth-of-type(2) {
-  font-size: 14px;
-}
-
-#whyChooseUs .server-block {
-  padding: 50px 20px;
-  border: 1px solid #ccc;
-  border-bottom: 5px solid #ccc;
-}
-
-#whyChooseUs .server-block img {
-  width: 48px;
-  height: 48px;
-}
-
-#whyChooseUs .server-block > p {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-weight: 360;
-  font-size: 14px;
-  color: #2f2f2f;
-  line-height: 2.2rem;
-  margin: 30px 0;
-}
-
-#whyChooseUs .server-block > div {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-weight: 360;
-  font-size: 14px;
-  line-height: 2.2rem;
-  color: #ccc;
-}
-
-/* 媒体查询(手机) */
-@media screen and (max-width: 768px) {
-  #swiper {
-    height: auto;
-  }
-
-  #swiper .banner-swiper .swiper-slide-title > h1 {
-    font-size: 18px;
-    margin-top: 6%;
-  }
-
-  #swiper .banner-swiper .swiper-slide-title > p {
-    font-size: 13px;
-    //margin-top: 1%; font-weight: 700;
-  }
-
-  #djiDock {
-    padding: 20px;
-  }
-
-  #djiDock .djiDock-title {
-    font-size: 20px;
-  }
-
-  #djiDock p {
-    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-    font-weight: 360;
-    font-size: 13px;
-    color: #2f2f2f;
-    line-height: 2.2rem;
-  }
-
-
-  #contactUs {
-    height: 160px;
-    transition: all ease 0.6s;
-  }
-
-  #contactUs .contactUs-container {
-    padding-top: 0;
-  }
-
-  #contactUs .contactUs-container h1 {
-    font-size: 24px;
-  }
-
-  #contactUs .contactUs-container h3 {
-    font-size: 18px;
-  }
-
-  #contactUs .contactUs-container button {
-    width: 200px;
-    height: 30px;
-    margin-top: 30px;
-  }
-
-  #contactUs .contactUs-container .contactUs-contactWay span {
-    display: inline-block;
-    width: 28px;
-    height: 28px;
-    margin: 10px;
-  }
-
-  #whyChooseUs {
-    padding: 20px 0;
-    transition: all ease 0.6s;
-  }
-
-  #whyChooseUs .whyChooseUs-title p:nth-of-type(1) {
-    font-size: 20px;
-    font-weight: 700;
-  }
-
-  #whyChooseUs .whyChooseUs-title p:nth-of-type(2) {
-    font-size: 12px;
-  }
-
-  #whyChooseUs .server-block {
-    padding: 50px 0;
-    border: 1px solid #ccc;
-    border-bottom: 5px solid #ccc;
-  }
-
-  #whyChooseUs .server-block img {
-    width: 48px;
-    height: 48px;
-  }
-
-  #whyChooseUs .server-block > p {
-    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-    font-weight: 360;
-    font-size: 14px;
-    color: #2f2f2f;
-    line-height: 2.2rem;
-    margin: 30px 0;
-  }
-
-  #whyChooseUs .server-block > div {
-    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-    font-weight: 360;
-    font-size: 14px;
-    line-height: 2.2rem;
-    color: #ccc;
-  }
-}
-
-/* 媒体查询(平板) */
-@media screen and (min-width: 768px) and (max-width: 996px) {
-  #swiper {
-    height: auto;
-  }
-
-  #swiper .banner-swiper .swiper-slide-title > h1 {
-    font-size: 24px;
-    margin-top: 10%;
-  }
-
-  #swiper .banner-swiper .swiper-slide-title > p {
-    font-size: 13px;
-    //margin-top: 0; font-weight: 700;
-  }
-
-  #djiDock {
-    padding: 20px;
-  }
-
-  #djiDock .djiDock-title {
-    font-size: 30px;
-  }
-
-  #djiDock p {
-    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-    font-weight: 360;
-    font-size: 14px;
-    color: #2f2f2f;
-    line-height: 2.2rem;
-  }
-
-  #djiDock .djiDock-device {
-    font-size: 30px;
-    margin: 30px 0 15px;
-  }
-
-  #contactUs {
-    height: 300px;
-  }
-
-  #contactUs .contactUs-container {
-    padding-top: 50px;
-  }
-
-  #contactUs .contactUs-container h1 {
-    font-size: 30px;
-  }
-
-  #contactUs .contactUs-container h3 {
-    font-size: 20px;
-  }
-
-  #contactUs .contactUs-container button {
-    width: 300px;
-    height: 50px;
-    margin-top: 30px;
-  }
-
-  #contactUs .contactUs-container .contactUs-contactWay span {
-    display: inline-block;
-    width: 32px;
-    height: 32px;
-    margin: 15px;
-  }
-
-  #whyChooseUs {
-    padding: 20px 0;
-  }
-}
-</style>
+<template>
+  <div id="HomePage">
+    <!-- 轮播图 -->
+    <div id="swiper" class="container-fuild">
+      <div class="swiper-container banner-swiper">
+        <div class="swiper-wrapper">
+          <div class="swiper-slide" v-for="(item,index) in swiperList" :key="index">
+            <img class="swiper-lazy" :data-src="item.img">
+            <div class="swiper-lazy-preloader"></div>
+            <div class="swiper-slide-title">
+              <h1>{{ item.title }}</h1>
+              <p>{{ item.content }}</p>
+            </div>
+          </div>
+        </div>
+        <!-- 如果需要分页器 -->
+        <div class="swiper-pagination"></div>
+        <!-- 如果需要导航按钮 -->
+        <div class="swiper-button-prev"></div>
+        <div class="swiper-button-next"></div>
+      </div>
+    </div>
+
+    <!-- DJI Dock -->
+    <div id="djiDock" class="l-container-fluid l-section">
+      <div class="container">
+        <div class="col-xs-12 col-sm-12 col-md-6 wow zoomIn">
+          <img class="img-responsive" src="@/assets/img/dji-dock2.png" alt="大疆行业应用无人机">
+        </div>
+        <div class="col-xs-12 col-sm-12 col-md-6">
+          <h2 class="djiDock-title">
+            关于我们
+            <small>大疆行业应用代理商</small>
+          </h2>
+          <p>
+            依托深圳市大疆创新科技有限公司一流的研发团队和齐配的供应链生产系统支持。上海展域航空技术有限公司已经在上海地区开拓了专业级大疆无人机行业应用服务市场。</p>
+          <p>
+            我们为专业客户提供定制化的行业解决方案服务,多家行业领先的无人机公司已经采用我们的解决方案与技术服务。
+          </p>
+          <p>
+            致力于推进航空领域及数字智能领域的最先进技术应用于人们的生产生活,帮助人们拓展更高更远的视野,开辟更新更广的空间,帮助人们成就飞天的梦想。
+          </p>
+        </div>
+      </div>
+    </div>
+    <!-- 您身边的无人机解决方案专家 -->
+    <div id="contactUs" class="container-fuild text-center">
+      <div class="container contactUs-container wow slideInUp">
+        <h1>上海展域航空技术有限公司</h1>
+        <button
+          class="btn btn-default btn-sm"
+          onmouseleave="this.style.borderColor='#fff'; this.style.backgroundColor='#fff'; this.style.color='#3f3f3f';"
+          onmouseenter="this.style.backgroundColor='transparent'; this.style.borderColor='#fff'; this.style.color='#fff';"
+        >您身边的无人机解决方案专家
+        </button>
+      </div>
+    </div>
+    <!-- 为什么选择我们 -->
+    <div id="whyChooseUs" class="l-container">
+        <div class="whyChooseUs-title text-center">
+          <p>为什么选择我们的服务</p>
+        </div>
+        <div class="row">
+          <div
+            class="col-xs-12 col-sm-6 col-md-4 server-wrapper"
+            v-for="(item,index) in serverList"
+            :key="index"
+          >
+            <div
+              class="server-block wow slideInUp"
+              onmouseenter="this.style.color='#28f';this.style.borderColor='#28f'"
+              onmouseleave="this.style.color='#666';this.style.borderColor='#ccc'"
+            >
+              <img class="center-block" :src="item.logo" alt="logo">
+              <p class="text-center">{{ item.title }}</p>
+              <div
+                class="text-center"
+                v-html="item.content"
+                onmouseenter="this.style.color='#28f'"
+                onmouseleave="this.style.color='#ccc'"
+              ></div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import Swiper from "swiper";
+import {WOW} from 'wowjs';
+
+export default {
+  name: "HomePage",
+  data() {
+    return {
+      swiperList: [
+        {
+          img: require("@/assets/img/banner-home.jpg"),
+          path: "",
+          title: '上海展域航空技术有限公司',
+          content: '您身边的无人机解决方案专家',
+        },
+        {
+          img: require("@/assets/img/banner-dock-black.jpg"),
+          path: "",
+          title: '大疆机场2',
+          content: '轻担重任',
+        },
+        {
+          img: require("@/assets/img/banner-m350rtk.jpg"),
+          // video: require("@/assets/video/m350rtk.webm"),
+          path: "",
+          title: '大疆经纬 M350 RTK',
+          content: '满载实力,一往无前',
+        }
+      ],
+
+      serverList: [
+        {
+          logo: require("@/assets/img/tel.png"),
+          title: "售前服务",
+          content: "<p>由专业客服提供工作日全天人工服务负责疑难问题和故障受理</p>"
+        },
+        {
+          logo: require("@/assets/img/computer.png"),
+          title: "售后响应",
+          content: "<p>利用远程工具,故障产生后2小时内线上响应协助客户进行调试、解决故障</p>"
+        },
+        {
+          logo: require("@/assets/img/skill.png"),
+          title: "研发优势",
+          content: "<p>专业的技术工程师,负责提供解决方案和受理及定制化开发服务</p>"
+        }
+      ]
+    };
+  },
+  mounted() {
+    /* banner-swiper */
+    new Swiper(".banner-swiper", {
+      loop: true, // 循环模式选项
+      effect: 'fade',
+      //自动播放
+      autoplay: {
+        delay: 3000,
+        stopOnLastSlide: false,
+        disableOnInteraction: false
+      },
+      // 如果需要分页器
+      pagination: {
+        el: ".swiper-pagination",
+        clickable: true
+      },
+      // 如果需要前进后退按钮
+      navigation: {
+        nextEl: ".swiper-button-next",
+        prevEl: ".swiper-button-prev"
+      },
+      // 延迟加载
+      lazy: {
+        loadPrevNext: true
+      },
+      observer: true, //修改swiper自己或子元素时,自动初始化swiper
+      observeParents: true //修改swiper的父元素时,自动初始化swiper
+    });
+
+    /* wowjs动画 */
+    var wow = new WOW({
+      boxClass: 'wow',
+      animateClass: 'animated',
+      offset: 0,
+      mobile: true,
+      live: true
+    })
+    wow.init();
+  }
+};
+</script>
+<style scoped>
+/* 整体盒子 */
+#HomePage {
+  width: 100%;
+}
+
+/* 轮播图 */
+#swiper {
+
+}
+
+#swiper .banner-swiper {
+  width: 100%;
+  height: auto;
+}
+
+#swiper .banner-swiper .swiper-slide img {
+  max-width: 100%;
+  background-size: cover;
+}
+
+#swiper .banner-swiper .swiper-slide {
+  position: relative;
+}
+
+#swiper .banner-swiper .swiper-slide-title {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 999999999;
+  width: 100%;
+  height: 100%;
+  color: #fff;
+  background: rgba(51, 51, 51, 0.534);
+  text-align: center;
+  line-height: 80px;
+}
+
+#swiper .banner-swiper .swiper-slide-title > h1 {
+  font-size: 36px;
+  margin-top: 12%;
+}
+
+#swiper .banner-swiper .swiper-slide-title > p {
+  font-size: 18px;
+  margin-top: 1%;
+  font-weight: 700;
+}
+
+/* Dji */
+#djiDock {
+  padding: 80px 0;
+  transition: all ease 0.6s;
+  box-sizing: border-box;
+}
+
+#djiDock .djiDock-title {
+  padding-bottom: 15px;
+  border-bottom: 1px solid #e0e0e0;
+  margin-bottom: 20px;
+}
+
+#djiDock .djiDock-title small {
+  display: block;
+  font-size: 14px;
+  color: #666;
+  margin-top: 8px;
+  font-weight: 400;
+}
+
+#djiDock p {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-weight: 360;
+  font-size: 15px;
+  color: #555;
+  line-height: 2rem;
+  margin-bottom: 15px;
+}
+
+/* 联系我们 */
+#contactUs {
+  color: #fff;
+  height: 320px;
+  background: url("../assets/img/contact_us_bg.jpg") center center no-repeat;
+  background-size: cover;
+  transition: all ease 0.6s;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+#contactUs .contactUs-container {
+  text-align: center;
+}
+
+#contactUs .contactUs-container h1 {
+  font-size: 32px;
+  font-weight: 600;
+  letter-spacing: 2px;
+  margin-bottom: 30px;
+  text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
+}
+
+#contactUs .contactUs-container button {
+  width: 320px;
+  height: 50px;
+  font-size: 15px;
+  font-weight: 600;
+  letter-spacing: 1px;
+  border: 2px solid #fff;
+  background: rgba(255, 255, 255, 0.1);
+  backdrop-filter: blur(10px);
+  transition: all 0.3s ease;
+}
+
+#contactUs .contactUs-container button:hover {
+  background: rgba(255, 255, 255, 0.2);
+  transform: translateY(-2px);
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
+}
+
+/* 为什么选择我们 */
+#whyChooseUs {
+  padding: 0;
+}
+
+#whyChooseUs .whyChooseUs-title {
+  margin-bottom: 50px;
+  text-align: center;
+}
+
+#whyChooseUs .whyChooseUs-title p:nth-of-type(1) {
+  font-size: 28px;
+  font-weight: 500;
+  color: #333;
+}
+
+#whyChooseUs .whyChooseUs-title p:nth-of-type(2) {
+  font-size: 15px;
+  color: #666;
+  margin-top: 10px;
+}
+
+#whyChooseUs .server-block {
+  padding: 40px 25px;
+  border: 1px solid #e0e0e0;
+  border-bottom: 3px solid #e0e0e0;
+  transition: all 0.3s ease;
+}
+
+#whyChooseUs .server-block:hover {
+  border-color: #1e73be;
+  border-bottom-width: 3px;
+  transform: translateY(-5px);
+  box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
+}
+
+#whyChooseUs .server-block img {
+  width: 48px;
+  height: 48px;
+}
+
+#whyChooseUs .server-block > p {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-weight: 360;
+  font-size: 14px;
+  color: #2f2f2f;
+  line-height: 2.2rem;
+  margin: 30px 0;
+}
+
+#whyChooseUs .server-block > div {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-weight: 360;
+  font-size: 14px;
+  line-height: 2.2rem;
+  color: #ccc;
+}
+
+/* 媒体查询(手机) */
+@media screen and (max-width: 768px) {
+  #swiper {
+    height: auto;
+  }
+
+  #swiper .banner-swiper .swiper-slide-title > h1 {
+    font-size: 18px;
+    margin-top: 6%;
+  }
+
+  #swiper .banner-swiper .swiper-slide-title > p {
+    font-size: 13px;
+    //margin-top: 1%; font-weight: 700;
+  }
+
+  #djiDock {
+    padding: 20px;
+  }
+
+  #djiDock .djiDock-title {
+    font-size: 20px;
+  }
+
+  #djiDock p {
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-weight: 360;
+    font-size: 13px;
+    color: #2f2f2f;
+    line-height: 2.2rem;
+  }
+
+
+  #contactUs {
+    height: 160px;
+    transition: all ease 0.6s;
+  }
+
+  #contactUs .contactUs-container {
+    padding-top: 0;
+  }
+
+  #contactUs .contactUs-container h1 {
+    font-size: 24px;
+  }
+
+  #contactUs .contactUs-container h3 {
+    font-size: 18px;
+  }
+
+  #contactUs .contactUs-container button {
+    width: 200px;
+    height: 30px;
+    margin-top: 30px;
+  }
+
+  #contactUs .contactUs-container .contactUs-contactWay span {
+    display: inline-block;
+    width: 28px;
+    height: 28px;
+    margin: 10px;
+  }
+
+  #whyChooseUs {
+    padding: 20px 0;
+    transition: all ease 0.6s;
+  }
+
+  #whyChooseUs .whyChooseUs-title p:nth-of-type(1) {
+    font-size: 20px;
+    font-weight: 700;
+  }
+
+  #whyChooseUs .whyChooseUs-title p:nth-of-type(2) {
+    font-size: 12px;
+  }
+
+  #whyChooseUs .server-block {
+    padding: 50px 0;
+    border: 1px solid #ccc;
+    border-bottom: 5px solid #ccc;
+  }
+
+  #whyChooseUs .server-block img {
+    width: 48px;
+    height: 48px;
+  }
+
+  #whyChooseUs .server-block > p {
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-weight: 360;
+    font-size: 14px;
+    color: #2f2f2f;
+    line-height: 2.2rem;
+    margin: 30px 0;
+  }
+
+  #whyChooseUs .server-block > div {
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-weight: 360;
+    font-size: 14px;
+    line-height: 2.2rem;
+    color: #ccc;
+  }
+}
+
+/* 媒体查询(平板) */
+@media screen and (min-width: 768px) and (max-width: 996px) {
+  #swiper {
+    height: auto;
+  }
+
+  #swiper .banner-swiper .swiper-slide-title > h1 {
+    font-size: 24px;
+    margin-top: 10%;
+  }
+
+  #swiper .banner-swiper .swiper-slide-title > p {
+    font-size: 13px;
+    //margin-top: 0; font-weight: 700;
+  }
+
+  #djiDock {
+    padding: 20px;
+  }
+
+  #djiDock .djiDock-title {
+    font-size: 30px;
+  }
+
+  #djiDock p {
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-weight: 360;
+    font-size: 14px;
+    color: #2f2f2f;
+    line-height: 2.2rem;
+  }
+
+  #djiDock .djiDock-device {
+    font-size: 30px;
+    margin: 30px 0 15px;
+  }
+
+  #contactUs {
+    height: 300px;
+  }
+
+  #contactUs .contactUs-container {
+    padding-top: 50px;
+  }
+
+  #contactUs .contactUs-container h1 {
+    font-size: 30px;
+  }
+
+  #contactUs .contactUs-container h3 {
+    font-size: 20px;
+  }
+
+  #contactUs .contactUs-container button {
+    width: 300px;
+    height: 50px;
+    margin-top: 30px;
+  }
+
+  #contactUs .contactUs-container .contactUs-contactWay span {
+    display: inline-block;
+    width: 32px;
+    height: 32px;
+    margin: 15px;
+  }
+
+  #whyChooseUs {
+    padding: 20px 0;
+  }
+}
+</style>

+ 81 - 81
src/view/Info/Index.vue

@@ -1,81 +1,81 @@
-<template>
-  <div id="Info">
-    <div class="banner container-fuild text-center">公司介绍</div>
-    <div class="container">
-      <div class="row info-container">
-        <div class="container text-center">
-          <p>
-            上海展域航空技术有限公司成立于2014年。公司秉承“航空报国、拥抱未来”的核心理念,致力于推进航空领域及数字智能领域的最先进技术应用于人们的生产生活,帮助人们拓展更高更远的视野,开辟更新更广的空间,帮助人们成就飞天的梦想。</p>
-        </div>
-        <div class="col-xs-12 col-sm-12 col-md-6 wow zoomIn">
-          <img class="img-responsive center-block" src="@/assets/img/general_aviation_img.png"
-               style="margin: 0 0 48px 0">
-          <p>
-            公司拥有通用航空经营及无人机系统运营的专业资质,具备经专业认证的技术人员和销售团队,为客户提供专业无人系统产品的代理销售和技术支持、面向行业应用场景的无人系统应用解决方案和实施服务、以及为客户应用无人系统所需的认证培训和作业指导。</p>
-        </div>
-        <div class="col-xs-12 col-sm-12 col-md-6 wow zoomIn" style="margin-bottom: 24px">
-          <img class="img-responsive center-block" src="@/assets/img/dji-card.png">
-          <p>
-            依托深圳市大疆创新科技有限公司一流的研发团队和齐配的供应链生产系统支持。上海展域航空技术有限公司已经在上海地区开拓了专业级大疆无人机行业应用服务市场。</p>
-        </div>
-        <div class="container text-left">
-          <p>
-            多年来,展域航空基于丰富的行业经验和技术能力,努力在青少年航空科普和创客实践、3D打印和桌面数字制造、无人机技术实验和应用等领域默默耕耘,依托中航工业、中国商飞、大疆创新等企业开展技术验证和应用推广,并先后与北航、上海交大、复旦大学等高校以及民航华东管理局、上海航空学会、上海无人机产业协会等机构开展合作,在服务于青年人才创新实践的基础上,帮助大型工业园区、城市基础设施以及化工、建筑、测绘等行业领域应用智能无人系统推进数字化智能化转型升级做出贡献。</p>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-<script>
-import {WOW} from 'wowjs';
-
-export default {
-  name: 'Info',
-  data() {
-    return {}
-  },
-  mounted() {
-    var wow = new WOW();
-    wow.init();
-  }
-}
-</script>
-<style scoped>
-.banner {
-  color: #fff;
-  font-size: 30px;
-  height: 150px;
-  line-height: 150px;
-  background-image: url('~assets/img/banner1.jpg');
-  background-repeat: no-repeat;
-  background-size: cover;
-  background-attachment: scroll;
-  background-position: center center;
-}
-
-.row {
-  margin-right: 0;
-  margin-left: 0;
-}
-
-.info-container {
-  padding: 40px 0;
-}
-
-.info-container > div > p {
-  margin: 20px 12px;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-weight: 360;
-  font-size: 13px;
-  color: #2f2f2f;
-  line-height: 2.2rem;
-}
-
-@media screen and (max-width: 997px) {
-  .info-container {
-    padding: 10px 0;
-    //color: #808080;
-  }
-}
-</style>
-
+<template>
+  <div id="Info">
+    <div class="banner container-fuild text-center">公司介绍</div>
+    <div class="container">
+      <div class="row info-container">
+        <div class="container text-center">
+          <p>
+            上海展域航空技术有限公司成立于2014年。公司秉承“航空报国、拥抱未来”的核心理念,致力于推进航空领域及数字智能领域的最先进技术应用于人们的生产生活,帮助人们拓展更高更远的视野,开辟更新更广的空间,帮助人们成就飞天的梦想。</p>
+        </div>
+        <div class="col-xs-12 col-sm-12 col-md-6 wow zoomIn">
+          <img class="img-responsive center-block" src="@/assets/img/general_aviation_img.png"
+               style="margin: 0 0 48px 0">
+          <p>
+            公司拥有通用航空经营及无人机系统运营的专业资质,具备经专业认证的技术人员和销售团队,为客户提供专业无人系统产品的代理销售和技术支持、面向行业应用场景的无人系统应用解决方案和实施服务、以及为客户应用无人系统所需的认证培训和作业指导。</p>
+        </div>
+        <div class="col-xs-12 col-sm-12 col-md-6 wow zoomIn" style="margin-bottom: 24px">
+          <img class="img-responsive center-block" src="@/assets/img/dji-card.png">
+          <p>
+            依托深圳市大疆创新科技有限公司一流的研发团队和齐配的供应链生产系统支持。上海展域航空技术有限公司已经在上海地区开拓了专业级大疆无人机行业应用服务市场。</p>
+        </div>
+        <div class="container text-left">
+          <p>
+            多年来,展域航空基于丰富的行业经验和技术能力,努力在青少年航空科普和创客实践、3D打印和桌面数字制造、无人机技术实验和应用等领域默默耕耘,依托中航工业、中国商飞、大疆创新等企业开展技术验证和应用推广,并先后与北航、上海交大、复旦大学等高校以及民航华东管理局、上海航空学会、上海无人机产业协会等机构开展合作,在服务于青年人才创新实践的基础上,帮助大型工业园区、城市基础设施以及化工、建筑、测绘等行业领域应用智能无人系统推进数字化智能化转型升级做出贡献。</p>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import {WOW} from 'wowjs';
+
+export default {
+  name: 'Info',
+  data() {
+    return {}
+  },
+  mounted() {
+    var wow = new WOW();
+    wow.init();
+  }
+}
+</script>
+<style scoped>
+.banner {
+  color: #fff;
+  font-size: 30px;
+  height: 150px;
+  line-height: 150px;
+  background-image: url('~@/assets/img/banner1.jpg');
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-attachment: scroll;
+  background-position: center center;
+}
+
+.row {
+  margin-right: 0;
+  margin-left: 0;
+}
+
+.info-container {
+  padding: 40px 0;
+}
+
+.info-container > div > p {
+  margin: 20px 12px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-weight: 360;
+  font-size: 13px;
+  color: #2f2f2f;
+  line-height: 2.2rem;
+}
+
+@media screen and (max-width: 997px) {
+  .info-container {
+    padding: 10px 0;
+    //color: #808080;
+  }
+}
+</style>
+

+ 82 - 82
src/view/JoinUs/Index.vue

@@ -1,82 +1,82 @@
-<template>
-  <div id="JoinUs">
-    <div class="banner container-fuild text-center">加入我们</div>
-    <div class="container">
-      <div class="JoinUs-container wow pulse">
-        <h2>JAVA全栈工程师</h2>
-        <p>岗位职责</p>
-        <ol>
-          <li> 负责无人机领域的无人机web管理系统的二次开发,部署上线。</li>
-          <li> 负责无人机管理系统的接口协议定义与接口开发。</li>
-          <li> 参与系统需求分析与设计, 与项目经理一起参与客户需求调研,抽象业务功能,完成业务逻辑的开发。接口规范制定,架构设计。</li>
-        </ol>
-        <p>任职要求</p>
-        <ol>
-          <li>精通SpringBoot+MySql+Vue开发, 熟悉前后端分离的WEB开发思路,熟悉Vue3或React ;</li>
-          <li>具备非常强的自学能力,遇到问题善于使用github、google、生成式AI、copilot等工具查询解决思路。</li>
-          <li>熟练掌握 Java 语言,熟练掌握Spring boot 框架。 如果能熟练掌握C++ 与 opencv  更好(非必需)。</li>
-          <li>具备良好的代码编写习惯和调试能力,能够编写可维护的高质量代码。</li>
-        </ol>
-        <button class="center-block btn btn-warning btn-lg">投递简历</button>
-      </div>
-    </div>
-  </div>
-</template>
-<script>
-import { WOW } from 'wowjs';
-export default {
-  name: "JoinUs",
-  data() {
-    return {};
-  },
-  mounted(){
-    var wow = new WOW();
-    wow.init();
-  }
-};
-</script>
-<style scoped>
-.banner {
-  color: #fff;
-  font-size: 30px;
-  height: 150px;
-  line-height: 150px;
-  background-image: url("~assets/img/banner_4.jpg");
-  background-repeat: no-repeat;
-  background-size: cover;
-  background-attachment: scroll;
-  background-position: center center;
-}
-.JoinUs-container {
-  margin: 100px;
-  padding: 30px;
-  transition: all ease 0.5s;
-  border: 1px dashed salmon;
-}
-.JoinUs-container h2{
-  color: rgb(255, 102, 19);
-  font-weight: bolder;
-  text-align: center;
-}
-.JoinUs-container p{
-font-size: 20px;
-  color: rgb(255, 102, 19);
-  font-weight: 700;
-}
-.JoinUs-container ol{
-    list-style-type: decimal;
-    padding-left: 30px;
-}
-.JoinUs-container ol>li{
-    font-size: 14px;
-    line-height: 2.7rem;
-}
-@media screen and (max-width: 997px) {
-  .JoinUs-container {
-    margin: 20px 0;
-    padding: 20px;
-    border: 1px dashed salmon;
-  }
-}
-</style>
-
+<template>
+  <div id="JoinUs">
+    <div class="banner container-fuild text-center">加入我们</div>
+    <div class="container">
+      <div class="JoinUs-container wow pulse">
+        <h2>JAVA全栈工程师</h2>
+        <p>岗位职责</p>
+        <ol>
+          <li> 负责无人机领域的无人机web管理系统的二次开发,部署上线。</li>
+          <li> 负责无人机管理系统的接口协议定义与接口开发。</li>
+          <li> 参与系统需求分析与设计, 与项目经理一起参与客户需求调研,抽象业务功能,完成业务逻辑的开发。接口规范制定,架构设计。</li>
+        </ol>
+        <p>任职要求</p>
+        <ol>
+          <li>精通SpringBoot+MySql+Vue开发, 熟悉前后端分离的WEB开发思路,熟悉Vue3或React ;</li>
+          <li>具备非常强的自学能力,遇到问题善于使用github、google、生成式AI、copilot等工具查询解决思路。</li>
+          <li>熟练掌握 Java 语言,熟练掌握Spring boot 框架。 如果能熟练掌握C++ 与 opencv  更好(非必需)。</li>
+          <li>具备良好的代码编写习惯和调试能力,能够编写可维护的高质量代码。</li>
+        </ol>
+        <button class="center-block btn btn-warning btn-lg">投递简历</button>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import { WOW } from 'wowjs';
+export default {
+  name: "JoinUs",
+  data() {
+    return {};
+  },
+  mounted(){
+    var wow = new WOW();
+    wow.init();
+  }
+};
+</script>
+<style scoped>
+.banner {
+  color: #fff;
+  font-size: 30px;
+  height: 150px;
+  line-height: 150px;
+  background-image: url("~@/assets/img/banner_4.jpg");
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-attachment: scroll;
+  background-position: center center;
+}
+.JoinUs-container {
+  margin: 100px;
+  padding: 30px;
+  transition: all ease 0.5s;
+  border: 1px dashed salmon;
+}
+.JoinUs-container h2{
+  color: rgb(255, 102, 19);
+  font-weight: bolder;
+  text-align: center;
+}
+.JoinUs-container p{
+font-size: 20px;
+  color: rgb(255, 102, 19);
+  font-weight: 700;
+}
+.JoinUs-container ol{
+    list-style-type: decimal;
+    padding-left: 30px;
+}
+.JoinUs-container ol>li{
+    font-size: 14px;
+    line-height: 2.7rem;
+}
+@media screen and (max-width: 997px) {
+  .JoinUs-container {
+    margin: 20px 0;
+    padding: 20px;
+    border: 1px dashed salmon;
+  }
+}
+</style>
+

+ 238 - 238
src/view/News/Index.vue

@@ -1,238 +1,238 @@
-<template>
-  <div id="News">
-    <div class="banner container-fuild text-center">公司动态</div>
-    <div class="container">
-      <div class="row news-container">
-        <ul class="news-container container-fuild">
-          <li v-for="(item,index) in newsList" :key="index" class="wow fadeIn">
-            <div class="content">
-              <p>{{ item.title }}</p>
-              <p>{{ item.introduce }}</p>
-            </div>
-            <div class="time">
-              <p>{{ item.date }}</p>
-              <span>{{ item.year }}</span>
-            </div>
-            <div class="circle">
-              <img src="@/assets/img/circle.png">
-              <i class="line center-block"></i>
-            </div>
-          </li>
-        </ul>
-        <div class="contaianer-fuild text-center more">
-          <i class="glyphicon glyphicon-th"></i>
-        </div>
-
-      </div>
-
-
-    </div>
-  </div>
-</template>
-<script>
-import {WOW} from 'wowjs';
-
-export default {
-  name: 'News',
-  data() {
-    return {
-      newsList: [
-        {
-          id: '001',
-          introduce: '配合和参与上海测绘院及上海建科集团数字化转型发展,推荐大疆产品在测绘及工程建设城市运维领域的应用',
-          date: '07-18',
-          year: '2023年'
-        }, {
-          id: '002',
-          introduce: '完成上海化工区智能无人系统应用监管研究课题,帮助园区管委会和相关企业规范开展无人系统应用服务业务',
-          date: '09-27',
-          year: '2022年'
-        }, {
-          id: '003',
-          introduce: '参与上海宝武吴淞园、上海化工区等大型工业园区无人机应用项目的实验和监管论证,推广大疆行业应用产品和服务',
-          date: '03-16',
-          year: '2020年'
-        }, {
-          id: '004',
-          introduce: '完成对口支援日喀则和果乐地区创客空间示范项目建设,设立创客师资上海培训基地,推广3D打印和无人机课程',
-          date: '06-08',
-          year: '2018年'
-        }, {
-          id: '005',
-          introduce: '公司由北航和复旦校友发起创立,推出飞天网创客空间,成为上海众创空间联盟首批会员单位,服务航空科技爱好者',
-          date: '05-24',
-          year: '2014年'
-        }
-      ]
-    }
-  },
-  mounted() {
-    var wow = new WOW();
-    wow.init();
-  },
-}
-</script>
-<style scoped>
-#News {
-  height: 100%;
-}
-
-.banner {
-  color: #fff;
-  font-size: 30px;
-  height: 150px;
-  line-height: 150px;
-  background-image: url("~assets/img/dji.jpg");
-  background-repeat: no-repeat;
-  background-size: cover;
-  background-attachment: scroll;
-  background-position: center center;
-}
-
-.news-container {
-  margin: 20px 20px 0 20px;
-}
-
-.nav > a {
-  display: inline-block;
-  text-decoration: none;
-  width: 120px;
-  height: 45px;
-  line-height: 45px;
-  color: #333;
-  border: 1px solid #333;
-}
-
-.nav > a:hover {
-  color: #1e73be;
-  border-color: #1e73be;
-}
-
-.news-container {
-  overflow: hidden;
-  margin-bottom: 0;
-}
-
-.news-container > li {
-  width: 55.62%;
-  height: 120px;
-  float: left;
-  color: #333;
-  text-align: right;
-  border-left: 1px solid transparent;
-  border-right: 1px solid transparent;
-}
-
-.news-container > li:hover {
-  color: #1e73be;
-  border: 1px solid #1e73be;
-  cursor: pointer;
-}
-
-.news-container > li:nth-of-type(2n) {
-  float: right;
-  text-align: left;
-}
-
-.news-container > li > .content {
-  width: 60%;
-  float: left;
-  padding: 10px 0;
-}
-
-.news-container > li > .content > p {
-  margin: 0 12px;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-weight: 360;
-  font-size: 14px;
-  color: #2f2f2f;
-  line-height: 2.2rem;
-}
-
-.news-container > li > .time {
-  width: 20%;
-  float: left;
-  padding: 0;
-}
-
-.news-container > li > .time > p {
-  font-size: 24px;
-  margin: 10px 0;
-}
-
-.news-container > li > .circle {
-  width: 20%;
-  height: 100%;
-  float: left;
-  position: relative;
-}
-
-.news-container > li > .circle > img {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  margin: auto;
-  width: 20px;
-  height: 20px;
-}
-
-.news-container > li > .circle > i {
-  display: block;
-  width: 1px;
-  height: 100%;
-  background: #707070;
-}
-
-.news-container > li:nth-of-type(2n) > .content {
-  float: right;
-}
-
-.news-container > li:nth-of-type(2n) > .time {
-  float: right;
-}
-
-.news-container > li:nth-of-type(2n) > .circle {
-  float: right;
-}
-
-.news-container > li:nth-of-type(1) > .circle > i {
-  height: 50%;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-}
-
-.more {
-  font-size: 25px;
-  color: #707070;
-}
-
-.more > i {
-  cursor: pointer;
-}
-
-@media screen and (max-width: 767px) {
-  .news-container > li {
-    width: 100%;
-  }
-
-  .news-container > li > .content {
-    width: 70%;
-    text-align: left;
-    float: right;
-  }
-
-  .news-container > li > .time {
-    width: 30%;
-    text-align: left;
-    float: right;
-  }
-
-  .news-container > li > .circle {
-    display: none;
-  }
-}
-</style>
-
+<template>
+  <div id="News">
+    <div class="banner container-fuild text-center">公司动态</div>
+    <div class="container">
+      <div class="row news-container">
+        <ul class="news-container container-fuild">
+          <li v-for="(item,index) in newsList" :key="index" class="wow fadeIn">
+            <div class="content">
+              <p>{{ item.title }}</p>
+              <p>{{ item.introduce }}</p>
+            </div>
+            <div class="time">
+              <p>{{ item.date }}</p>
+              <span>{{ item.year }}</span>
+            </div>
+            <div class="circle">
+              <img src="@/assets/img/circle.png">
+              <i class="line center-block"></i>
+            </div>
+          </li>
+        </ul>
+        <div class="contaianer-fuild text-center more">
+          <i class="glyphicon glyphicon-th"></i>
+        </div>
+
+      </div>
+
+
+    </div>
+  </div>
+</template>
+<script>
+import {WOW} from 'wowjs';
+
+export default {
+  name: 'News',
+  data() {
+    return {
+      newsList: [
+        {
+          id: '001',
+          introduce: '配合和参与上海测绘院及上海建科集团数字化转型发展,推荐大疆产品在测绘及工程建设城市运维领域的应用',
+          date: '07-18',
+          year: '2023年'
+        }, {
+          id: '002',
+          introduce: '完成上海化工区智能无人系统应用监管研究课题,帮助园区管委会和相关企业规范开展无人系统应用服务业务',
+          date: '09-27',
+          year: '2022年'
+        }, {
+          id: '003',
+          introduce: '参与上海宝武吴淞园、上海化工区等大型工业园区无人机应用项目的实验和监管论证,推广大疆行业应用产品和服务',
+          date: '03-16',
+          year: '2020年'
+        }, {
+          id: '004',
+          introduce: '完成对口支援日喀则和果乐地区创客空间示范项目建设,设立创客师资上海培训基地,推广3D打印和无人机课程',
+          date: '06-08',
+          year: '2018年'
+        }, {
+          id: '005',
+          introduce: '公司由北航和复旦校友发起创立,推出飞天网创客空间,成为上海众创空间联盟首批会员单位,服务航空科技爱好者',
+          date: '05-24',
+          year: '2014年'
+        }
+      ]
+    }
+  },
+  mounted() {
+    var wow = new WOW();
+    wow.init();
+  },
+}
+</script>
+<style scoped>
+#News {
+  height: 100%;
+}
+
+.banner {
+  color: #fff;
+  font-size: 30px;
+  height: 150px;
+  line-height: 150px;
+  background-image: url("~@/assets/img/dji.jpg");
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-attachment: scroll;
+  background-position: center center;
+}
+
+.news-container {
+  margin: 20px 20px 0 20px;
+}
+
+.nav > a {
+  display: inline-block;
+  text-decoration: none;
+  width: 120px;
+  height: 45px;
+  line-height: 45px;
+  color: #333;
+  border: 1px solid #333;
+}
+
+.nav > a:hover {
+  color: #1e73be;
+  border-color: #1e73be;
+}
+
+.news-container {
+  overflow: hidden;
+  margin-bottom: 0;
+}
+
+.news-container > li {
+  width: 55.62%;
+  height: 120px;
+  float: left;
+  color: #333;
+  text-align: right;
+  border-left: 1px solid transparent;
+  border-right: 1px solid transparent;
+}
+
+.news-container > li:hover {
+  color: #1e73be;
+  border: 1px solid #1e73be;
+  cursor: pointer;
+}
+
+.news-container > li:nth-of-type(2n) {
+  float: right;
+  text-align: left;
+}
+
+.news-container > li > .content {
+  width: 60%;
+  float: left;
+  padding: 10px 0;
+}
+
+.news-container > li > .content > p {
+  margin: 0 12px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-weight: 360;
+  font-size: 14px;
+  color: #2f2f2f;
+  line-height: 2.2rem;
+}
+
+.news-container > li > .time {
+  width: 20%;
+  float: left;
+  padding: 0;
+}
+
+.news-container > li > .time > p {
+  font-size: 24px;
+  margin: 10px 0;
+}
+
+.news-container > li > .circle {
+  width: 20%;
+  height: 100%;
+  float: left;
+  position: relative;
+}
+
+.news-container > li > .circle > img {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  margin: auto;
+  width: 20px;
+  height: 20px;
+}
+
+.news-container > li > .circle > i {
+  display: block;
+  width: 1px;
+  height: 100%;
+  background: #707070;
+}
+
+.news-container > li:nth-of-type(2n) > .content {
+  float: right;
+}
+
+.news-container > li:nth-of-type(2n) > .time {
+  float: right;
+}
+
+.news-container > li:nth-of-type(2n) > .circle {
+  float: right;
+}
+
+.news-container > li:nth-of-type(1) > .circle > i {
+  height: 50%;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+}
+
+.more {
+  font-size: 25px;
+  color: #707070;
+}
+
+.more > i {
+  cursor: pointer;
+}
+
+@media screen and (max-width: 767px) {
+  .news-container > li {
+    width: 100%;
+  }
+
+  .news-container > li > .content {
+    width: 70%;
+    text-align: left;
+    float: right;
+  }
+
+  .news-container > li > .time {
+    width: 30%;
+    text-align: left;
+    float: right;
+  }
+
+  .news-container > li > .circle {
+    display: none;
+  }
+}
+</style>
+

Някои файлове не бяха показани, защото твърде много файлове са промени