Browse Source

飘窗实现

master
aBin 3 years ago
commit
37a54488c2
  1. 3
      .browserslistrc
  2. 219
      .drone.yml
  3. 8
      .editorconfig
  4. 3
      .env
  5. 10
      .env.development
  6. 10
      .env.production
  7. 47
      .eslintrc.js
  8. 23
      .gitignore
  9. 13
      .prettierrc
  10. 24
      README.md
  11. 13
      babel.config.js
  12. 1
      commitlint.config.js
  13. 13847
      package-lock.json
  14. 54
      package.json
  15. BIN
      public/favicon.png
  16. BIN
      public/img/icons/android-chrome-192x192.png
  17. BIN
      public/img/icons/android-chrome-512x512.png
  18. BIN
      public/img/icons/android-chrome-maskable-192x192.png
  19. BIN
      public/img/icons/android-chrome-maskable-512x512.png
  20. BIN
      public/img/icons/apple-touch-icon-120x120.png
  21. BIN
      public/img/icons/apple-touch-icon-152x152.png
  22. BIN
      public/img/icons/apple-touch-icon-180x180.png
  23. BIN
      public/img/icons/apple-touch-icon-60x60.png
  24. BIN
      public/img/icons/apple-touch-icon-76x76.png
  25. BIN
      public/img/icons/apple-touch-icon.png
  26. BIN
      public/img/icons/favicon-16x16.png
  27. BIN
      public/img/icons/favicon-32x32.png
  28. BIN
      public/img/icons/msapplication-icon-144x144.png
  29. BIN
      public/img/icons/mstile-150x150.png
  30. 3
      public/img/icons/safari-pinned-tab.svg
  31. 25
      public/index.html
  32. 2
      public/robots.txt
  33. 15
      rest/http-client.env.json
  34. 54
      rest/project.http
  35. 49
      src/App.vue
  36. BIN
      src/assets/baianicon.png
  37. BIN
      src/assets/biaoyu.png
  38. BIN
      src/assets/bottom.png
  39. 1012
      src/assets/js/web-office-sdk-v1.1.2.es.js
  40. BIN
      src/assets/location.png
  41. BIN
      src/assets/titleLogo.png
  42. 200
      src/common/platform.styl
  43. 565
      src/common/portrait.styl
  44. 79
      src/components/BayWindow/BayWindow.vue
  45. 76
      src/components/Carousel/Carousel.vue
  46. 86
      src/components/Footer/Footer.vue
  47. BIN
      src/components/Footer/erweima.png
  48. BIN
      src/components/Footer/yancong.png
  49. 519
      src/components/HeadNav/HeadNav.vue
  50. 74
      src/components/LeftNav/LeftNav.vue
  51. 156
      src/components/ListPage/ListPage.vue
  52. 385
      src/components/Location/Location.vue
  53. 41
      src/components/RichText/RichText.vue
  54. 27
      src/config/api.js
  55. 30
      src/config/setting.js
  56. 19
      src/config/user.js
  57. 23
      src/main.js
  58. 97
      src/plugins/ant-design-vue.js
  59. 77
      src/plugins/axios.js
  60. 34
      src/registerServiceWorker.js
  61. 84
      src/router/index.js
  62. 7
      src/store/index.js
  63. 46
      src/store/modules/home/actions.js
  64. 7
      src/store/modules/home/getters.js
  65. 6
      src/store/modules/home/index.js
  66. 13
      src/store/modules/home/mutations.js
  67. 6
      src/store/modules/home/state.js
  68. 5
      src/store/modules/user/actions.js
  69. 7
      src/store/modules/user/getters.js
  70. 6
      src/store/modules/user/index.js
  71. 33
      src/store/modules/user/mutations.js
  72. 7
      src/store/modules/user/state.js
  73. 88
      src/views/CompanyProfile/CompanyProfile.vue
  74. 353
      src/views/FirstPages/FirstPage.vue
  75. 145
      src/views/NewPages/NewPages.vue
  76. 132
      src/views/OtherPages/Department.vue
  77. 88
      src/views/OtherPages/Information.vue
  78. 124
      src/views/OtherPages/NoticeNotice.vue
  79. 128
      src/views/OtherPages/PartyBuilding.vue
  80. 124
      src/views/OtherPages/SafeProduction.vue
  81. 100
      src/views/OtherPages/System.vue
  82. 133
      vue.config.js
  83. 10020
      yarn.lock

3
.browserslistrc

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

219
.drone.yml

@ -0,0 +1,219 @@
---
kind: pipeline
type: docker
name: development
# 常量值
constants:
- &DEVELOPMENT_HOST test.tall.wiki
- &DEVELOPMENT_CMD
- npm config set registry http://registry.npm.taobao.org
- npm i
- npm run build:test
- &DEVELOPMENT_SCP_TARGET /home/greenvalley
- &DEVELOPMENT_URL http://www.sxgreenvalley.com/
- &DEVELOPMENT_PORT 22
- &DEVELOPMENT_NODE_VERSION node:16
- &DEVELOPMENT_BRANCH develop
- &DEVELOPMENT_SCP_SOURCE dist/*
- &SCP_STRIP_DIR_LEVEL 1
- &NOTIFY_WECHATROBOT_WEBHOOK https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=428e5c5d-f992-4349-939d-9c99556e50b8
# 挂载的主机卷,可以映射到docker容器中
volumes:
# maven构建缓存(宿主机目录)
- name: ssh_key
host:
path: /root/.ssh/
- name: cache
host:
path: /var/lib/cache
- name: data
host:
path: /var/lib/data
steps:
- name: restore-cache
image: drillster/drone-volume-cache
volumes:
- name: cache
path: /cache
settings:
restore: true
mount:
- ./node_modules
- name: build
image: *DEVELOPMENT_NODE_VERSION
pull: if-not-exists # default always
# volumes:
# - name: cache
# path: /root/.m2
commands: *DEVELOPMENT_CMD
- name: rebuild-cache
image: drillster/drone-volume-cache
volumes:
- name: cache
path: /cache
settings:
rebuild: true
mount:
- ./node_modules
- name: deploy-scp
image: appleboy/drone-scp
pull: if-not-exists
volumes:
- name: ssh_key
path: /root/.ssh/
settings:
host: *DEVELOPMENT_HOST
port: *DEVELOPMENT_PORT
username: root
key_path: /root/.ssh/id_rsa
rm: true # true则会删除目标目录重建
target: *DEVELOPMENT_SCP_TARGET
source: *DEVELOPMENT_SCP_SOURCE
strip_components: 1 # 去除的目录层数,如果没有该选项,则拷贝过去是 target/xxx.jar,1代表去除target
- name: notify-wechatwork
image: fifsky/drone-wechat-work
pull: if-not-exists
settings:
url: *NOTIFY_WECHATROBOT_WEBHOOK
msgtype: markdown
content: |
{{if eq .Status "success" }}
#### 🎉 ${DRONE_REPO} 测试环境构建成功
> Branch: ${DRONE_BRANCH}
> Commit: [${DRONE_COMMIT_MESSAGE} ](${DRONE_COMMIT_LINK})
> Author: ${DRONE_COMMIT_AUTHOR}
> PATH: http://www.sxgreenvalley.com/
> [点击查看](http://www.sxgreenvalley.com/)
{{else}}
#### ❌ ${DRONE_REPO} 测试环境构建失败
> Branch: ${DRONE_BRANCH}
> Commit: [${DRONE_COMMIT_MESSAGE} ](${DRONE_COMMIT_LINK})
> Author: ${DRONE_COMMIT_AUTHOR}
> 请立即修复!!!
> [点击查看](http://www.sxgreenvalley.com/)
{{end}}
when:
status:
- failure
- success
trigger:
branch:
- *DEVELOPMENT_BRANCH
---
kind: pipeline
type: docker
name: production
# 常量值
constants:
- &PRODUCTION_HOST www.sxgreenvalley.com
- &PRODUCTION_CMD
- npm config set registry http://registry.npm.taobao.org
- npm i
- npm run build
- &PRODUCTION_SCP_TARGET /home/greenvalley
- &PRODUCTION_BRANCH master
- &PRODUCTION_PORT 22
- &PRODUCTION_NODE_VERSION node:16
- &PRODUCTION_SCP_SOURCE dist/*
- &SCP_STRIP_DIR_LEVEL 1
- &NOTIFY_WECHATROBOT_WEBHOOK https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=428e5c5d-f992-4349-939d-9c99556e50b8
# 挂载的主机卷,可以映射到docker容器中
volumes:
# maven构建缓存(宿主机目录)
- name: ssh_key
host:
path: /root/.ssh/
- name: cache
host:
path: /var/lib/cache
- name: data
host:
path: /var/lib/data
steps:
- name: restore-cache
image: drillster/drone-volume-cache
volumes:
- name: cache
path: /cache
settings:
restore: true
mount:
- ./node_modules
- name: build
image: *PRODUCTION_NODE_VERSION
pull: if-not-exists # default always
# volumes:
# - name: cache
# path: /root/.m2
commands: *PRODUCTION_CMD
- name: rebuild-cache
image: drillster/drone-volume-cache
volumes:
- name: cache
path: /cache
settings:
rebuild: true
mount:
- ./node_modules
- name: deploy-scp
image: appleboy/drone-scp
pull: if-not-exists
volumes:
- name: ssh_key
path: /root/.ssh/
settings:
host: *PRODUCTION_HOST
port: *PRODUCTION_PORT
username: root
key_path: /root/.ssh/id_rsa
rm: true # true则会删除目标目录重建
target: *PRODUCTION_SCP_TARGET
source: *PRODUCTION_SCP_SOURCE
strip_components: 1 # 去除的目录层数,如果没有该选项,则拷贝过去是 target/xxx.jar,1代表去除target
- name: notify-wechatwork
image: fifsky/drone-wechat-work
pull: if-not-exists
settings:
url: *NOTIFY_WECHATROBOT_WEBHOOK
msgtype: markdown
content: |
{{if eq .Status "success" }}
#### 🎉 ${DRONE_REPO} 生产环境构建成功
> Branch: ${DRONE_BRANCH}
> Commit: [${DRONE_COMMIT_MESSAGE}](${DRONE_COMMIT_LINK})
> Author: ${DRONE_COMMIT_AUTHOR}
> PATH: http://www.sxgreenvalley.com/
> [点击查看](http://www.sxgreenvalley.com/)
{{else}}
#### ❌ ${DRONE_REPO} 生产环境构建失败
> Branch: ${DRONE_BRANCH}
> Commit: [${DRONE_COMMIT_MESSAGE}](${DRONE_COMMIT_LINK})
> Author: ${DRONE_COMMIT_AUTHOR}
> 请立即修复!!!
> [点击查看](http://www.sxgreenvalley.com/)
{{end}}
when:
status:
- failure
- success
trigger:
branch:
- *PRODUCTION_BRANCH

8
.editorconfig

@ -0,0 +1,8 @@
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 140
root = true

3
.env

@ -0,0 +1,3 @@
VUE_APP_MODE=production
VUE_APP_PREVIEW=false
VUE_APP_URL=http://192.168.0.99:7270/

10
.env.development

@ -0,0 +1,10 @@
VUE_APP_MODE=development
VUE_APP_NODE_ENV=development
VUE_APP_SCENE=/datang/
VUE_APP_BASE_URL=http://test.tall.wiki/
VUE_APP_API_URL=http://test.tall.wiki/datang/v1.0
VUE_APP_PROXY_URL=/datang/v1.0
VUE_APP_PUBLIC_PATH=/datang
VUE_APP_MSG_URL=wss://test.tall.wiki/websocket/message/v4.0/ws
VUE_APP_TITLE=大唐
VUE_APP_DESCRIPTION=大唐

10
.env.production

@ -0,0 +1,10 @@
VUE_APP_MODE=production
VUE_APP_NODE_ENV=production
VUE_APP_SCENE=/datang/
VUE_APP_BASE_URL=http://test.tall.wiki/
VUE_APP_API_URL=http://test.tall.wiki/datang/v1.0
VUE_APP_PROXY_URL=/datang/v1.0
VUE_APP_PUBLIC_PATH=/datang
VUE_APP_MSG_URL=wss://test.tall.wiki/websocket/message/v4.0/ws
VUE_APP_TITLE=大唐
VUE_APP_DESCRIPTION=大唐

47
.eslintrc.js

@ -0,0 +1,47 @@
/*
* Copyright (c) 2019.
* author: wally
* email: 18603454788@163.com
*/
module.exports = {
root: true,
env: { browser: true, node: true },
extends: ['plugin:vue/recommended', 'plugin:vue/essential'],
rules: {
'vue/html-self-closing': 'off',
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-param-reassign': ['error', { props: true, ignorePropertyModificationsFor: ['state'] }],
'max-len': ['error', { code: 140, tabWidth: 2 }],
'object-curly-newline': ['error', { multiline: true }],
'arrow-parens': ['error', 'as-needed'],
'linebreak-style': 'off',
'vue/attributes-order': 'off',
'no-param-reassign': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/max-attributes-per-line': 'off',
'vue/multiline-html-element-content-newline': 'off',
'vue/html-indent': 'off',
},
parserOptions: { parser: 'babel-eslint' },
overrides: [
{
files: ['**/__tests__/*.{j,t}s?(x)'],
env: { jest: true },
},
],
globals: {
Vue: true,
VueRouter: true,
Vuex: true,
axios: true,
_: true,
Vuetify: true,
vuetify: true,
},
};

23
.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?

13
.prettierrc

@ -0,0 +1,13 @@
{
"printWidth": 140,
"singleQuote": true,
"semi": true,
"trailingComma": "all",
"arrowParens": "avoid",
"tabWidth": 2,
"useTabs": false,
"bracketSpacing": true,
"jsxBracketSameLine": false,
"proseWrap": "always",
"endOfLine": "lf"
}

24
README.md

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

13
babel.config.js

@ -0,0 +1,13 @@
module.exports = {
presets: ["@vue/cli-plugin-babel/preset"],
plugins: [
[
"import",
{
libraryName: "ant-design-vue",
libraryDirectory: "es",
style: true
}
]
]
};

1
commitlint.config.js

@ -0,0 +1 @@
module.exports = {extends: ['./node_modules/vue-cli-plugin-commitlint/lib/lint']};

13847
package-lock.json

File diff suppressed because it is too large

54
package.json

@ -0,0 +1,54 @@
{
"name": "green-valley",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build:test": "vue-cli-service build --mode development",
"build": "vue-cli-service build --mode production",
"lint": "vue-cli-service lint"
},
"dependencies": {
"ant-design-vue": "^1.2.4",
"compression-webpack-plugin": "^6.1.1",
"core-js": "^3.6.5",
"echarts": "^4.9.0",
"moment": "^2.29.1",
"quill": "^1.3.7",
"register-service-worker": "^1.7.1",
"stylus": "^0.54.8",
"vue": "^2.6.11",
"vue-baidu-map": "^0.21.22",
"vue-dompurify-html": "^2.5.0",
"vue-quill-editor": "^3.0.6",
"vue-router": "^3.2.0",
"vuex": "^3.4.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-pwa": "~4.5.0",
"@vue/cli-plugin-router": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/eslint-config-prettier": "^6.0.0",
"axios": "^0.18.0",
"babel-eslint": "^10.1.0",
"babel-plugin-import": "^1.11.0",
"css-loader": "^5.0.1",
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-vue": "^6.2.2",
"less": "^2.7.3",
"less-loader": "^4.1.0",
"prettier": "^1.19.1",
"sass": "^1.26.5",
"sass-loader": "^8.0.2",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.2",
"svg-sprite-loader": "^5.0.0",
"vue-cli-plugin-ant-design": "^1.0.1",
"vue-cli-plugin-axios": "^0.0.4",
"vue-template-compiler": "^2.6.11"
}
}

BIN
public/favicon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
public/img/icons/android-chrome-192x192.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
public/img/icons/android-chrome-512x512.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
public/img/icons/android-chrome-maskable-192x192.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
public/img/icons/android-chrome-maskable-512x512.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
public/img/icons/apple-touch-icon-120x120.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
public/img/icons/apple-touch-icon-152x152.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
public/img/icons/apple-touch-icon-180x180.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
public/img/icons/apple-touch-icon-60x60.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/img/icons/apple-touch-icon-76x76.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
public/img/icons/apple-touch-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
public/img/icons/favicon-16x16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
public/img/icons/favicon-32x32.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
public/img/icons/msapplication-icon-144x144.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/img/icons/mstile-150x150.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

3
public/img/icons/safari-pinned-tab.svg

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.00251 14.9297L0 1.07422H6.14651L8.00251 4.27503L9.84583 1.07422H16L8.00251 14.9297Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 215 B

25
public/index.html

@ -0,0 +1,25 @@
<!--
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-01-13 17:21:29
* @LastEditors: wally
* @LastEditTime: 2021-01-20 12:57:03
-->
<!DOCTYPE html>
<html lang="en">
<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">
<link rel="icon" href="./favicon.png" type="image/x-icon" >
<title>大唐</title>
<script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=KPWvSuCuXmgphVhYM6tVHmlkav3TGpu5"></script>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

2
public/robots.txt

@ -0,0 +1,2 @@
User-agent: *
Disallow:

15
rest/http-client.env.json

@ -0,0 +1,15 @@
{
"$shared": {
"version": "v1",
"identifier": "wally",
"credential": "111111"
},
"dev": {
"name": "dev",
"url": "http://192.168.0.99/gateway"
},
"local": {
"version": "v2",
"url": "http://192.168.0.99/gateway"
}
}

54
rest/project.http

@ -0,0 +1,54 @@
# @tall = {{url}}/tall/v1.0
@tall = https://www.tall.wiki/gateway/tall/v1.0
@greenvalley = http://www.sxwikionline.com/gateway/greenvalley
@type = content-type: application/json;charset=utf-8
### login
# @name login
POST {{tall}}/users/signin
{{type}}
{
"client": 1,
"type": 3,
"data": {
"identifier": "whj",
"credential": "123456"
}
}
### send code
GET {{tall}}/users/smscode?phone=16603418748
### phone login
# @name phonelogin
POST {{tall}}/users/signin
{{type}}
{
"client": 1,
"type": 1,
"data": {
"identifier": "16603418748",
"credential": "1111"
}
}
### 根据团队id查看研发团队相关信息
POST {{greenvalley}}/business/frontSearchCompany
{{type}}
Authorization: Bearer {{login.response.body.$.data.token}}
{
"param": {
"pageNum": 1,
"pageSize": 5,
"type": 2,
"typeOfPlatform": 2,
}
}

49
src/App.vue

@ -0,0 +1,49 @@
<template>
<a-config-provider :locale="zh_CN">
<div id="app">
<HeadNav />
<Carousel />
<router-view></router-view>
<Footer />
</div>
</a-config-provider>
</template>
<script>
import { mapState } from 'vuex';
import zh_CN from 'ant-design-vue/lib/locale-provider/zh_CN';
import HeadNav from '@/components/HeadNav/HeadNav.vue';
import Footer from '@/components/Footer/Footer.vue';
import Carousel from '@/components/Carousel/Carousel.vue';
export default {
name: 'App',
components: { HeadNav, Footer, Carousel },
data() {
return { zh_CN };
},
computed: mapState('user', ['anyringToken']),
updated() {
window.scroll(0, 0);
},
};
</script>
<style>
html,
body,
#app {
min-height: 100%;
}
#app {
background: transparent;
}
body {
background: #f5f5f5 !important;
}
body::-webkit-scrollbar {
width: 0;
}
</style>

BIN
src/assets/baianicon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
src/assets/biaoyu.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
src/assets/bottom.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

1012
src/assets/js/web-office-sdk-v1.1.2.es.js

File diff suppressed because it is too large

BIN
src/assets/location.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
src/assets/titleLogo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

200
src/common/platform.styl

@ -0,0 +1,200 @@
.nav-box {
height: 50px;
background: #000000;
line-height: 50px;
padding: 0 9%;
color: #fff;
font-size: 16px;
div {
margin-right: 56px;
cursor: pointer;
}
}
.nav-box-active {
color: #13ACC4 !important;
}
.top-box {
overflow: hidden;
background-image: linear-gradient(to right, #6C63FF , #13ACC4);
position: relative;
}
.top-title {
position: absolute;
top: 70px;
left: 4%;
padding: 0;
font-size: 50px;
color: #fff;
}
@media only screen and (max-width: 1500px) {
.top-title {
font-size: 40px;
}
}
.top-content {
float: right;
margin: 30px 0;
margin-right: 12%;
width: 62%;
padding: 0;
font-size: 16px;
color: #fff;
line-height: 36px;
}
.circular {
height: 20px;
width: 20px;
background: #13ACC4;
border-radius: 50%;
top: 50%;
margin-top: -10px;
position: absolute;
}
.center-box {
overflow: hidden;
background: #fff;
padding: 0 9%;
position: relative;
}
.center-title {
position: absolute;
top: 40%;
font-size: 30px;
color: #000;
}
.center-content {
float: right;
margin: 50px 0;
width: 79%;
line-height: 36px;
font-size: 16px;
}
.bottom-box {
// height: 830px;
overflow: hidden;
position: relative;
padding: 0 9%;
}
.bottom-title {
position: absolute;
top: 20%;
font-size: 30px;
color: #000;
}
.bottom-content {
position: relative;
float: right;
margin: 40px 0;
width: 79%;
}
.partner-box {
// height: 1060px;
overflow: hidden;
position: relative;
padding: 0 9%;
background: #fff;
}
.partner-title {
position: absolute;
top: 15%;
font-size: 30px;
color: #000;
}
.partner-content {
float: right;
margin: 100px 0;
width: 79%;
}
.join-box {
// height: 300px;
overflow: hidden;
position: relative;
padding: 0 9%;
}
.join-title {
position: absolute;
top: 40%;
font-size: 30px;
color: #000;
}
.join-content {
float: right;
margin: 70px 0;
font-size: 16px;
width: 79%;
color: rgba(0,0,0,0.65);
line-height: 36px;
}
.content-box {
position: relative;
padding: 0 9%;
}
.space-box{
height: 150px;
}
// .space-box:hover{
// box-shadow: 0 6px 6px rgba(0,0,0,0.16)
// }
// .space-box:hover .introduce-title{
// margin-top: 10px;
// }
.introduce-box {
width: 60%;
overflow: hidden;
position: relative;
background: #fff;
cursor: pointer;
padding: 0 30px;
}
.introduce-title {
margin: 10px 0;
font-size: 26px;
color: rgba(0,0,0,0.85);
}
.introduce-content {
font-size: 16px;
color: rgba(0,0,0,0.65);
margin-bottom: 0
}
.flow-path {
background: -webkit-linear-gradient(left, #13ACC4 , #fff);
padding: 30px 9%;
position: relative;
}
.flow-title {
position: absolute;
top: 40%;
font-size: 30px;
color: #fff;
}
.flow-content {
margin-left: 20%;
width:80%;
font-size: 16px;
color: #fff;
}
.flow-content1 {
margin-left: 15%;
width:85%;
}
.login-color {
color: #096DD9;
cursor: pointer;
}

565
src/common/portrait.styl

@ -0,0 +1,565 @@
// padding
.pa-0 {
padding: 0px;
}
.pa-1 {
padding: 4px;
}
.pa-2 {
padding: 8px;
}
.pa-3 {
padding: 12px;
}
.pa-4 {
padding: 16px;
}
.pa-5 {
padding: 20px;
}
.pt-3 {
padding-top: 12px;
}
.pt-5 {
padding-top: 20px;
}
.pb-3 {
padding-bottom: 12px;
}
.pb-4 {
padding-bottom: 16px;
}
.pb-5 {
padding-bottom: 20px;
}
.pb-10 {
padding-bottom: 40px;
}
.px-1{
padding-left: 4px;
padding-right: 4px;
}
.px-2{
padding-left: 8px;
padding-right: 8px;
}
.px-3{
padding-left: 12px;
padding-right: 12px;
}
.px-4{
padding-left: 16px;
padding-right: 16px;
}
.px-5{
padding-left: 20px;
padding-right: 20px;
}
.px-6{
padding-left: 24px;
padding-right: 24px;
}
.px-10{
padding-left: 40px;
padding-right: 40px;
}
.py-1{
padding-top: 4px;
padding-bottom: 4px;
}
.py-2{
padding-top: 8px;
padding-bottom: 8px;
}
.py-3{
padding-top: 12px;
padding-bottom: 12px;
}
.py-4{
padding-top: 16px;
padding-bottom: 16px;
}
.py-5{
padding-top: 20px;
padding-bottom: 20px;
}
.py-10{
padding-top: 40px;
padding-bottom: 40px;
}
// margin
.ma-2 {
margin: 8px;
}
.ma-3 {
margin: 12px;
}
.mx-0{
margin-left: 0!important;
margin-right: 0!important;
}
.mx-1{
margin-left: 4px;
margin-right: 4px;
}
.mx-2{
margin-left: 8px;
margin-right: 8px;
}
.my-0{
margin-top: 0!important;
margin-bottom: 0!important;
}
.my-1{
margin-top: 4px!important;
margin-bottom: 4px!important;
}
.my-2{
margin-top: 8px;
margin-bottom: 8px;
}
.my-3{
margin-top: 12px;
margin-bottom: 12px;
}
.my-4{
margin-top: 16px;
margin-bottom: 16px;
}
.my-5{
margin-top: 20px;
margin-bottom: 20px;
}
.mt-1{
margin-top: 4px;
}
.mt-2{
margin-top: 8px;
}
.mt-3{
margin-top: 12px;
}
.mt-4{
margin-top: 16px;
}
.mt-5{
margin-top: 20px;
}
.mt-8{
margin-top: 32px;
}
.mb-1{
margin-bottom: 4px;
}
.mb-2{
margin-bottom: 8px;
}
.mb-3{
margin-bottom: 12px;
}
.mb-4{
margin-bottom: 16px;
}
.mb-5{
margin-bottom: 20px;
}
.mb-6{
margin-bottom: 24px;
}
.mb-7{
margin-bottom: 28px;
}
.mb-8{
margin-bottom: 32px;
}
.mb-9{
margin-bottom: 36px;
}
.mb-10{
margin-bottom: 40px;
}
.ml-2{
margin-left: 8px;
}
.ml-3{
margin-left: 12px;
}
.ml-4{
margin-left: 16px;
}
.ml-5{
margin-left: 20px;
}
.ml-6{
margin-left: 24px;
}
.ml-7{
margin-left: 28px;
}
.ml-8{
margin-left: 32px;
}
.mr-1{
margin-right: 4px;
}
.mr-2{
margin-right: 8px;
}
.mr-3{
margin-right: 12px;
}
.mr-4{
margin-right: 16px;
}
.mr-5{
margin-right: 20px;
}
.mr-6{
margin-right: 24px;
}
.mr-7{
margin-right: 28px;
}
.mr-8{
margin-right: 32px;
}
// background
.white {
background: white;
}
// flex
.d-flex{
display: flex;
}
.flex-wrap{
flex-wrap: wrap;
}
.flex-nowrap{
flex-wrap: nowrap;
}
.flex-column{
flex-direction: column;
}
.flex-column-reverse{
flex-direction: column-reverse;
}
.flex-row{
flex-direction: row;
}
.flex-row-reverse{
flex-direction: row-reverse;
}
.justify-center{
justify-content: center;
}
.justify-space-between{
justify-content: space-between;
}
.align-center{
align-items: center
}
.align-start{
align-items: flex-start
}
.align-end{
align-items: flex-end
}
.flex-1{
display: flex;
flex: 1;
}
.flex-3{
display: flex;
flex: 3;
}
// other
.inner {
width: 82%;
margin: 0 auto;
}
.pointer{
cursor:pointer;
}
.fill-height{
height:100%;
}
.fill-width{
width:100%;
text-align: center;
img{
width: 85%;
}
}
img{
max-width: 100%
}
// font
.font-big{
font-size: 60px;
}
.font-small{
font-size: 30px;
line-height: 40px;
}
.font-bold{
font-weight: bold;
}
@media only screen and (max-width: 1400px) {
.font-big{
font-size: 45px;
}
.font-small{
font-size: 26px;
line-height: 36px;
}
}
.font-bold-32{
font-size: 32px;
font-weight: bold;
}
.font-32{
font-size: 32px;
}
.font-bold-24{
font-size: 24px;
font-weight: bold;
}
.font-24{
font-size: 24px;
}
.font-20{
font-size: 20px;
}
.font-bold-20{
font-size: 20px;
font-weight: bold;
}
.font-bold-16{
font-size: 16px;
font-weight: bold;
}
.font-16{
font-size: 16px;
}
.font-bold-14{
font-size: 14px;
font-weight: bold;
}
.font-14{
font-size: 14px;
}
.font-12{
font-size: 12px;
}
.icon-size{
font-size: 20px;
}
h2{
font-size: 24px;
font-weight: bold;
color: rgba(0,0,0,.85)
}
.baseColor{
color: #13ACC4
}
.bg{
background: #F5F5F5
}
.ant-btn {
color: #13acc4 !important;
border-color: #13acc4 !important;
}
.ant-btn-primary{
background-color: #13ACC4
border-color: #13ACC4;
color: #fff!important;
}
.ant-btn-link:hover, .ant-btn-link:focus{
color: #13ACC4;
}
.ant-btn-link{
border-color: transparent!important;
}
.ant-btn-primary-disabled, .ant-btn-primary.disabled, .ant-btn-primary[disabled], .ant-btn-primary-disabled:hover, .ant-btn-primary.disabled:hover, .ant-btn-primary[disabled]:hover, .ant-btn-primary-disabled:focus, .ant-btn-primary.disabled:focus, .ant-btn-primary[disabled]:focus, .ant-btn-primary-disabled:active, .ant-btn-primary.disabled:active, .ant-btn-primary[disabled]:active, .ant-btn-primary-disabled.active, .ant-btn-primary.disabled.active, .ant-btn-primary[disabled].active{
border-color: #d9d9d9!important;
color: rgba(0, 0, 0, 0.25)!important;
}
.ant-btn-disabled, .ant-btn.disabled, .ant-btn[disabled], .ant-btn-disabled:hover, .ant-btn.disabled:hover, .ant-btn[disabled]:hover, .ant-btn-disabled:focus, .ant-btn.disabled:focus, .ant-btn[disabled]:focus, .ant-btn-disabled:active, .ant-btn.disabled:active, .ant-btn[disabled]:active, .ant-btn-disabled.active, .ant-btn.disabled.active, .ant-btn[disabled].active{
color: rgba(0, 0, 0, 0.25)!important;
border-color: #d9d9d9!important;
}
.ant-carousel .slick-list .slick-slide.slick-active div{
display: block !important;
}
.base-bg{
background: #13ACC4
}
.second-base-bg{
background: #AACD06
}
//
.white--text{
color: #fff
}
.grey--text{
color: #616161
}
.title-color{
color: rgba(0,0,0,.85)
}
.textColor{
color: rgba(0,0,0,.65)
}
.secondary{
color: rgba(0,0,0,.45)
}
// line-height
.line-height-30{
line-height: 30px
}
.line-height-36{
line-height: 36px
}
.content-1180 {
width: 1180px;
margin: 0 auto;
}
.p-4 {
padding: 16px;
}
.pt-2 {
padding-top: 8px;
}
.pt-4 {
padding-top: 16px;
}
.one-text {
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}

79
src/components/BayWindow/BayWindow.vue

@ -0,0 +1,79 @@
<template>
<div>
<div id="bay" @mouseout="mouseout" @mouseover="mouseover">
飘窗
</div>
</div>
</template>
<script>
export default {
data() {
return {
ggRoll: null,
interval: null,
};
},
mounted() {
this.change();
},
methods: {
change() {
const ggRoll = {
//
roll: document.getElementById('bay'), //idroll
speed: 20, //
statusX: 1, //left
statusY: 1, //top
x: 0, //left
y: 0, //top
//left
winW: document.documentElement.clientWidth - document.getElementById('bay').offsetWidth,
//top
winH: document.documentElement.clientHeight - document.getElementById('bay').offsetHeight,
//
Go: function() {
//divleft
ggRoll.roll.style.left = ggRoll.x + 'px';
//divtop
ggRoll.roll.style.top = ggRoll.y + 'px';
//statusX=11px,1px
ggRoll.x = ggRoll.x + (ggRoll.statusX ? -1 : 1);
//left0divstatusX0
if (ggRoll.x < 0) {
ggRoll.statusX = 0;
}
//topwinWdivstatusX1
if (ggRoll.x > ggRoll.winW) {
ggRoll.statusX = 1;
}
ggRoll.y = ggRoll.y + (ggRoll.statusY ? -1 : 1);
if (ggRoll.y < 0) {
ggRoll.statusY = 0;
}
if (ggRoll.y > ggRoll.winH) {
ggRoll.statusY = 1;
}
},
};
this.ggRoll = ggRoll;
this.interval = setInterval(this.ggRoll.Go, this.ggRoll.speed);
},
mouseout() {
this.interval = setInterval(this.ggRoll.Go, this.ggRoll.speed);
},
mouseover() {
clearInterval(this.interval);
this.interval = null;
},
},
};
</script>
<style scoped>
#bay {
position: fixed;
height: 250px;
width: 250px;
background-color: red;
}
</style>

76
src/components/Carousel/Carousel.vue

@ -0,0 +1,76 @@
<template>
<div>
<a-carousel autoplay :dots="false">
<div v-for="item in imgList" :key="item.id">
<img style="height: 380px;cursor: pointer;" :src="item.url" @click="openImg(item.url)" />
</div>
</a-carousel>
<div class="slogan">
<div class="slogan-content content-1180 d-flex flex-column">
<div style="text-align-last: justify">
高举中国特色社会主义伟大旗帜紧密团结在以习近平同志
</div>
<div style="text-align-last: justify">
为核心的党中央周围努力把中国大唐打造成为世界一流能源供应商
</div>
</div>
</div>
</div>
</template>
<script>
import { carouselQuery } from 'config/api';
export default {
data() {
return {
imgList: [],
str: '',
};
},
created() {
this.getImg();
},
methods: {
async getImg() {
try {
const params = { param: { showPage: '0000' } };
const res = await carouselQuery(params);
const { data, code, msg } = res.data;
this.imgList = [...data];
} catch (error) {}
},
openImg(url) {
window.open(url);
},
},
};
</script>
<style scoped>
.slogan-content {
height: 100%;
justify-content: space-evenly;
font-size: 30px;
font-weight: bold;
color: #fff;
}
.ant-carousel >>> .slick-slide {
/* text-align: center; */
height: 380px;
line-height: 380px;
/* background: #364d79; */
overflow: hidden;
}
.ant-carousel >>> .slick-slide h3 {
color: #fff;
}
.slogan {
height: 108px;
background: url('../../assets/biaoyu.png') no-repeat;
background-size: 100% 100%;
}
</style>

86
src/components/Footer/Footer.vue

@ -0,0 +1,86 @@
<template>
<div class="footer-box" style="margin-top:100px;position:relative">
<div class="content-1180">
<div class="d-flex" style="margin-top:20px">
<div class="footer-title">
<p style="font-size:24px;rgb(51,51,51);font-weight:bold;">网上展厅</p>
<p style="font-size:18px;rgb(102,102,102)">公示公告</p>
<p style="font-size:18px;rgb(102,102,102)">数字大唐</p>
</div>
<div class="footer-title">
<p style="font-size:24px;rgb(51,51,51);font-weight:bold;">网上服务</p>
<p style="font-size:18px;rgb(102,102,102)">人才招购</p>
<p style="font-size:18px;rgb(102,102,102)">招标采购</p>
</div>
<div class="footer-title">
<p style="font-size:24px;rgb(51,51,51);font-weight:bold;">资料下载</p>
<p style="font-size:18px;rgb(102,102,102)">责任报告</p>
<p style="font-size:18px;rgb(102,102,102)">企业VI</p>
</div>
<img src="./erweima.png" style="width:164px;height:94px" alt="" />
</div>
<div style="position:absolute;bottom:30px;z-index: 10;width:640px;">
<div class="d-flex">
<div style="margin-right:22px">
山西省朔州市朔城区神头镇 邮编:036002
</div>
<div class="d-flex align-center justify-center" style="margin-bottom: 10px">
<div>使用说明</div>
<div class="mx-2">|</div>
<div>法律声明</div>
<div class="mx-2">|</div>
<div>反馈留言</div>
</div>
<!-- <div style="margin-right:22px">
京ICP备18049784号-3
</div>
<div>
<img src="@/assets/baianicon.png" alt="" />
京公网安备11040102700144号
</div> -->
</div>
</div>
</div>
<img src="./yancong.png" style="width:909px;height:412px;position: absolute;right: 0;bottom: 0" alt="" />
</div>
</template>
<script>
export default {
data() {
return {};
},
methods: {},
};
</script>
<style scoped>
.footer-box {
background: #fff;
height: 320px;
padding: 30px 0;
}
.footer-link {
height: 52px;
background: #a90500;
}
.footer-title {
width: 188px;
}
/deep/.ant-select-dropdown {
width: auto !important;
}
.footer-contact {
height: 252px;
background: #fff;
}
.footer-footer {
background: #4c4c4c;
height: 78px;
color: #898989;
text-align: center;
}
.beian {
height: 100%;
justify-content: space-evenly;
}
</style>

BIN
src/components/Footer/erweima.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
src/components/Footer/yancong.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 KiB

519
src/components/HeadNav/HeadNav.vue

@ -0,0 +1,519 @@
<template>
<div class="head-box">
<div class="content-1180 head-title d-flex align-center justify-space-between">
<div>
<img src="@/assets/titleLogo.png" style="height: 48px;" alt="" />
</div>
<div>
<a-input-search placeholder="输入关键字进行搜索..." style="width: 240px" @search="onSearch" />
</div>
</div>
<div class="head-tab">
<div class="content-1180 head-tab-h d-flex">
<div
v-for="(item, index) in tabList"
:key="index"
class="flex-1 align-center justify-center head-tab-title-box"
:class="index === showPage ? 'showPageColor' : ''"
style="position: relative;"
>
<div
@click="jumpPage(index, item.url, item.children)"
style=" height:100%;width: 100%;"
class="d-flex align-center justify-center head-tab-title"
>
<div class="head-tab-t-c">{{ item.title }}</div>
</div>
<div
class="head-tab-secondary"
:style="{
width: item.children && item.children.length < 6 ? '100%' : '300%',
left: tabList.length - index >= 3 ? '0 !important' : 'auto',
right:
tabList.length - index < 3 && tabList.length - index > 2 ? '100% !important' : tabList.length - index < 2 ? '0' : 'auto',
}"
>
<template v-if="item.children && item.children.length < 6">
<div
class="child one-text-2"
v-for="child in item.children"
:key="child.title"
@click="jumpDetail(index, item.url, child.code)"
>
{{ child.title }}
</div>
</template>
<template v-else>
<div class="d-flex flex-row flex-wrap">
<div
class="child-3 one-text-2"
v-for="child in item.children"
:key="child.title"
@click="jumpDetail(index, item.url, child.code)"
>
{{ child.title }}
</div>
</div>
</template>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
tabList: [
{
title: '首页',
url: '/',
children: [],
},
{
title: '公司概况',
url: '/profile',
children: [
{
title: '公司简介',
code: '0101',
},
{
title: '公司领导',
code: '0102',
},
{
title: '组织架构',
code: '0103',
},
{
title: '企业VI',
code: '0104',
},
{
title: '联系方式',
code: '0105',
},
],
},
{
title: '新闻中心',
url: '/news',
children: [
{
title: '集团新闻',
code: '0201',
},
{
title: '省公司新闻',
code: '0202',
},
{
title: '公司新闻',
code: '0203',
},
{
title: '图片新闻',
code: '0204',
},
{
title: '热点专题',
code: '0205',
},
{
title: '媒体关注',
code: '0206',
},
{
title: '视频新闻',
code: '0207',
},
{
title: '专题片',
code: '0208',
},
{
title: '企业画册',
code: '0209',
},
{
title: '现场风采',
code: '0210',
},
],
},
{
title: '党的建设',
url: '/building',
children: [
{
title: '中心组学习',
code: '0301',
},
{
title: '示范党委',
code: '0302',
},
{
title: '党支部达标',
code: '0303',
},
{
title: '群团工作',
code: '0304',
},
{
title: '党建动态',
code: '0305',
},
{
title: '党风廉政',
code: '0306',
},
],
},
{
title: '安全生产',
url: '/production',
children: [
{
title: '安全会议',
code: '0401',
},
{
title: '安全生产记录',
code: '0402',
},
{
title: '应急管理',
code: '0403',
},
{
title: '三讲一落实',
code: '0404',
},
{
title: '曝光台',
code: '0405',
},
],
},
{
title: '通知公告',
url: '/notice',
children: [
{
title: '通知',
code: '0501',
},
{
title: '通报',
code: '0502',
},
{
title: '公告',
code: '0503',
},
{
title: '值班安排',
code: '0504',
},
{
title: '浮窗',
code: '0505',
},
],
},
{
title: '信息公开',
url: '/information',
children: [
{
title: '基本信息',
code: '0601',
},
{
title: '经营管理',
code: '0602',
},
{
title: '公司公告',
code: '0603',
},
{
title: '社会责任',
code: '0604',
},
{
title: '关于信息公开',
code: '0605',
},
],
},
{
title: '审批事项',
children: [
{
title: '公务用车',
code: '',
},
{
title: '领导干部外出报备',
code: '',
},
{
title: '疫情防控',
code: '',
},
{
title: '用印申请',
code: '',
},
{
title: '业务招待事项',
code: '',
},
{
title: '会议室使用',
code: '',
},
{
title: '办公用品领用',
code: '',
},
],
},
{
title: '制度资料',
url: '/system',
children: [
{
title: '集团公司制度',
code: '0801',
},
{
title: '山西公司制度',
code: '0802',
},
{
title: '行业标准与制度',
code: '0803',
},
{
title: '公司制度',
code: '0804',
},
{
title: '地方规章',
code: '0805',
},
{
title: '培训课件',
code: '0806',
},
{
title: '培训影像',
code: '0807',
},
{
title: '科技创新',
code: '0808',
},
],
},
{
title: '部门首页',
url: '/department',
children: [
{
title: '总经理工作部',
code: '0901',
},
{
title: '计划营销部',
code: '0902',
},
{
title: '财务管理部',
code: '0903',
},
{
title: '人力资源部',
code: '0904',
},
{
title: '党群工作部',
code: '0905',
},
{
title: '纪委办公室(审计部)',
code: '0906',
},
{
title: '燃料采购部',
code: '0907',
},
{
title: '物资管理部',
code: '0908',
},
{
title: '项目开发部',
code: '0909',
},
{
title: '燃料质量验收部',
code: '0910',
},
{
title: '安全监督部',
code: '0911',
},
{
title: '设备部',
code: '0912',
},
{
title: '发电部',
code: '0913',
},
{
title: '维护部',
code: '0914',
},
{
title: '热工专业',
code: '0915',
},
{
title: '电气专业',
code: '0916',
},
],
},
],
showPage: 0,
};
},
created() {
setTimeout(() => {
for (let i = 0; i < this.tabList.length; i++) {
if (this.tabList[i].url && this.$route.path === this.tabList[i].url) {
this.showPage = i;
}
}
}, 100);
},
methods: {
onSearch() {
console.log('点击了搜索按钮,但是没有搜索事件');
},
jumpPage(index, url, children) {
if (this.showPage === index) {
this.$message.warning('已在当前界面!');
} else {
this.showPage = index;
if (url) {
if (children.length && children[0].code) {
this.$router.push({
path: url,
query: { code: children[0].code },
});
} else {
this.$router.push(url);
}
}
}
},
jumpDetail(index, url, code) {
const { query } = this.$route;
if (this.showPage === index && query.code === code) {
this.$message.warning('已在当前界面!');
} else {
this.showPage = index;
if (url) {
this.$router.push({
path: url,
query: { code },
});
}
}
},
},
};
</script>
<style scoped>
.one-text-2 {
text-align: center;
cursor: pointer;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.one-text-2:hover {
background: #870400;
}
.child {
width: 100%;
height: 42px;
line-height: 42px;
}
.child-3 {
width: 33.33%;
height: 42px;
line-height: 42px;
}
.head-tab-secondary {
display: none;
position: absolute;
top: 56px;
background: #a90500;
font-size: 16px;
z-index: 10;
}
.head-tab-title-box:hover .head-tab-secondary {
display: inline-block;
}
.head-box {
background: #fff;
}
.head-title {
height: 84px;
}
.head-tab-h {
height: 56px;
font-size: 18px;
color: #fff;
}
.head-tab {
height: 56px;
background: #a90500;
}
.head-tab-title {
cursor: pointer;
}
.head-tab-title:hover {
background: #870400;
}
.showPageColor {
background: #870400;
}
.head-tab-t-c {
transition: color 0.3s;
}
.head-tab-t-c:hover {
color: #cc2626;
}
/deep/.ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled) {
border-color: #d9d9d9;
border-right-width: 1px !important;
}
/deep/.ant-input:focus {
border-color: #d9d9d9;
border-right-width: 1px !important;
outline: 0;
box-shadow: 0 0 0 2px rgb(217 217 217 /20%);
}
</style>

74
src/components/LeftNav/LeftNav.vue

@ -0,0 +1,74 @@
<template>
<div>
<div class="left-title left-nav d-flex align-center justify-center">
{{ list.title }}
</div>
<div
v-for="item in list.children"
:key="item.code"
class="left-nav left-child d-flex align-center justify-center"
:class="code === item.code ? 'active' : ''"
@click="changeQuery(item.code)"
>
{{ item.title }}
</div>
</div>
</template>
<script>
export default {
name: 'LeftNav',
props: {
list: {
default: () => {},
type: Object,
},
code: {
default: '',
type: String,
},
},
data() {
return {};
},
methods: {
changeQuery(code) {
if (code !== this.code) {
this.$router.push({
query: { code },
});
this.$emit('chanegCode', code);
}
},
},
};
</script>
<style scoped>
.left-title {
background-color: rgb(174, 0, 2);
color: #fff;
font-size: 24px;
font-weight: bold;
}
.left-nav {
width: 240px;
height: 56px;
border-bottom: 1px solid rgba(112, 112, 112, 0.1);
}
.left-child {
background-color: #fff;
font-size: 20px;
cursor: pointer;
transition: all 0.2s;
}
.left-nav:hover {
background-color: rgba(174, 0, 2, 0.4);
border-left: 4px solid rgb(174, 0, 2);
color: #fff;
}
.active {
background-color: rgba(174, 0, 2, 0.4);
border-left: 4px solid rgb(174, 0, 2);
color: #fff;
}
</style>

156
src/components/ListPage/ListPage.vue

@ -0,0 +1,156 @@
<template>
<div style="position:relative;height: 100%;">
<div class="year-box">
<span :class="year - 0 === item.year - 0 ? 'active' : ''" v-for="item in yearList" :key="item.year" @click="changeYear(item.year)">{{
item.year
}}</span>
</div>
<ul v-if="content.total - 0" style="max-width: 892px">
<li v-for="item in content.list" :key="item.introId" class="mb-5" @click="openPage(item.introId)">
<div class="d-flex justify-space-between align-center">
<div style="max-width: 680px" class="one-text">{{ item.title }}{{ item.title }}</div>
<div style="width: 110px">[{{ $moment(item.publishTime).format('YYYY - HH - DD') }}]</div>
</div>
</li>
</ul>
<div v-else style="height: 100%" class="d-flex justify-center align-center">
<a-empty />
</div>
<div style="position:absolute;bottom:16px;width:100%" class="d-flex justify-center align-center">
<a-pagination show-quick-jumper :default-current="1" :total="content.total - 0" @change="onChange" />
</div>
</div>
</template>
<script>
import { getCondition } from 'config/api';
export default {
props: {
content: {
default: () => {},
type: Object,
},
code: {
default: '0201',
type: String,
},
},
data() {
return {
yearList: [
{
year: 2020,
},
{
year: 2021,
},
{
year: 2022,
},
],
year: '2020',
};
},
watch: {
code(val) {
this.getYear();
},
},
methods: {
onChange(pageNumber) {
this.$emit('getData', pageNumber);
},
openPage(id) {
window.open(`${window.location.href}&introId=${id}`);
},
changeYear(year) {
this.year = year;
this.$emit('changeYear', year);
},
async getYear() {
try {
const params = { showPage: this.code };
const res = await getCondition(params);
console.log('res: ', res);
} catch (error) {}
},
},
};
</script>
<style scoped>
.year-box {
height: 40px;
margin-left: 24px;
}
.year-box >>> span {
padding: 4px 8px;
border: 1px solid #ededed;
border-radius: 4px;
margin-right: 16px;
cursor: pointer;
}
.year-box >>> span:hover {
border: 1px solid #b61412;
color: #b61412;
}
.active {
border: 1px solid #b61412;
background: #b61412;
color: #fff !important;
}
/deep/.ant-pagination-item-active {
font-weight: 500;
background: #fff;
border-color: #b61412;
background: #b61412;
}
/deep/.ant-pagination-item:hover {
font-weight: 500;
background: #fff;
border-color: #b61412;
background: #b61412;
}
/deep/.ant-pagination-item:focus a,
/deep/.ant-pagination-item:hover a {
color: #fff;
}
/deep/.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon,
/deep/.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon {
color: #b61412;
}
/deep/.ant-pagination-prev:focus .ant-pagination-item-link,
/deep/.ant-pagination-next:focus .ant-pagination-item-link,
/deep/.ant-pagination-prev:hover .ant-pagination-item-link,
/deep/.ant-pagination-next:hover .ant-pagination-item-link {
color: #b61412;
border-color: #b61412;
}
/deep/.ant-pagination-options-quick-jumper input:hover {
border-color: #b61412;
border-right-width: 1px !important;
}
/deep/.ant-pagination-options-quick-jumper input:focus {
border-color: #b61412;
border-right-width: 1px !important;
outline: 0;
box-shadow: 0 0 0 2px rgb(182 20 18 /20%);
}
/deep/.ant-pagination-item-active:focus a {
color: #fff;
}
/deep/.ant-pagination-item-active:hover a {
color: #fff;
}
/deep/.ant-pagination-item-active a {
color: #fff;
}
li {
list-style-type: disc !important;
font-size: 16px;
color: rgb(51, 51, 51);
}
li::marker {
color: #b61412;
}
</style>

385
src/components/Location/Location.vue

@ -0,0 +1,385 @@
<template>
<div class="content-nav">
<img src="@/assets/location.png" alt="" />
您当前位置:
<span> > {{ title }} </span>
<span> > {{ titleTwo }} </span>
</div>
</template>
<script>
export default {
data() {
return {
str: '',
tabList: [
{
title: '首页',
url: '/',
children: [],
},
{
title: '公司概况',
url: '/profile',
children: [
{
title: '公司简介',
code: '0101',
},
{
title: '公司领导',
code: '0102',
},
{
title: '组织架构',
code: '0103',
},
{
title: '企业VI',
code: '0104',
},
{
title: '联系方式',
code: '0105',
},
],
},
{
title: '新闻中心',
url: '/news',
children: [
{
title: '集团新闻',
code: '0201',
},
{
title: '省公司新闻',
code: '0202',
},
{
title: '公司新闻',
code: '0203',
},
{
title: '图片新闻',
code: '0204',
},
{
title: '热点专题',
code: '0205',
},
{
title: '媒体关注',
code: '0206',
},
{
title: '视频新闻',
code: '0207',
},
{
title: '专题片',
code: '0208',
},
{
title: '企业画册',
code: '0209',
},
{
title: '现场风采',
code: '0210',
},
],
},
{
title: '党的建设',
url: '/building',
children: [
{
title: '中心组学习',
code: '0301',
},
{
title: '示范党委',
code: '0302',
},
{
title: '党支部达标',
code: '0303',
},
{
title: '群团工作',
code: '0304',
},
{
title: '党建动态',
code: '0305',
},
{
title: '党风廉政',
code: '0306',
},
],
},
{
title: '安全生产',
url: '/production',
children: [
{
title: '安全会议',
code: '0401',
},
{
title: '安全生产记录',
code: '0402',
},
{
title: '应急管理',
code: '0403',
},
{
title: '三讲一落实',
code: '0404',
},
{
title: '曝光台',
code: '0405',
},
],
},
{
title: '通知公告',
url: '/notice',
children: [
{
title: '通知',
code: '0501',
},
{
title: '通报',
code: '0502',
},
{
title: '公告',
code: '0503',
},
{
title: '值班安排',
code: '0504',
},
{
title: '浮窗',
code: '0505',
},
],
},
{
title: '信息公开',
url: '/information',
children: [
{
title: '基本信息',
code: '0601',
},
{
title: '经营管理',
code: '0602',
},
{
title: '公司公告',
code: '0603',
},
{
title: '社会责任',
code: '0604',
},
{
title: '关于信息公开',
code: '0605',
},
],
},
{
title: '审批事项',
children: [
{
title: '公务用车',
code: '',
},
{
title: '领导干部外出报备',
code: '',
},
{
title: '疫情防控',
code: '',
},
{
title: '用印申请',
code: '',
},
{
title: '业务招待事项',
code: '',
},
{
title: '会议室使用',
code: '',
},
{
title: '办公用品领用',
code: '',
},
],
},
{
title: '制度资料',
url: '/system',
children: [
{
title: '集团公司制度',
code: '0801',
},
{
title: '山西公司制度',
code: '0802',
},
{
title: '行业标准与制度',
code: '0803',
},
{
title: '公司制度',
code: '0804',
},
{
title: '地方规章',
code: '0805',
},
{
title: '培训课件',
code: '0806',
},
{
title: '培训影像',
code: '0807',
},
{
title: '科技创新',
code: '0808',
},
],
},
{
title: '部门首页',
url: '/department',
children: [
{
title: '总经理工作部',
code: '0901',
},
{
title: '计划营销部',
code: '0902',
},
{
title: '财务管理部',
code: '0903',
},
{
title: '人力资源部',
code: '0904',
},
{
title: '党群工作部',
code: '0905',
},
{
title: '纪委办公室(审计部)',
code: '0906',
},
{
title: '燃料采购部',
code: '0907',
},
{
title: '物资管理部',
code: '0908',
},
{
title: '项目开发部',
code: '0909',
},
{
title: '燃料质量验收部',
code: '0910',
},
{
title: '安全监督部',
code: '0911',
},
{
title: '设备部',
code: '0912',
},
{
title: '发电部',
code: '0913',
},
{
title: '维护部',
code: '0914',
},
{
title: '热工专业',
code: '0915',
},
{
title: '电气专业',
code: '0916',
},
],
},
],
title: '',
titleTwo: '',
};
},
watch: {
'$route.query.code'() {
this.getLocal();
},
},
created() {
this.getLocal();
},
methods: {
getLocal() {
const path = this.$route.path;
const query = this.$route.query;
for (let i = 0; i < this.tabList.length; i++) {
const title = this.tabList[i];
if (title.url === path) {
this.title = title.title;
for (let k = 0; k < title.children.length; k++) {
if (query.code && query.code === title.children[k].code) {
this.titleTwo = title.children[k].title;
}
}
}
}
},
},
};
</script>
<style scoped>
.content-nav {
height: 40px;
margin-bottom: 16px;
background: #fff;
font-size: 16px;
line-height: 40px;
padding: 0 16px;
}
img {
width: 28px;
}
</style>

41
src/components/RichText/RichText.vue

@ -0,0 +1,41 @@
<template>
<div>
<template v-if="richObj && richObj.title">
<div class="title">{{ richObj.title }}</div>
<div class="source-time d-flex justify-center">
<div class="mr-4">{{ richObj.source }}</div>
<div class="mr-4">{{ richObj.author }}</div>
<div>{{ $moment(richObj.publishTime).format('YYYY-MM-DD') }}</div>
</div>
</template>
<div class="mt-4" v-dompurify-html="richObj.content"></div>
<template v-if="richObj && richObj.title">
<div class="mt-5" style="text-align: right">[责编: {{ richObj.editor }}]</div>
</template>
</div>
</template>
<script>
export default {
props: {
richObj: {
default: () => {},
type: Object,
},
},
data() {
return {};
},
};
</script>
<style scoped>
.title {
font-size: 22px;
font-weight: bold;
text-align: center;
}
.source-time {
font-size: 16px;
color: rgba(153, 153, 153, 0.6);
margin-top: 10px;
}
</style>

27
src/config/api.js

@ -0,0 +1,27 @@
import axios from 'axios';
let { proxyUrl, msgUrl } = require('@/config/setting');
const apiDocs = `${proxyUrl}`;
const carousel = `${apiDocs}/carousel`; // 轮播图
const content = `${apiDocs}/content`; // 网站内容
// websocket基础地址
export const WS_BASE_URL = msgUrl;
// 轮播图查询
export const carouselQuery = params => axios.post(`${carousel}/query`, params);
// 官网首页列表查询
export const getContent = params =>
axios.get(
`${content}/list?showPage=${params.showPage}&
year=${params.year}&showType=${params.showType}&
pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
);
// 官网内容详情查询
export const getDetail = params => axios.get(`${content}/detail?showPage=${params.showPage}&introId=${params.introId}`);
// 查询当前code下的年份
export const getCondition = params => axios.get(`${content}/condition?showPage=${params.showPage}`);

30
src/config/setting.js

@ -0,0 +1,30 @@
const title = process.env.VUE_APP_TITLE;
const description = process.env.VUE_APP_DESCRIPTION;
const baseUrl = process.env.VUE_APP_BASE_URL;
const apiUrl = process.env.VUE_APP_API_URL;
const proxyUrl = process.env.VUE_APP_PROXY_URL;
const publicPath = process.env.VUE_APP_PUBLIC_PATH;
const msgUrl = process.env.VUE_APP_MSG_URL;
module.exports = {
// 首页标题
title,
// 首页描述信息
description,
// 基础地址
baseUrl,
// api基础地址
apiUrl,
// 消息系统地址
msgUrl,
// api代理地址
proxyUrl,
// 生成文件目录 publicPath
publicPath,
};

19
src/config/user.js

@ -0,0 +1,19 @@
/*
* Copyright (c) 2019.
* author: wally
* email: 18603454788@163.com
*/
// 用户登录client
export const SIGN_IN_CLIENTS = { mp: 0, h5: 1, android: 2, ios: 3 };
// 用户登录类型
export const SIGN_IN_TYPES = {
mp: 0,
phone: 1,
email: 2,
username: 3,
wx: 4,
wx_web: 5,
wb: 6,
};

23
src/main.js

@ -0,0 +1,23 @@
// @ts-ignore
import Vue from 'vue';
import './plugins/axios';
import App from './App.vue';
import './registerServiceWorker';
import router from './router';
import store from './store';
import './plugins/ant-design-vue.js';
import 'common/portrait.styl';
import 'common/platform.styl';
import moment from 'moment'; //导入文件
import VueDOMPurifyHTML from 'vue-dompurify-html';
Vue.use(VueDOMPurifyHTML);
Vue.prototype.$moment = moment; //赋值使用
Vue.config.productionTip = false;
window.vm = new Vue({
router,
store,
render: h => h(App),
}).$mount('#app');

97
src/plugins/ant-design-vue.js

@ -0,0 +1,97 @@
/*
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-01-13 17:21:29
* @LastEditors: wally
* @LastEditTime: 2021-01-19 13:06:34
*/
import Vue from 'vue';
import {
Pagination,
Button,
Input,
message,
notification,
Modal,
Tag,
Table,
Tabs,
Icon,
Empty,
Form,
Select,
Upload,
Badge,
Popconfirm,
DatePicker,
Switch,
Radio,
Dropdown,
Menu,
Row,
Col,
Timeline,
Checkbox,
BackTop,
Carousel,
Avatar,
Layout,
Breadcrumb,
Tooltip,
Steps,
Divider,
Card,
Skeleton,
AutoComplete,
InputNumber,
} from 'ant-design-vue';
import { ConfigProvider } from 'ant-design-vue';
Vue.component(ConfigProvider.name, ConfigProvider);
Vue.use(Pagination);
Vue.use(Button);
Vue.use(Input);
Vue.use(Modal);
Vue.use(Tag);
Vue.use(Table);
Vue.use(Tabs);
Vue.use(Icon);
Vue.use(Empty);
Vue.use(Form);
Vue.use(Select);
Vue.use(Upload);
Vue.use(Badge);
Vue.use(Popconfirm);
Vue.use(DatePicker);
Vue.use(Switch);
Vue.use(Radio);
Vue.use(Dropdown);
Vue.use(Menu);
Vue.use(Row);
Vue.use(Col);
Vue.use(Timeline);
Vue.use(Checkbox);
Vue.use(BackTop);
Vue.use(Carousel);
Vue.use(Avatar);
Vue.use(Layout);
Vue.use(Breadcrumb);
Vue.use(Tooltip);
Vue.use(Steps);
Vue.use(Divider);
Vue.use(Card);
Vue.use(Skeleton);
Vue.use(AutoComplete);
Vue.use(InputNumber);
Vue.prototype.$message = message;
Vue.prototype.$notification = notification;
Vue.prototype.$info = Modal.info;
Vue.prototype.$success = Modal.success;
Vue.prototype.$error = Modal.error;
Vue.prototype.$warning = Modal.warning;
Vue.prototype.$confirm = Modal.confirm;
message.config({
duration: 3,
maxCount: 3,
});

77
src/plugins/axios.js

@ -0,0 +1,77 @@
'use strict';
import Vue from 'vue';
import axios from 'axios';
import router from '../router/index';
import store from '../store/index';
// Full config: https://github.com/axios/axios#request-config
// axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
let config = {
// baseURL: process.env.baseURL || process.env.apiUrl || ""
timeout: 60 * 1000, // Timeout
// withCredentials: true, // Check cross-site Access-Control
};
const _axios = axios.create(config);
axios.interceptors.request.use(
function(config) {
let token = store.state.anyringToken || sessionStorage.getItem('anyringToken');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
function(error) {
// Do something with request error
return Promise.reject(error);
},
);
// Add a response interceptor
axios.interceptors.response.use(
function(response) {
if (response.data && response.data.code >= 400 && response.data.code < 500) {
store.commit('user/sign', '');
router.replace({
path: '/user/login',
query: { redirect: router.currentRoute.fullPath },
});
}
// Do something with response data
return response;
},
function(error) {
// Do something with response error
return Promise.reject(error);
},
);
Plugin.install = function(Vue) {
Vue.axios = _axios;
window.axios = _axios;
Object.defineProperties(Vue.prototype, {
axios: {
get() {
return _axios;
},
},
$axios: {
get() {
return _axios;
},
},
$http: {
get() {
return _axios;
},
},
});
};
Vue.use(Plugin);
export default Plugin;

34
src/registerServiceWorker.js

@ -0,0 +1,34 @@
/* eslint-disable no-console */
import { register } from "register-service-worker";
if (process.env.NODE_ENV === "production") {
register(`${process.env.BASE_URL}service-worker.js`, {
ready() {
console.log(
"App is being served from cache by a service worker.\n" +
"For more details, visit https://goo.gl/AFskqB"
);
},
registered() {
console.log("Service worker has been registered.");
},
cached() {
console.log("Content has been cached for offline use.");
},
updatefound() {
console.log("New content is downloading.");
},
updated() {
console.log("New content is available; please refresh.");
},
offline() {
console.log(
"No internet connection found. App is running in offline mode."
);
},
error(error) {
console.error("Error during service worker registration:", error);
}
});
}

84
src/router/index.js

@ -0,0 +1,84 @@
import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from 'views/FirstPages/FirstPage.vue';
// import Homes from 'views/FirstPages/FirstPages.vue';
Vue.use(VueRouter);
const routes = [
// 首页
{
path: '/',
name: 'Home',
component: Home,
},
// 新闻中心
{
path: '/news',
name: 'news',
component: () => import('@/views/NewPages/NewPages.vue'),
},
// 新闻中心
{
path: '/profile',
name: 'CompanyProfile',
component: () => import('@/views/CompanyProfile/CompanyProfile.vue'),
},
// 党的建设
{
path: '/building',
name: 'PartyBuilding',
component: () => import('@/views/OtherPages/PartyBuilding.vue'),
},
// 安全生产
{
path: '/production',
name: 'SafeProduction',
component: () => import('@/views/OtherPages/SafeProduction.vue'),
},
// 通知公告
{
path: '/notice',
name: 'NoticeNotice',
component: () => import('@/views/OtherPages/NoticeNotice.vue'),
},
// 信息公开
{
path: '/information',
name: 'Information',
component: () => import('@/views/OtherPages/Information.vue'),
},
// 信息公开
{
path: '/system',
name: 'System',
component: () => import('@/views/OtherPages/System.vue'),
},
// 部门首页
{
path: '/department',
name: 'Department',
component: () => import('@/views/OtherPages/Department.vue'),
},
// // 关于我们界面
// {
// path: '/About/Introduce',
// name: 'About',
// component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/About/About.vue'),
// children: [
// {
// path: '/About/Introduce',
// name: 'Introduce',
// component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/About/Children/Introduce.vue'),
// }
// ],
// },
];
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes,
});
export default router;

7
src/store/index.js

@ -0,0 +1,7 @@
import Vue from 'vue';
import Vuex from 'vuex';
import home from './modules/home/index';
import user from './modules/user/index';
Vue.use(Vuex);
export default new Vuex.Store({ modules: { home, user } });

46
src/store/modules/home/actions.js

@ -0,0 +1,46 @@
import axios from 'axios';
import { message } from 'ant-design-vue';
import { getContent, getDetail } from 'config/api';
const actions = {
/**
* 查询网站内容
* @param {any} commit
* @param {object} param 提交的参数
* 提交信息
*/
async getContent({ commit, rootState }, param) {
try {
const res = await getContent(param);
const { data, code, msg } = res.data;
if (code === 200) {
return data;
} else {
message.error(msg);
}
} catch (error) {
message.error('提交失败');
}
},
/**
* 官网内容详情查询
* @param {any} commit
* @param {object} param 提交的参数
* 提交信息
*/
async getDetail({ commit, rootState }, param) {
try {
const res = await getDetail(param);
const { data, code, msg } = res.data;
if (code === 200) {
return data;
} else {
message.error(msg);
}
} catch (error) {
message.error('提交失败');
}
},
};
export default actions;

7
src/store/modules/home/getters.js

@ -0,0 +1,7 @@
const getters = {};
// 域定制导航展示形式
// 0 -> 无特殊导航文字
// 1 -> 横向定制导航
// 2 -> 纵向定制导航
export default getters;

6
src/store/modules/home/index.js

@ -0,0 +1,6 @@
import mutations from './mutations';
import actions from './actions';
import state from './state';
import getters from './getters';
export default { namespaced: true, state, getters, mutations, actions };

13
src/store/modules/home/mutations.js

@ -0,0 +1,13 @@
import { List } from 'ant-design-vue';
const mutations = {
/**
* 设置登录人信息
* @param {object} state
* @param {object} userSer
*/
setUserSer(state, userSer) {
state.userSer = { ...userSer };
},
};
export default mutations;

6
src/store/modules/home/state.js

@ -0,0 +1,6 @@
const state = {
userSer: null, // 登录人信息
str: '',
};
export default state;

5
src/store/modules/user/actions.js

@ -0,0 +1,5 @@
// import axios from 'axios';
const actions = {};
export default actions;

7
src/store/modules/user/getters.js

@ -0,0 +1,7 @@
const getters = {};
// 域定制导航展示形式
// 0 -> 无特殊导航文字
// 1 -> 横向定制导航
// 2 -> 纵向定制导航
export default getters;

6
src/store/modules/user/index.js

@ -0,0 +1,6 @@
import mutations from './mutations';
import actions from './actions';
import state from './state';
import getters from './getters';
export default { namespaced: true, state, getters, mutations, actions };

33
src/store/modules/user/mutations.js

@ -0,0 +1,33 @@
const mutations = {
/**
* 设置token
* @param { object } state
* @param { string } token
*/
sign(state, token) {
state.anyringToken = token;
sessionStorage.setItem('anyringToken', token);
},
/**
* 设置user用户信息
* @param {object} state
* @param {object} user {id, account, phone}
*/
setUser(state, user) {
if (!user) return;
state.user = { ...user };
sessionStorage.setItem('user', JSON.stringify(user));
},
/**
* 图片验证码
* @param {object} state
* @param {object} picCode
*/
setPicCode(state, picCode) {
state.picCode = { ...picCode };
},
};
export default mutations;

7
src/store/modules/user/state.js

@ -0,0 +1,7 @@
const state = {
anyringToken: '',
user: { id: '', phone: '', account: '' },
picCode: null,
};
export default state;

88
src/views/CompanyProfile/CompanyProfile.vue

@ -0,0 +1,88 @@
<template>
<div class="content-1180">
<div class="d-flex mt-4">
<LeftNav :code="code" :list="list" class="mr-4" @chanegCode="chanegCode" />
<div class="flex-1 flex-column">
<Location />
<div class="content-detail p-4" :style="{ 'min-height': list.children.length * 56 + 'px' }">
<RichText :rich-obj="content" />
</div>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import LeftNav from '@/components/LeftNav/LeftNav.vue';
import RichText from '@/components/RichText/RichText.vue';
import Location from '@/components/Location/Location.vue';
export default {
components: { LeftNav, RichText, Location },
data() {
return {
code: '0101',
list: {
title: '公司概况',
url: '/profile',
children: [
{
title: '公司简介',
code: '0101',
},
{
title: '公司领导',
code: '0102',
},
{
title: '组织架构',
code: '0103',
},
{
title: '企业VI',
code: '0104',
},
{
title: '联系方式',
code: '0105',
},
],
},
content: {},
};
},
watch: {
'$route.query.code'(val) {
if (this.$route.path === this.list.url) {
this.code = val;
this.getData(this.code);
}
},
},
created() {
this.code = this.$route.query.code;
this.getData(this.code);
},
methods: {
...mapActions('home', ['getDetail']),
async getData(showPage) {
try {
const param = {
showPage,
introId: '',
};
const data = await this.getDetail(param);
this.content = data;
} catch (error) {}
},
chanegCode(code) {
this.code = code;
},
},
};
</script>
<style scoped>
.content-detail {
background: #fff;
}
</style>

353
src/views/FirstPages/FirstPage.vue

@ -0,0 +1,353 @@
<template>
<div class="content-1180">
<div class="news-box mt-4 d-flex justify-space-between">
<!-- 集团新闻 -->
<div class="flex-1 mr-4 p-4 flex-column">
<div class="new-box-title d-flex justify-space-between">
<div class="d-flex align-start">
<div class="icon-red mr-1" style="margin-top: 10px;"></div>
<div style="font-size:22px;color: #333;font-weight:600;margin-top:3px;">集团新闻</div>
</div>
<div class="d-flex align-center" style="height: 100%;cursor: pointer;" @click="openPage('news', '0201', '')">更多></div>
</div>
<div class="new-box-content d-flex flex-column justify-space-between pt-4">
<div class="d-flex" v-for="newContent in groupNews" :key="newContent.introId">
<div class="content-date">
<div class="content-date-day">{{ $moment(+newContent.publishTime).format('DD') }}</div>
<div class="content-date-year">{{ $moment(+newContent.publishTime).format('YYYY-MM') }}</div>
</div>
<div class="flex-1 new-box-content-jj" @click="openPage('news', '0201', newContent.introId)">{{ newContent.title }}</div>
</div>
</div>
</div>
<!-- 省公司新闻 -->
<div class="flex-1 mr-4 p-4 flex-column">
<div class="new-box-title d-flex justify-space-between">
<div class="d-flex align-start">
<div class="icon-red mr-1" style="margin-top: 10px;"></div>
<div style="font-size:22px;color: #333;font-weight:600;margin-top:3px;">省公司新闻</div>
</div>
<div class="d-flex align-center" style="height: 100%;cursor: pointer;" @click="openPage('news', '0202', '')">更多></div>
</div>
<div class="new-box-content d-flex flex-column justify-space-between pt-4">
<div class="d-flex" v-for="newContent in provincialNews" :key="newContent.introId">
<div class="content-date">
<div class="content-date-day">{{ $moment(+newContent.publishTime).format('DD') }}</div>
<div class="content-date-year">{{ $moment(+newContent.publishTime).format('YYYY-MM') }}</div>
</div>
<div class="flex-1 new-box-content-jj" @click="openPage('news', '0202', newContent.introId)">{{ newContent.title }}</div>
</div>
</div>
</div>
<!-- 公司新闻 -->
<div class="flex-1 p-4 flex-column">
<div class="new-box-title d-flex justify-space-between">
<div class="d-flex align-start">
<div class="icon-red mr-1" style="margin-top: 10px;"></div>
<div style="font-size:22px;color: #333;font-weight:600;margin-top:3px;">公司新闻</div>
</div>
<div class="d-flex align-center" style="height: 100%;cursor: pointer;" @click="openPage('news', '0203', '')">更多></div>
</div>
<div class="new-box-content d-flex flex-column justify-space-between pt-4">
<div class="d-flex" v-for="newContent in companyNews" :key="newContent.introId">
<div class="content-date">
<div class="content-date-day">{{ $moment(+newContent.publishTime).format('DD') }}</div>
<div class="content-date-year">{{ $moment(+newContent.publishTime).format('YYYY-MM') }}</div>
</div>
<div class="flex-1 new-box-content-jj" @click="openPage('news', '0203', newContent.introId)">{{ newContent.title }}</div>
</div>
</div>
</div>
</div>
<!-- 图片新闻 -->
<div class="news-img p-4 mt-4 d-flex flex-column">
<div class="new-box-title d-flex justify-space-between">
<div class="d-flex align-start">
<div class="icon-red mr-1" style="margin-top: 10px;"></div>
<div style="font-size:22px;color: #333;font-weight:600;margin-top:3px;">图片新闻</div>
</div>
<div class="d-flex align-center" style="height: 100%;cursor: pointer;" @click="openPage('news', '0204', '')">更多></div>
</div>
<div class="flex-1 flex-column justify-space-between mt-4">
<div class="flex-1">
<div class="flex-1 mr-4">
<a-carousel style="width: 650px" autoplay>
<div class="rotation-box" v-for="newContent in ImgNews1" :key="newContent.introId">
<img :src="newContent.titleUrl" style="height: 369.5px;width: 100%" alt="" />
<div class="rotation-div one-text">
{{ newContent.title }}
</div>
</div>
</a-carousel>
</div>
<div class="news-img-content d-flex flex-column justify-space-between p-4">
<div class="d-flex" v-for="newContent in ImgNews1" :key="newContent.introId">
<div class="content-date">
<div class="content-date-day">{{ $moment(+newContent.publishTime).format('DD') }}</div>
<div class="content-date-year">{{ $moment(+newContent.publishTime).format('YYYY-MM') }}</div>
</div>
<div class="flex-1 new-box-content-jj" @click="openPage('news', '0201', newContent.introId)">{{ newContent.title }}</div>
</div>
</div>
</div>
<div class="flex-1 mt-4">
<div class="news-img-content d-flex flex-column justify-space-between p-4">
<div class="d-flex" v-for="newContent in ImgNews2" :key="newContent.introId">
<div class="content-date">
<div class="content-date-day">{{ $moment(+newContent.publishTime).format('DD') }}</div>
<div class="content-date-year">{{ $moment(+newContent.publishTime).format('YYYY-MM') }}</div>
</div>
<div class="flex-1 new-box-content-jj" @click="openPage('news', '0202', newContent.introId)">{{ newContent.title }}</div>
</div>
</div>
<div class="flex-1">
<a-carousel style="width: 650px" autoplay>
<div class="rotation-box" v-for="newContent in ImgNews2" :key="newContent.introId">
<img :src="newContent.titleUrl" style="height: 369.5px;width: 100%" alt="" />
<div class="rotation-div one-text">
{{ newContent.title }}
</div>
</div>
</a-carousel>
</div>
</div>
<div class="flex-1 mt-4">
<div class="flex-1 mr-4">
<a-carousel style="width: 650px" autoplay>
<div class="rotation-box" v-for="newContent in ImgNews3" :key="newContent.introId">
<img :src="newContent.titleUrl" style="height: 369.5px;width: 100%" alt="" />
<div class="rotation-div one-text">
{{ newContent.title }}
</div>
</div>
</a-carousel>
</div>
<div class="news-img-content d-flex flex-column justify-space-between p-4">
<div class="d-flex" v-for="newContent in ImgNews3" :key="newContent.introId">
<div class="content-date">
<div class="content-date-day">{{ $moment(+newContent.publishTime).format('DD') }}</div>
<div class="content-date-year">{{ $moment(+newContent.publishTime).format('YYYY-MM') }}</div>
</div>
<div class="flex-1 new-box-content-jj" @click="openPage('news', '0203', newContent.introId)">{{ newContent.title }}</div>
</div>
</div>
</div>
</div>
</div>
<!-- 职工风采 -->
<div class="news-demeanor mt-4 p-4 d-flex flex-column">
<div class="new-box-title d-flex justify-space-between">
<div class="d-flex align-start">
<div class="icon-red mr-1" style="margin-top: 10px;"></div>
<div style="font-size:22px;color: #333;font-weight:600;margin-top:3px;">职工风采</div>
</div>
<div class="d-flex align-center" style="height: 100%;cursor: pointer;" @click="openPage('news', '0210', '')">更多></div>
</div>
<div class="mt-4" style="overflow: hidden;">
<div class="demeanor-content-box">
<div class="demeanor-content mr-4" v-for="item in sceneStyle" :key="item.introId" @click="openPage('news', '0210', item.introId)">
<img :src="item.titleUrl" style="height:260px;width:100%;cursor: pointer;" :title="item.title" />
<div class="one-text-1">
{{ item.title }}
</div>
</div>
<div
class="demeanor-content mr-4"
v-for="item in sceneStyle"
:key="item.introId + '1'"
@click="openPage('news', '0210', item.introId)"
>
<img :src="item.titleUrl" style="height:260px;width:100%;cursor: pointer;" :title="item.title" />
<div class="one-text-1">
{{ item.title }}
</div>
</div>
</div>
</div>
</div>
<BayWindow />
</div>
</template>
<script>
import { mapActions } from 'vuex';
import BayWindow from '@/components/BayWindow/BayWindow.vue';
export default {
components: { BayWindow },
data() {
return {
groupNews: [],
companyNews: [],
provincialNews: [],
ImgNews1: [],
ImgNews2: [],
ImgNews3: [],
sceneStyle: [],
};
},
created() {
this.getData('0201', 'groupNews', '0');
this.getData('0202', 'provincialNews', '0');
this.getData('0203', 'companyNews', '0');
this.getData('0201', 'ImgNews1', '1');
this.getData('0202', 'ImgNews2', '1');
this.getData('0203', 'ImgNews3', '1');
this.getData('0210', 'sceneStyle', '1');
},
methods: {
...mapActions('home', ['getContent']),
async getData(showPage, list, showType) {
try {
const param = {
showPage,
year: '',
showType,
pageNum: 1,
pageSize: 5,
};
const res = await this.getContent(param);
this[list] = res.list;
} catch (error) {
console.log('error: ', error);
}
},
//
openPage(path, code, id) {
window.open(`${window.location.href}${path}?code=${code}&introId=${id}`);
},
},
};
</script>
<style scoped>
.demeanor-content-box {
white-space: nowrap;
overflow: hidden;
height: 308px;
animation: 20s move infinite linear;
}
.demeanor-content-box:hover {
animation-play-state: paused; /*动画暂停播放*/
}
@-webkit-keyframes move {
0% {
margin-left: 0;
}
100% {
margin-left: -1940px;
}
}
@keyframes move {
0% {
margin-left: 0;
}
100% {
margin-left: -1940px;
}
}
.one-text-1 {
width: 100%;
height: 48px;
line-height: 48px;
font-size: 16px;
color: rgb(51, 51, 51);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
cursor: pointer;
transition: all 0.5s;
}
.one-text-1:hover {
color: #b61412;
}
.rotation-box {
position: relative;
}
.rotation-div {
position: absolute;
bottom: 0;
width: 100%;
height: 42px;
line-height: 42px;
background-color: #b61412;
color: #fff;
font-size: 16px;
padding: 0 16px;
z-index: 10;
}
.demeanor-content {
display: inline-block;
width: 372px;
height: 100%;
}
.news-img-content {
width: 482px;
height: 100%;
background: rgb(245, 245, 245);
}
/deep/.ant-carousel .slick-dots li button {
height: 10px !important;
width: 10px !important;
border-radius: 50%;
}
.ant-carousel >>> .slick-slide {
text-align: center;
height: 369.5px;
/* line-height: 428px; */
overflow: hidden;
}
.new-box-content-jj {
font-size: 14px;
margin-left: 16px;
cursor: pointer;
}
.content-date {
height: 56px;
width: 56px;
background-color: #b61412;
color: #fff;
border-radius: 4px;
padding: 4px;
}
.content-date-day {
height: 50%;
border-bottom: 1px solid #fff;
font-size: 16px;
font-weight: bold;
text-align: center;
}
.content-date-year {
height: 50%;
font-size: 12px;
line-height: 28px;
text-align: center;
color: rgba(232, 232, 232, 0.8);
}
.new-box-content {
height: 100%;
}
.icon-red {
width: 4px;
height: 22px;
background: #b61412;
}
.new-box-title {
height: 46px;
width: 100%;
border-bottom: 1px solid #333;
}
.news-box {
height: 518px;
}
.news-box > div {
background-color: #fff;
}
.news-img {
height: 1240px;
background-color: #fff;
}
.news-demeanor {
height: 402px;
background-color: #fff;
}
</style>

145
src/views/NewPages/NewPages.vue

@ -0,0 +1,145 @@
<template>
<div class="content-1180">
<div class="d-flex mt-4">
<LeftNav :code="code" :list="list" class="mr-4" @chanegCode="chanegCode" />
<div class="flex-1 flex-column">
<Location />
<div class="content-detail p-4" :style="{ 'min-height': list.children.length * 56 + 'px' }">
<ListPage v-if="!introId" :code="code" @changeYear="changeYear" :content="content" @getData="getData" />
<RichText v-else :rich-obj="introContent" />
</div>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import LeftNav from '@/components/LeftNav/LeftNav.vue';
import ListPage from '@/components/ListPage/ListPage.vue';
import RichText from '@/components/RichText/RichText.vue';
import Location from '@/components/Location/Location.vue';
export default {
components: { LeftNav, ListPage, Location, RichText },
data() {
return {
code: '0201',
list: {
title: '新闻中心',
url: '/news',
children: [
{
title: '集团新闻',
code: '0201',
},
{
title: '省公司新闻',
code: '0202',
},
{
title: '公司新闻',
code: '0203',
},
{
title: '图片新闻',
code: '0204',
},
{
title: '热点专题',
code: '0205',
},
{
title: '媒体关注',
code: '0206',
},
{
title: '视频新闻',
code: '0207',
},
{
title: '专题片',
code: '0208',
},
{
title: '企业画册',
code: '0209',
},
{
title: '现场风采',
code: '0210',
},
],
},
year: '2020',
content: {},
pageNum: 1,
introId: '',
introContent: {},
};
},
watch: {
'$route.query.code'(val) {
if (this.$route.path === this.list.url) {
this.code = val;
this.getContentData();
}
},
},
created() {
this.code = this.$route.query.code;
if (this.$route.query.introId) {
this.introId = this.$route.query.introId;
this.getIntroContent();
}
this.getContentData();
},
methods: {
...mapActions('home', ['getContent', 'getDetail']),
async getContentData() {
try {
const param = {
showPage: this.code,
year: this.year,
showType: '1',
pageNum: this.pageNum,
pageSize: 10,
};
const data = await this.getContent(param);
console.log('data: ', data);
this.content = data;
} catch (error) {}
},
//
async getIntroContent() {
try {
const param = {
showPage: '',
introId: this.introId,
};
const data = await this.getDetail(param);
this.introContent = data;
} catch (error) {
console.error('error: ', error);
}
},
chanegCode(code) {
this.code = code;
this.introId = '';
},
changeYear(year) {
this.year = year;
this.getContentData();
},
getData(pageNum) {
console.log('pageNum: ', pageNum);
this.pageNum = pageNum;
this.getContentData();
},
},
};
</script>
<style scoped>
.content-detail {
background: #fff;
}
</style>

132
src/views/OtherPages/Department.vue

@ -0,0 +1,132 @@
<template>
<div class="content-1180">
<div class="d-flex mt-4">
<LeftNav :code="code" :list="list" class="mr-4" @chanegCode="chanegCode" />
<div class="flex-1 flex-column">
<Location />
<div class="content-detail p-4" :style="{ 'min-height': list.children.length * 56 + 'px' }">
<RichText :rich-obj="content" />
</div>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import LeftNav from '@/components/LeftNav/LeftNav.vue';
import RichText from '@/components/RichText/RichText.vue';
import Location from '@/components/Location/Location.vue';
export default {
components: { LeftNav, RichText, Location },
data() {
return {
code: '0901',
list: {
title: '部门首页',
url: '/department',
children: [
{
title: '总经理工作部',
code: '0901',
},
{
title: '计划营销部',
code: '0902',
},
{
title: '财务管理部',
code: '0903',
},
{
title: '人力资源部',
code: '0904',
},
{
title: '党群工作部',
code: '0905',
},
{
title: '纪委办公室(审计部)',
code: '0906',
},
{
title: '燃料采购部',
code: '0907',
},
{
title: '物资管理部',
code: '0908',
},
{
title: '项目开发部',
code: '0909',
},
{
title: '燃料质量验收部',
code: '0910',
},
{
title: '安全监督部',
code: '0911',
},
{
title: '设备部',
code: '0912',
},
{
title: '发电部',
code: '0913',
},
{
title: '维护部',
code: '0914',
},
{
title: '热工专业',
code: '0915',
},
{
title: '电气专业',
code: '0916',
},
],
},
content: {},
};
},
watch: {
'$route.query.code'(val) {
if (this.$route.path === this.list.url) {
this.code = val;
this.getData(this.code);
}
},
},
created() {
this.code = this.$route.query.code;
this.getData(this.code);
},
methods: {
...mapActions('home', ['getDetail']),
async getData(showPage) {
try {
const param = {
showPage,
introId: '',
};
const data = await this.getDetail(param);
this.content = data;
} catch (error) {}
},
chanegCode(code) {
this.code = code;
},
},
};
</script>
<style scoped>
.content-detail {
background: #fff;
}
</style>

88
src/views/OtherPages/Information.vue

@ -0,0 +1,88 @@
<template>
<div class="content-1180">
<div class="d-flex mt-4">
<LeftNav :code="code" :list="list" class="mr-4" @chanegCode="chanegCode" />
<div class="flex-1 flex-column">
<Location />
<div class="content-detail p-4" :style="{ 'min-height': list.children.length * 56 + 'px' }">
<RichText :rich-obj="content" />
</div>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import LeftNav from '@/components/LeftNav/LeftNav.vue';
import RichText from '@/components/RichText/RichText.vue';
import Location from '@/components/Location/Location.vue';
export default {
components: { LeftNav, RichText, Location },
data() {
return {
code: '0601',
list: {
title: '信息公开',
url: '/information',
children: [
{
title: '基本信息',
code: '0601',
},
{
title: '经营管理',
code: '0602',
},
{
title: '公司公告',
code: '0603',
},
{
title: '社会责任',
code: '0604',
},
{
title: '关于信息公开',
code: '0605',
},
],
},
content: {},
};
},
watch: {
'$route.query.code'(val) {
if (this.$route.path === this.list.url) {
this.code = val;
this.getData(this.code);
}
},
},
created() {
this.code = this.$route.query.code;
this.getData(this.code);
},
methods: {
...mapActions('home', ['getDetail']),
async getData(showPage) {
try {
const param = {
showPage,
introId: '',
};
const data = await this.getDetail(param);
this.content = data;
} catch (error) {}
},
chanegCode(code) {
this.code = code;
},
},
};
</script>
<style scoped>
.content-detail {
background: #fff;
}
</style>

124
src/views/OtherPages/NoticeNotice.vue

@ -0,0 +1,124 @@
<template>
<div class="content-1180">
<div class="d-flex mt-4">
<LeftNav :code="code" :list="list" class="mr-4" @chanegCode="chanegCode" />
<div class="flex-1 flex-column">
<Location />
<div class="content-detail p-4" :style="{ 'min-height': list.children.length * 56 + 'px' }">
<ListPage v-if="!introId" :code="code" @changeYear="changeYear" :content="content" @getData="getData" />
<RichText v-else :rich-obj="introContent" />
</div>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import LeftNav from '@/components/LeftNav/LeftNav.vue';
import ListPage from '@/components/ListPage/ListPage.vue';
import RichText from '@/components/RichText/RichText.vue';
import Location from '@/components/Location/Location.vue';
export default {
components: { LeftNav, ListPage, Location, RichText },
data() {
return {
code: '0501',
list: {
title: '通知公告',
url: '/notice',
children: [
{
title: '通知',
code: '0501',
},
{
title: '通报',
code: '0502',
},
{
title: '公告',
code: '0503',
},
{
title: '值班安排',
code: '0504',
},
{
title: '浮窗',
code: '0505',
},
],
},
year: '2020',
content: {},
pageNum: 1,
introId: '',
introContent: {},
};
},
watch: {
'$route.query.code'(val) {
if (this.$route.path === this.list.url) {
this.code = val;
this.getContentData();
}
},
},
created() {
this.code = this.$route.query.code;
if (this.$route.query.introId) {
this.introId = this.$route.query.introId;
this.getIntroContent();
}
this.getContentData();
},
methods: {
...mapActions('home', ['getContent', 'getDetail']),
async getContentData() {
try {
const param = {
showPage: this.code,
year: this.year,
showType: '1',
pageNum: this.pageNum,
pageSize: 10,
};
const data = await this.getContent(param);
this.content = data;
} catch (error) {}
},
//
async getIntroContent() {
try {
const param = {
showPage: '',
introId: this.introId,
};
const data = await this.getDetail(param);
this.introContent = data;
} catch (error) {
console.error('error: ', error);
}
},
chanegCode(code) {
this.code = code;
this.introId = '';
},
changeYear(year) {
this.year = year;
this.getContentData();
},
getData(pageNum) {
console.log('pageNum: ', pageNum);
this.pageNum = pageNum;
this.getContentData();
},
},
};
</script>
<style scoped>
.content-detail {
background: #fff;
}
</style>

128
src/views/OtherPages/PartyBuilding.vue

@ -0,0 +1,128 @@
<template>
<div class="content-1180">
<div class="d-flex mt-4">
<LeftNav :code="code" :list="list" class="mr-4" @chanegCode="chanegCode" />
<div class="flex-1 flex-column">
<Location />
<div class="content-detail p-4" :style="{ 'min-height': list.children.length * 56 + 'px' }">
<ListPage v-if="!introId" :code="code" @changeYear="changeYear" :content="content" @getData="getData" />
<RichText v-else :rich-obj="introContent" />
</div>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import LeftNav from '@/components/LeftNav/LeftNav.vue';
import ListPage from '@/components/ListPage/ListPage.vue';
import RichText from '@/components/RichText/RichText.vue';
import Location from '@/components/Location/Location.vue';
export default {
components: { LeftNav, ListPage, Location, RichText },
data() {
return {
code: '0301',
list: {
title: '党的建设',
url: '/building',
children: [
{
title: '中心组学习',
code: '0301',
},
{
title: '示范党委',
code: '0302',
},
{
title: '党支部达标',
code: '0303',
},
{
title: '群团工作',
code: '0304',
},
{
title: '党建动态',
code: '0305',
},
{
title: '党风廉政',
code: '0306',
},
],
},
year: '2020',
content: {},
pageNum: 1,
introId: '',
introContent: {},
};
},
watch: {
'$route.query.code'(val) {
if (this.$route.path === this.list.url) {
this.code = val;
this.getContentData();
}
},
},
created() {
this.code = this.$route.query.code;
if (this.$route.query.introId) {
this.introId = this.$route.query.introId;
this.getIntroContent();
}
this.getContentData();
},
methods: {
...mapActions('home', ['getContent', 'getDetail']),
async getContentData() {
try {
const param = {
showPage: this.code,
year: this.year,
showType: '1',
pageNum: this.pageNum,
pageSize: 10,
};
const data = await this.getContent(param);
this.content = data;
} catch (error) {}
},
//
async getIntroContent() {
try {
const param = {
showPage: '',
introId: this.introId,
};
const data = await this.getDetail(param);
this.introContent = data;
} catch (error) {
console.error('error: ', error);
}
},
chanegCode(code) {
this.code = code;
this.introId = '';
},
changeYear(year) {
this.year = year;
this.getContentData();
},
getData(pageNum) {
console.log('pageNum: ', pageNum);
this.pageNum = pageNum;
this.getContentData();
},
},
};
</script>
<style scoped>
.content-detail {
background: #fff;
}
</style>

124
src/views/OtherPages/SafeProduction.vue

@ -0,0 +1,124 @@
<template>
<div class="content-1180">
<div class="d-flex mt-4">
<LeftNav :code="code" :list="list" class="mr-4" @chanegCode="chanegCode" />
<div class="flex-1 flex-column">
<Location />
<div class="content-detail p-4" :style="{ 'min-height': list.children.length * 56 + 'px' }">
<ListPage v-if="!introId" :code="code" @changeYear="changeYear" :content="content" @getData="getData" />
<RichText v-else :rich-obj="introContent" />
</div>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import LeftNav from '@/components/LeftNav/LeftNav.vue';
import ListPage from '@/components/ListPage/ListPage.vue';
import RichText from '@/components/RichText/RichText.vue';
import Location from '@/components/Location/Location.vue';
export default {
components: { LeftNav, ListPage, Location, RichText },
data() {
return {
code: '0401',
list: {
title: '安全生产',
url: 'production',
children: [
{
title: '安全会议',
code: '0401',
},
{
title: '安全生产记录',
code: '0402',
},
{
title: '应急管理',
code: '0403',
},
{
title: '三讲一落实',
code: '0404',
},
{
title: '曝光台',
code: '0405',
},
],
},
year: '2020',
content: {},
pageNum: 1,
introId: '',
introContent: {},
};
},
watch: {
'$route.query.code'(val) {
if (this.$route.path === this.list.url) {
this.code = val;
this.getContentData();
}
},
},
created() {
this.code = this.$route.query.code;
if (this.$route.query.introId) {
this.introId = this.$route.query.introId;
this.getIntroContent();
}
this.getContentData();
},
methods: {
...mapActions('home', ['getContent', 'getDetail']),
async getContentData() {
try {
const param = {
showPage: this.code,
year: this.year,
showType: '1',
pageNum: this.pageNum,
pageSize: 10,
};
const data = await this.getContent(param);
this.content = data;
} catch (error) {}
},
//
async getIntroContent() {
try {
const param = {
showPage: '',
introId: this.introId,
};
const data = await this.getDetail(param);
this.introContent = data;
} catch (error) {
console.error('error: ', error);
}
},
chanegCode(code) {
this.code = code;
this.introId = '';
},
changeYear(year) {
this.year = year;
this.getContentData();
},
getData(pageNum) {
console.log('pageNum: ', pageNum);
this.pageNum = pageNum;
this.getContentData();
},
},
};
</script>
<style scoped>
.content-detail {
background: #fff;
}
</style>

100
src/views/OtherPages/System.vue

@ -0,0 +1,100 @@
<template>
<div class="content-1180">
<div class="d-flex mt-4">
<LeftNav :code="code" :list="list" class="mr-4" @chanegCode="chanegCode" />
<div class="flex-1 flex-column">
<Location />
<div class="content-detail p-4" :style="{ 'min-height': list.children.length * 56 + 'px' }">
<RichText :rich-obj="content" />
</div>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import LeftNav from '@/components/LeftNav/LeftNav.vue';
import RichText from '@/components/RichText/RichText.vue';
import Location from '@/components/Location/Location.vue';
export default {
components: { LeftNav, RichText, Location },
data() {
return {
code: '0801',
list: {
title: '制度资料',
url: '/system',
children: [
{
title: '集团公司制度',
code: '0801',
},
{
title: '山西公司制度',
code: '0802',
},
{
title: '行业标准与制度',
code: '0803',
},
{
title: '公司制度',
code: '0804',
},
{
title: '地方规章',
code: '0805',
},
{
title: '培训课件',
code: '0806',
},
{
title: '培训影像',
code: '0807',
},
{
title: '科技创新',
code: '0808',
},
],
},
content: {},
};
},
watch: {
'$route.query.code'(val) {
if (this.$route.path === this.list.url) {
this.code = val;
this.getData(this.code);
}
},
},
created() {
this.code = this.$route.query.code;
this.getData(this.code);
},
methods: {
...mapActions('home', ['getDetail']),
async getData(showPage) {
try {
const param = {
showPage,
introId: '',
};
const data = await this.getDetail(param);
this.content = data;
} catch (error) {}
},
chanegCode(code) {
this.code = code;
},
},
};
</script>
<style scoped>
.content-detail {
background: #fff;
}
</style>

133
vue.config.js

@ -0,0 +1,133 @@
const path = require('path');
const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg|ttf|woff|woff2)(\?.*)?$/i;
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const resolve = dir => path.join(__dirname, dir);
const isPro = process.env.VUE_APP_NODE_ENV === 'production';
const publicPath = process.env.VUE_APP_PUBLIC_PATH;
const proxyUrl = process.env.VUE_APP_PROXY_URL;
const apiUrl = process.env.VUE_APP_API_URL;
const title = process.env.VUE_APP_TITLE;
// console.log('proxyUrl: ', proxyUrl);
// console.log('apiUrl: ', apiUrl);
// 本地环境是否需要使用cdn
const devNeedCdn = true;
// cdn 链接及配置
const cdn = {
css: [
'https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css',
'https://cdn.bootcdn.net/ajax/libs/ant-design-vue/1.6.5/antd.min.css',
],
js: [
isPro ? 'https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js' : 'https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js',
'https://cdn.bootcdn.net/ajax/libs/vue-router/3.4.3/vue-router.min.js',
'https://cdn.bootcdn.net/ajax/libs/vuex/3.5.1/vuex.min.js',
'https://cdn.bootcdn.net/ajax/libs/moment.js/2.9.0/moment.min.js',
'https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.20/lodash.min.js',
'https://cdn.bootcdn.net/ajax/libs/axios/0.20.0/axios.min.js',
'https://cdn.bootcdn.net/ajax/libs/ant-design-vue/1.6.5/antd.min.js',
],
// externals: {
// vue: 'Vue',
// vuex: 'Vuex',
// 'vue-router': 'VueRouter',
// moment: 'moment',
// axios: 'axios',
// 'ant-design-vue': 'antd',
// lodash: '_',
// },
};
module.exports = {
lintOnSave: true,
publicPath: isPro ? publicPath : '/',
devServer: {
open: true,
overlay: {
warnings: false,
errors: true,
},
proxy: {
[proxyUrl]: {
target: apiUrl, // 代理接口
changeOrigin: true,
pathRewrite: { [`^${proxyUrl}`]: '' },
},
},
},
productionSourceMap: false, // 去掉生产环境的sourcemap 加快构建速度
configureWebpack: {
// provide the app's title in webpack's name field, so that
// it can be accessed in index.html to inject the correct title.
name: title,
resolve: {
alias: {
'~': __dirname,
'@': resolve('src'),
assets: resolve('src/assets'),
views: resolve('src/views'),
components: resolve('src/components'),
common: resolve('src/common'),
config: resolve('src/config'),
router: resolve('src/router'),
store: resolve('src/store'),
util: resolve('src/util'),
request: resolve('src/request'),
},
},
plugins: isPro
? [
new CompressionWebpackPlugin({
test: productionGzipExtensions,
threshold: 10240,
deleteOriginalAssets: false,
}),
]
: [],
externals: isPro || devNeedCdn ? cdn.externals : {},
},
chainWebpack(config) {
if (isPro) {
config.optimization
.runtimeChunk('single')
.minimize(true)
.splitChunks({
chunks: 'all',
maxInitialRequests: Infinity,
minSize: 20000, // 依赖包超过20000bit将被单独打包
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name(module) {
// get the name. E.g. node_modules/packageName/not/this/part.js
// or node_modules/packageName
const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
// npm package names are URL-safe, but some servers don't like @ symbols
return `npm.${packageName.replace('@', '')}`;
},
},
},
});
}
// set svg-sprite-loader
// config.module
// .rule('svg')
// .exclude.add(resolve('src/icons'))
// .end();
// config.module
// .rule('icons')
// .test(/\.svg$/)
// .include.add(resolve('src/icons'))
// .end()
// .use('svg-sprite-loader')
// .loader('svg-sprite-loader')
// .options({ symbolId: 'icon-[name]' })
// .end();
},
};

10020
yarn.lock

File diff suppressed because it is too large
Loading…
Cancel
Save