Compare commits

...

3 Commits

Author SHA1 Message Date
hush_goup 17cf3cf4b1 code commit 2025-03-10 18:20:42 +08:00
hush_goup 04ee7f7549 Merge branch 'main' of http://183.238.1.242:3000/rzzn/Portal 2025-03-10 18:18:43 +08:00
hush_goup 1f13adbef3 fisrt commit 2025-03-10 17:41:02 +08:00
1646 changed files with 144688 additions and 0 deletions

View File

@ -0,0 +1,29 @@
spring:
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
cloud:
sentinel:
enabled: true
transport:
dashboard: localhost:8180
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
feign:
sentinel:
enabled: true
client:
config:
default:
loggerLevel: FULL
httpclient:
enabled: true
ribbon:
ReadTimeout: 300000
ConnectTimeout: 300000

View File

@ -0,0 +1,58 @@
spring:
servlet:
multipart:
max-file-size: -1
max-request-size: -1
redis:
host: 192.168.1.197
port: 6379
database: 0
password: menhu@123
timeout: 30s
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.197:3306/portal?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: menhu@123
initial-size: 2
max-active: 5
min-idle: 2
max-wait: 6000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 5
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
test-while-idle: true
test-on-borrow: false
test-on-return: false
filter:
stat:
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: false
wall:
config:
multi-statement-allow: true
rabbitmq:
host: 192.168.1.197
port: 5672
username: admin
password: menhu@123
publisher-returns: true
listener:
simple:
acknowledge-mode: manual
prefetch: 5
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
typeAliasesPackage: com.dkha.entity
global-config:
db-config:
id-type: ID_WORKER
banner: false
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
jdbc-type-for-null: 'null'

View File

@ -0,0 +1,200 @@
[
{
"remark": "认证服务",
"id": "dkha-auth-server",
"uri": "lb://dkha-auth-server",
"order": "1",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/auth/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"StripPrefix": 0
}
}
]
},
{
"remark": "Admin服务",
"id": "dkha-admin-server",
"uri": "lb://dkha-admin-server",
"order": "2",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/sys/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"StripPrefix": 0
}
}
]
},
{
"remark": "监控服务",
"id": "dkha-monitor-server",
"uri": "lb://dkha-monitor-server",
"order": "3",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/monitor/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"StripPrefix": 0
}
}
]
},
{
"remark": "OSS服务",
"id": "dkha-oss-server",
"uri": "lb://dkha-oss-server",
"order": "4",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/oss/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"StripPrefix": 0
}
}
]
},
{
"remark": "消息服务",
"id": "dkha-message-server",
"uri": "lb://dkha-message-server",
"order": "5",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/message/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"StripPrefix": 0
}
}
]
},
{
"remark": "工作流服务",
"id": "dkha-activiti-server",
"uri": "lb://dkha-activiti-server",
"order": "6",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/activiti/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"StripPrefix": 0
}
}
]
},
{
"remark": "定时任务服务",
"id": "dkha-job-server",
"uri": "lb://dkha-job-server",
"order": "7",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/job/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"StripPrefix": 0
}
}
]
},
{
"remark": "APP流服务",
"id": "dkha-api-server",
"uri": "lb://dkha-api-server",
"order": "8",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/api/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"StripPrefix": 0
}
}
]
},
{
"remark": "门户网站",
"id": "dkha-portal-server",
"uri": "lb://dkha-portal-server",
"order": "9",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/portal/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"StripPrefix": 0
}
}
]
}
]

View File

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

View File

@ -0,0 +1,5 @@
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true

View File

@ -0,0 +1,4 @@
NODE_ENV = development
VUE_APP_NODE_ENV = dev
VUE_APP_BASE_URL = 'http://192.168.1.133'
VUE_APP_SERVER_URL = 'http://192.168.1.133'

View File

@ -0,0 +1,4 @@
NODE_ENV = production
VUE_APP_NODE_ENV = prod
VUE_APP_BASE_URL = 'http://127.0.0.1'
VUE_APP_SERVER_URL = 'http://192.168.1.133'

View File

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

23
portal_client/.gitignore vendored Normal file
View File

@ -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?

View File

@ -0,0 +1,7 @@
{
"printWidth": 80,
"tabWidth": 2,
"singleQuote": true,
"semi": false,
"htmlWhitespaceSensitivity": "ignore"
}

24
portal_client/README.md Normal file
View File

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

View File

@ -0,0 +1,10 @@
// 项目发布阶段需要用到的babel插件
const prodPlugins = []
if (process.env.NODE_ENV === 'production') {
prodPlugins.push('transform-remove-console')
}
module.exports = {
presets: ['@vue/cli-plugin-babel/preset'],
plugins: [...prodPlugins]
}

14629
portal_client/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
{
"name": "portal_client",
"version": "1.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"serve:dev": "vue-cli-service build --mode development",
"build:prod": "vue-cli-service build --mode production",
"lint": "vue-cli-service lint"
},
"dependencies": {
"core-js": "^3.6.5",
"element-ui": "^2.4.5",
"less-loader": "^6.0.0",
"quill": "^1.3.7",
"vue": "^2.6.11",
"vue-lazyload": "^1.3.3",
"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-router": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/eslint-config-standard": "^5.1.2",
"axios": "^0.21.1",
"babel-eslint": "^10.1.0",
"babel-plugin-transform-remove-console": "^6.9.4",
"eslint": "^6.7.2",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.0",
"eslint-plugin-vue": "^6.2.2",
"node-sass": "^4.12.0",
"sass-loader": "^8.0.2",
"vue-cli-plugin-element": "^1.0.1",
"vue-template-compiler": "^2.6.11"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1626240865067" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12783" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M194.97 566.272V747.52L512 919.552 829.03 747.52V566.477L512 738.509 194.97 566.272zM512 104.448L13.926 376.218 512 647.782l407.552-221.798v312.525h90.522V376.218L512 104.448z" p-id="12784" fill="#172B4D"></path></svg>

After

Width:  |  Height:  |  Size: 596 B

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1626241025270" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14725" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M390.827 562.59c-113.17 0-205.242-92.071-205.242-205.242s92.071-205.241 205.242-205.241 205.241 92.071 205.241 205.241-92.07 205.242-205.241 205.242z m0-346.483c-77.881 0-141.242 63.36-141.242 141.241S312.946 498.59 390.827 498.59s141.241-63.361 141.241-141.242-63.36-141.241-141.241-141.241z" fill="#172B4D" p-id="14726"></path><path d="M668.021 869.327c-17.673 0-32-14.327-32-32 0-150.662-109.993-273.235-245.193-273.235S145.633 686.665 145.633 837.327c0 17.673-14.327 32-32 32s-32-14.327-32-32c0-89.503 31.785-173.795 89.499-237.348 28.333-31.199 61.402-55.729 98.288-72.909 38.437-17.901 79.284-26.979 121.407-26.979s82.97 9.077 121.407 26.979c36.886 17.18 69.955 41.71 98.288 72.909 57.715 63.553 89.499 147.845 89.499 237.348 0 17.673-14.328 32-32 32zM630.633 567.59c-17.673 0-32-14.327-32-32s14.327-32 32-32c77.881 0 141.242-63.361 141.242-141.242s-63.361-141.241-141.242-141.241c-17.673 0-32-14.327-32-32s14.327-32 32-32c113.171 0 205.242 92.071 205.242 205.241S743.804 567.59 630.633 567.59z" fill="#172B4D" p-id="14727"></path><path d="M907.827 874.327c-17.673 0-32-14.327-32-32 0-150.662-109.994-273.235-245.194-273.235-17.673 0-32-14.327-32-32s14.327-32 32-32c42.123 0 82.971 9.077 121.407 26.979 36.886 17.18 69.955 41.71 98.288 72.909 57.714 63.553 89.499 147.845 89.499 237.348 0 17.672-14.327 31.999-32 31.999z" fill="#172B4D" p-id="14728"></path></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1626240434789" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1023" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M810.6 183.5c0-65.7-53.7-119.4-119.4-119.4H333c-65.7 0-119.4 53.7-119.4 119.4-203 0-179.1 0-179.1 119.4 0 98.5 80.6 179.1 179.1 179.1 6 0 14.9 0 20.9-3 38.8 116.4 134.3 223.9 247.8 238.8V900h-89.6c-17.9 0-29.9 11.9-29.9 29.9 0 17.9 11.9 29.8 29.9 29.8h238.8c17.9 0 29.9-11.9 29.9-29.8S649.5 900 631.5 900h-89.6V717.9c113.4-14.9 206-122.4 247.8-238.8 6 0 14.9 3 20.9 3 98.5 0 179.1-80.6 179.1-179.1 0-119.5 23.9-119.5-179.1-119.5z m-597 238.8c-65.7 0-119.4-53.7-119.4-119.4s0-59.7 119.4-59.7v179.1z m537.3-59.7c0 131.3-107.5 298.5-238.8 298.5S273.3 493.9 273.3 362.6V183.5c0-29.9 29.9-59.7 59.7-59.7h358.2c29.8 0 59.7 29.9 59.7 59.7v179.1z m59.7 59.7V243.2c119.4 0 119.4-6 119.4 59.7s-53.7 119.4-119.4 119.4z m0 0" p-id="1024" fill="#172B4D"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1626240753020" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6489" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M711.9 959.9c-10.8 0-21.5-3.3-30.7-9.7L495.3 820.9c-1.5-1-3.5-0.9-4.8 0.4l-72 68.4c-16.2 15.4-39.7 19.2-59.8 9.7-20.2-9.4-32.3-29.9-30.9-52.2l9-141.8c0.8-12.1 5.7-23.8 13.9-32.8l216-237.8c9.3-10.2 25.1-11 35.3-1.7 10.2 9.3 11 25.1 1.7 35.3l-216 237.8c-0.6 0.6-0.9 1.5-1 2.3l-9 141.8c0 0.8-0.2 2.6 2.2 3.7 2.4 1.1 3.7-0.2 4.2-0.7l72-68.4c18.4-17.5 46.9-19.7 67.8-5.2l185.9 129.4c1.1 0.8 2.4 0.9 3.6 0.4 1.3-0.5 2.1-1.5 2.3-2.8L858.2 140c0.1-0.6 0.4-2.3-1.5-3.7-1.9-1.4-3.4-0.7-4-0.4l-745.9 372c-0.5 0.2-2 1-2.1 3.2-0.1 2.2 1.3 3.1 1.8 3.4l198 123.2c11.7 7.3 15.3 22.7 8 34.4s-22.7 15.3-34.4 8L80 557c-16.5-10.3-26.2-28.8-25.3-48.2 0.9-19.5 12.3-36.9 29.7-45.6l745.9-372c18.4-9.2 40-7.2 56.4 5.2s24.3 32.6 20.5 52.8L764.9 915.9c-3.4 18-15.5 33-32.5 40-6.6 2.7-13.6 4-20.5 4z" p-id="6490" fill="#172B4D"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>公共安全技术研究中心</title>
</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>

14
portal_client/src/App.vue Normal file
View File

@ -0,0 +1,14 @@
<template>
<div id="app" class="ap">
<transition name="el-fade-in-linear">
<router-view></router-view>
</transition>
<el-backtop></el-backtop>
</div>
</template>
<script>
export default {
name: 'app'
}
</script>

View File

@ -0,0 +1,24 @@
import request from '../utils/request'
export function queryById(id, uuid) {
return request({
url: `/article/${id}/${uuid}`,
method: 'get'
})
}
export function queryResults(params) {
return request({
url: '/article/search',
method: 'get',
params: params
})
}
export function queryByQuery(params) {
return request({
url: '/article/list',
method: 'get',
params: params
})
}

View File

@ -0,0 +1,8 @@
import request from '../utils/request'
export function queryComponents() {
return request({
url: '/component',
method: 'get'
})
}

View File

@ -0,0 +1,8 @@
import request from '../utils/request'
export function load() {
return request({
url: '/config/load',
method: 'get'
})
}

View File

@ -0,0 +1,22 @@
import request from '../utils/request'
export function queryAllModules() {
return request({
url: '/module',
method: 'get'
})
}
export function queryModuleByRoute(route) {
return request({
url: `/module/route/${route}`,
method: 'get'
})
}
export function queryModuleByParent(parent) {
return request({
url: `/module/parent/${parent}`,
method: 'get'
})
}

View File

@ -0,0 +1,22 @@
import request from '../utils/request'
export function querySession() {
return request({
url: '/student/sessions',
method: 'get'
})
}
export function queryBySession(session) {
return request({
url: `/student/session/${session}`,
method: 'get'
})
}
export function queryByUuid(uuid) {
return request({
url: `/student/${uuid}`,
method: 'get'
})
}

View File

@ -0,0 +1,22 @@
import request from '../utils/request'
export function queryByUuid(uuid) {
return request({
url: `/teacher/${uuid}`,
method: 'get'
})
}
export function queryCollege() {
return request({
url: '/teacher/college',
method: 'get'
})
}
export function queryByCollege(college) {
return request({
url: `/teacher/college/${college}`,
method: 'get'
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,91 @@
$image-size: 120px;
.app-footer {
width: 100%;
padding: 80px 0;
color: $--color-text-regular;
line-height: 150%;
background-color: $--background-color-base;
display: flex;
justify-content: space-around;
align-items: center;
.footer-inner {
width: $min-width;
// min-width: $min-width;
// max-width: $max-width;
.focus-us {
font-size: $--font-size-large;
display: flex;
ul {
margin-left: 20px;
li {
float: left;
min-width: 40px;
.el-link {
font-size: inherit;
}
i:hover {
cursor: pointer;
color: $--color-primary;
}
}
}
}
.footer-row {
width: 100%;
display: flex;
flex-wrap: wrap;
.footer-info {
width: 50%;
display: flex;
flex-direction: column;
justify-content: space-between;
.link-list {
width: 100%;
li {
float: left;
min-width: 20%;
.el-link {
font-size: $--font-size-small;
}
}
}
.contact-us {
margin-top: 20px;
font-size: $--font-size-extra-small;
}
}
.footer-brand {
width: 50%;
display: flex;
justify-content: space-around;
align-items: center;
.el-image {
width: $image-size;
height: $image-size;
}
}
}
.footer-area {
font-size: $--font-size-extra-small;
display: flex;
justify-content: space-between;
align-items: center;
}
}
}

View File

@ -0,0 +1,158 @@
$header-height: 80px;
.app-header {
width: 100%;
height: $header-height;
display: flex;
justify-content: space-around;
align-items: center;
.header-inner {
width: 70vw;
display: flex;
justify-content: space-between;
align-items: center;
.header-before {
display: flex;
justify-content: space-around;
align-items: center;
.el-image {
width: $header-height;
height: inherit;
}
.el-menu {
border-bottom: none;
.el-menu-item,
.el-submenu__title {
border-bottom: none;
}
.el-submenu__icon-arrow {
display: none;
}
}
}
.el-link {
font-weight: bolder;
}
}
}
.header-transparent {
//position: absolute;
position: relative;
z-index: 999;
background: -webkit-gradient(
linear,
left top,
left bottom,
from($--color-white),
to($--color-white)
);
.el-menu {
background-color: transparent;
//background-color: $--color-white;
.el-menu-item,
.el-submenu__title {
//color: $--color-white;
color: blue;
background-color: transparent;
//background-color: $--color-white;
&:hover {
//color: $--color-text-placeholder;
color: blue;
background-color: transparent;
//background-color: $--color-white;
}
}
.el-menu-item:active,
.el-menu-item:focus,
.el-submenu.is-active .el-submenu__title {
//color: $--color-text-placeholder;
color: blue;
background-color: transparent;
//background-color: $--color-white;
}
}
.el-link {
//color: $--color-white;
color: blue;
&:hover {
//color: $--color-text-placeholder;
color: blue;
}
}
}
.header-dark {
// position: sticky;
// position: -webkit-sticky;
// z-index: 999;
// top: 0px;
// left: 0px;
background-color: $--color-primary;
.el-menu {
background-color: transparent;
//background-color: $--color-white;
.el-menu-item,
.el-submenu__title {
//color: $--color-white;
color: blue;
background-color: $--color-primary;
&:hover {
//color: $--color-text-placeholder;
color: blue;
background-color: $--color-primary;
}
}
.el-menu-item:active,
.el-menu-item:focus,
.el-submenu.is-active .el-submenu__title {
//color: $--color-text-placeholder;
color: blue;
background-color: $--color-primary;
}
}
.el-link {
//color: $--color-white;
color: blue;
&:hover {
//color: $--color-text-placeholder;
color: blue;
}
}
}
.header-light {
.el-menu {
background-color: transparent;
//background-color: $--color-white;
}
.el-link {
//color: $--color-text-secondary;
color: blue;
&:hover {
//color: $--color-black;
color: darkblue;
}
}
}

View File

@ -0,0 +1,36 @@
.layout-header {
@extend .layout-body;
background-color: $--background-color-base;
.header-inner {
@extend .body-inner;
h1 {
margin: 60px 0;
font-weight: normal;
font-size: xx-large;
}
}
}
.layout-body {
display: flex;
justify-content: space-around;
align-items: center;
margin-bottom: 50px;
// 750px
@media screen and (min-width: 750px) {
.body-inner {
width: $min-width;
}
}
// 750px
@media screen and (max-width: 750px) {
.body-inner {
min-width: $min-width;
max-width: $max-width;
}
}
}

View File

@ -0,0 +1,29 @@
.body-inner {
.article-title {
display: block;
margin: 30px 0;
font-size: xx-large;
}
.article-info {
color: $--color-text-secondary;
font-size: $--font-size-small;
margin-top: 20px;
span + span {
margin: 0 10px;
}
}
.article-content {
line-height: 175%;
}
.article-file {
margin-top: 20px;
.el-link {
font-size: $--font-size-small;
}
}
}

View File

@ -0,0 +1,66 @@
.card-list {
.tip {
text-align: center;
font-size: $--font-size-extra-small;
color: $--color-text-secondary;
}
&-item {
position: relative;
img {
display: block;
margin: auto;
}
.banner {
width: 100%;
height: 50px;
padding: 50px;
box-sizing: border-box;
position: absolute;
z-index: 10;
bottom: 0;
text-align: center;
color: $--color-white;
font-size: $--font-size-large;
font-weight: bolder;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
transition: all 0.5s ease;
background: -webkit-gradient(
linear,
left bottom,
left top,
from($--color-black),
to(transparent)
);
.content {
text-align: start;
color: $--color-text-secondary;
font-size: $--font-size-base;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
&:hover {
cursor: pointer;
z-index: 5;
-webkit-transform: scale(1.1);
transform: scale(1.1);
.banner {
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
background: rgba($color: $--color-black, $alpha: 0.5);
}
}
}
}

View File

@ -0,0 +1,6 @@
.carousel {
.el-image {
width: 100%;
height: inherit;
}
}

View File

@ -0,0 +1,22 @@
.chunk {
padding: 80px 15%;
.title {
margin-bottom: 30px;
h1 {
font-size: xx-large;
width: fit-content;
margin: auto;
}
}
}
.chunk-light h1 {
border-bottom: 5px solid $--color-primary;
}
.chunk-dark h1 {
color: $--color-white;
border-bottom: 5px solid $--color-white;
}

View File

@ -0,0 +1,17 @@
.section-error {
width: 100%;
height: 80vh;
box-sizing: border-box;
display: flex;
justify-content: space-around;
align-items: center;
.el-image {
width: 75%;
}
h1 {
margin: 20px 0;
}
}

View File

@ -0,0 +1,78 @@
$min-width: 60vw;
$max-width: 90vw;
/* 全局样式表 */
html,
body,
#app {
height: 100%;
margin: 0;
padding: 0;
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
}
ul {
list-style: none;
}
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td {
margin: 0;
padding: 0;
}

View File

@ -0,0 +1,38 @@
.image-list {
.tip {
text-align: center;
font-size: $--font-size-extra-small;
color: $--color-text-secondary;
}
.content {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.content,
.update-time {
margin-top: 10px;
font-size: $--font-size-small;
color: $--color-text-secondary;
}
.el-button {
border: none;
font-weight: bolder;
background-color: $--background-color-base;
}
.el-row ~ .el-row {
margin: 30px 0;
}
.show-more {
@extend .tip;
.el-link {
@extend .show-more;
}
}
}

View File

@ -0,0 +1 @@
@import './mixins/animation';

View File

@ -0,0 +1,45 @@
.news {
background-color: $--background-color-base;
}
.news-item {
&-title {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
&:first-child {
font-size: $--font-size-large;
color: $--color-primary;
font-weight: bold;
}
}
ul {
white-space: nowrap;
li {
display: flex;
justify-content: space-between;
align-items: center;
div {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
a:hover {
cursor: pointer;
color: $--color-primary;
text-decoration: underline;
}
}
}
li + li {
margin: 10px 0;
}
}
}

View File

@ -0,0 +1,8 @@
.overview {
line-height: 180%;
color: $--color-text-primary;
p {
text-indent: 2em;
}
}

View File

@ -0,0 +1,26 @@
.research {
background-color: $--background-color-base;
.item {
cursor: pointer;
text-align: center;
transition: all 0.5s ease;
margin: 50px 0;
.el-image {
width: 120px;
height: 120px;
}
span {
display: block;
font-size: $--font-size-large;
font-weight: bolder;
}
&:hover {
-webkit-transform: scale(1.1);
transform: scale(1.1);
}
}
}

View File

@ -0,0 +1,48 @@
.search {
.box {
text-align: center;
margin: 50px 0;
transition: all 0.5s ease;
.el-autocomplete {
width: 40%;
.el-input-group__append {
width: 20%;
text-align: center;
color: $--color-white;
background-color: $--color-primary;
border: 1px solid $--color-primary;
&:hover {
background-color: $--color-primary-light-2;
border: 1px solid $--color-primary-light-2;
}
}
}
}
.box-resize {
margin: 150px 0;
}
ul {
li {
a {
color: $--color-primary;
cursor: pointer;
text-decoration: underline;
}
.content {
font-size: $--font-size-small;
color: $--color-text-secondary;
margin: 5px 0;
}
}
li + li {
margin: 20px 0;
}
}
}

View File

@ -0,0 +1,24 @@
.college {
line-height: 150%;
h1 {
font-weight: normal;
}
.el-row + .el-row {
margin: 20px 0;
}
.card {
cursor: pointer;
.teacher-name {
font-size: $--font-size-large;
color: $--color-primary;
}
}
}
.college + .college {
margin: 30px 0;
}

View File

@ -0,0 +1,26 @@
.teacher {
line-height: 180%;
.detail {
span {
display: block;
strong {
color: $--color-text-primary;
}
}
}
.other {
h3 {
color: $--color-primary;
}
span {
display: block;
}
}
.other + .other {
margin: 10px 0;
}
}

View File

@ -0,0 +1,5 @@
.team {
background-image: url('/img/home_bg1.png');
background-size: contain;
background-color: #172B4D;
}

View File

@ -0,0 +1,137 @@
@keyframes linear-move-left {
from {
left: 0px;
}
to {
left: 20px;
}
}
@-webkit-keyframes linear-move-left {
from {
left: 0px;
}
to {
left: 20px;
}
}
@-moz-keyframes linear-move-left {
from {
left: 0px;
}
to {
left: 20px;
}
}
@-o-keyframes linear-move-bottom {
from {
bottom: 0px;
}
to {
bottom: 20px;
}
}
@keyframes linear-move-bottom {
from {
bottom: 0px;
}
to {
bottom: 20px;
}
}
@-webkit-keyframes linear-move-bottom {
from {
bottom: 0px;
}
to {
bottom: 20px;
}
}
@-moz-keyframes linear-move-bottom {
from {
bottom: 0px;
}
to {
bottom: 20px;
}
}
@-o-keyframes linear-move-bottom {
from {
bottom: 0px;
}
to {
bottom: 20px;
}
}
@keyframes ease-transition {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@-webkit-keyframes ease-transition {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@-moz-keyframes ease-transition {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@-o-keyframes ease-transition {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@mixin linear-move-left {
animation: linear-move-left;
-moz-animation: linear-move-left; /* Firefox */
-webkit-animation: linear-move-left; /* Safari 和 Chrome */
-o-animation: linear-move-left; /* Opera */
animation-duration: 0.3s;
animation-timing-function: linear;
animation-fill-mode: forwards;
}
@mixin linear-move-bottom {
animation: linear-move-bottom;
-moz-animation: linear-move-bottom; /* Firefox */
-webkit-animation: linear-move-bottom; /* Safari 和 Chrome */
-o-animation: linear-move-bottom; /* Opera */
animation-duration: 0.3s;
animation-timing-function: linear;
animation-fill-mode: forwards;
}
@mixin ease-transition {
animation: ease-transition;
-moz-animation: ease-transition; /* Firefox */
-webkit-animation: ease-transition; /* Safari 和 Chrome */
-o-animation: ease-transition; /* Opera */
animation-duration: 0.5s;
animation-timing-function: ease;
animation-fill-mode: forwards;
}

View File

@ -0,0 +1,996 @@
/* Element Chalk Variables */
// Special comment for theme configurator
// type|skipAutoTranslation|Category|Order
// skipAutoTranslation 1
/* Transition
-------------------------- */
$--all-transition: all .3s cubic-bezier(.645,.045,.355,1) !default;
$--fade-transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1) !default;
$--fade-linear-transition: opacity 200ms linear !default;
$--md-fade-transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1) !default;
$--border-transition-base: border-color .2s cubic-bezier(.645,.045,.355,1) !default;
$--color-transition-base: color .2s cubic-bezier(.645,.045,.355,1) !default;
/* Color
-------------------------- */
/// color|1|Brand Color|0
$--color-primary: #172B4D !default;
/// color|1|Background Color|4
$--color-white: #FFFFFF !default;
/// color|1|Background Color|4
$--color-black: #000000 !default;
$--color-primary-light-1: mix($--color-white, $--color-primary, 10%) !default; /* 53a8ff */
$--color-primary-light-2: mix($--color-white, $--color-primary, 20%) !default; /* 66b1ff */
$--color-primary-light-3: mix($--color-white, $--color-primary, 30%) !default; /* 79bbff */
$--color-primary-light-4: mix($--color-white, $--color-primary, 40%) !default; /* 8cc5ff */
$--color-primary-light-5: mix($--color-white, $--color-primary, 50%) !default; /* a0cfff */
$--color-primary-light-6: mix($--color-white, $--color-primary, 60%) !default; /* b3d8ff */
$--color-primary-light-7: mix($--color-white, $--color-primary, 70%) !default; /* c6e2ff */
$--color-primary-light-8: mix($--color-white, $--color-primary, 80%) !default; /* d9ecff */
$--color-primary-light-9: mix($--color-white, $--color-primary, 90%) !default; /* ecf5ff */
/// color|1|Functional Color|1
$--color-success: #67C23A !default;
/// color|1|Functional Color|1
$--color-warning: #E6A23C !default;
/// color|1|Functional Color|1
$--color-danger: #F56C6C !default;
/// color|1|Functional Color|1
$--color-info: #909399 !default;
$--color-success-light: mix($--color-white, $--color-success, 80%) !default;
$--color-warning-light: mix($--color-white, $--color-warning, 80%) !default;
$--color-danger-light: mix($--color-white, $--color-danger, 80%) !default;
$--color-info-light: mix($--color-white, $--color-info, 80%) !default;
$--color-success-lighter: mix($--color-white, $--color-success, 90%) !default;
$--color-warning-lighter: mix($--color-white, $--color-warning, 90%) !default;
$--color-danger-lighter: mix($--color-white, $--color-danger, 90%) !default;
$--color-info-lighter: mix($--color-white, $--color-info, 90%) !default;
/// color|1|Font Color|2
$--color-text-primary: #303133 !default;
/// color|1|Font Color|2
$--color-text-regular: #606266 !default;
/// color|1|Font Color|2
$--color-text-secondary: #909399 !default;
/// color|1|Font Color|2
$--color-text-placeholder: #C0C4CC !default;
/// color|1|Border Color|3
$--border-color-base: #DCDFE6 !default;
/// color|1|Border Color|3
$--border-color-light: #E4E7ED !default;
/// color|1|Border Color|3
$--border-color-lighter: #EBEEF5 !default;
/// color|1|Border Color|3
$--border-color-extra-light: #F2F6FC !default;
// Background
/// color|1|Background Color|4
$--background-color-base: #F5F7FA !default;
/* Link
-------------------------- */
$--link-color: $--color-primary-light-2 !default;
$--link-hover-color: $--color-primary !default;
/* Border
-------------------------- */
$--border-width-base: 2px !default;
$--border-style-base: solid !default;
$--border-color-hover: $--color-text-placeholder !default;
$--border-base: $--border-width-base $--border-style-base $--border-color-base !default;
/// borderRadius|1|Radius|0
$--border-radius-base: 10px !default;
/// borderRadius|1|Radius|0
$--border-radius-small: 3px !default;
/// borderRadius|1|Radius|0
$--border-radius-circle: 100% !default;
/// borderRadius|1|Radius|0
$--border-radius-zero: 0 !default;
// Box-shadow
/// boxShadow|1|Shadow|1
$--box-shadow-base: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04) !default;
// boxShadow|1|Shadow|1
$--box-shadow-dark: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .12) !default;
/// boxShadow|1|Shadow|1
$--box-shadow-light: 0 2px 12px 0 rgba(0, 0, 0, 0.1) !default;
/* Fill
-------------------------- */
$--fill-base: $--color-white !default;
/* Typography
-------------------------- */
$--font-path: '~element-ui/packages/theme-chalk/src/fonts' !default;
$--font-display: 'auto' !default;
/// fontSize|1|Font Size|0
$--font-size-extra-large: 22px !default;
/// fontSize|1|Font Size|0
$--font-size-large: 20px !default;
/// fontSize|1|Font Size|0
$--font-size-medium: 18px !default;
/// fontSize|1|Font Size|0
$--font-size-base: 16px !default;
/// fontSize|1|Font Size|0
$--font-size-small: 15px !default;
/// fontSize|1|Font Size|0
$--font-size-extra-small: 14px !default;
/// fontWeight|1|Font Weight|1
$--font-weight-primary: 500 !default;
/// fontWeight|1|Font Weight|1
$--font-weight-secondary: 100 !default;
/// fontLineHeight|1|Line Height|2
$--font-line-height-primary: 24px !default;
/// fontLineHeight|1|Line Height|2
$--font-line-height-secondary: 16px !default;
$--font-color-disabled-base: #bbb !default;
/* Size
-------------------------- */
$--size-base: 14px !default;
/* z-index
-------------------------- */
$--index-normal: 1 !default;
$--index-top: 1000 !default;
$--index-popper: 2000 !default;
/* Disable base
-------------------------- */
$--disabled-fill-base: $--background-color-base !default;
$--disabled-color-base: $--color-text-placeholder !default;
$--disabled-border-base: $--border-color-light !default;
/* Icon
-------------------------- */
$--icon-color: #666 !default;
$--icon-color-base: $--color-info !default;
/* Checkbox
-------------------------- */
/// fontSize||Font|1
$--checkbox-font-size: 14px !default;
/// fontWeight||Font|1
$--checkbox-font-weight: $--font-weight-primary !default;
/// color||Color|0
$--checkbox-font-color: $--color-text-regular !default;
$--checkbox-input-height: 14px !default;
$--checkbox-input-width: 14px !default;
/// borderRadius||Border|2
$--checkbox-border-radius: $--border-radius-small !default;
/// color||Color|0
$--checkbox-background-color: $--color-white !default;
$--checkbox-input-border: $--border-base !default;
/// color||Color|0
$--checkbox-disabled-border-color: $--border-color-base !default;
$--checkbox-disabled-input-fill: #edf2fc !default;
$--checkbox-disabled-icon-color: $--color-text-placeholder !default;
$--checkbox-disabled-checked-input-fill: $--border-color-extra-light !default;
$--checkbox-disabled-checked-input-border-color: $--border-color-base !default;
$--checkbox-disabled-checked-icon-color: $--color-text-placeholder !default;
/// color||Color|0
$--checkbox-checked-font-color: $--color-primary !default;
$--checkbox-checked-input-border-color: $--color-primary !default;
/// color||Color|0
$--checkbox-checked-background-color: $--color-primary !default;
$--checkbox-checked-icon-color: $--fill-base !default;
$--checkbox-input-border-color-hover: $--color-primary !default;
/// height||Other|4
$--checkbox-bordered-height: 40px !default;
/// padding||Spacing|3
$--checkbox-bordered-padding: 9px 20px 9px 10px !default;
/// padding||Spacing|3
$--checkbox-bordered-medium-padding: 7px 20px 7px 10px !default;
/// padding||Spacing|3
$--checkbox-bordered-small-padding: 5px 15px 5px 10px !default;
/// padding||Spacing|3
$--checkbox-bordered-mini-padding: 3px 15px 3px 10px !default;
$--checkbox-bordered-medium-input-height: 14px !default;
$--checkbox-bordered-medium-input-width: 14px !default;
/// height||Other|4
$--checkbox-bordered-medium-height: 36px !default;
$--checkbox-bordered-small-input-height: 12px !default;
$--checkbox-bordered-small-input-width: 12px !default;
/// height||Other|4
$--checkbox-bordered-small-height: 32px !default;
$--checkbox-bordered-mini-input-height: 12px !default;
$--checkbox-bordered-mini-input-width: 12px !default;
/// height||Other|4
$--checkbox-bordered-mini-height: 28px !default;
/// color||Color|0
$--checkbox-button-checked-background-color: $--color-primary !default;
/// color||Color|0
$--checkbox-button-checked-font-color: $--color-white !default;
/// color||Color|0
$--checkbox-button-checked-border-color: $--color-primary !default;
/* Radio
-------------------------- */
/// fontSize||Font|1
$--radio-font-size: $--font-size-base !default;
/// fontWeight||Font|1
$--radio-font-weight: $--font-weight-primary !default;
/// color||Color|0
$--radio-font-color: $--color-text-regular !default;
$--radio-input-height: 14px !default;
$--radio-input-width: 14px !default;
/// borderRadius||Border|2
$--radio-input-border-radius: $--border-radius-circle !default;
/// color||Color|0
$--radio-input-background-color: $--color-white !default;
$--radio-input-border: $--border-base !default;
/// color||Color|0
$--radio-input-border-color: $--border-color-base !default;
/// color||Color|0
$--radio-icon-color: $--color-white !default;
$--radio-disabled-input-border-color: $--disabled-border-base !default;
$--radio-disabled-input-fill: $--disabled-fill-base !default;
$--radio-disabled-icon-color: $--disabled-fill-base !default;
$--radio-disabled-checked-input-border-color: $--disabled-border-base !default;
$--radio-disabled-checked-input-fill: $--disabled-fill-base !default;
$--radio-disabled-checked-icon-color: $--color-text-placeholder !default;
/// color||Color|0
$--radio-checked-font-color: $--color-primary !default;
/// color||Color|0
$--radio-checked-input-border-color: $--color-primary !default;
/// color||Color|0
$--radio-checked-input-background-color: $--color-white !default;
/// color||Color|0
$--radio-checked-icon-color: $--color-primary !default;
$--radio-input-border-color-hover: $--color-primary !default;
$--radio-bordered-height: 40px !default;
$--radio-bordered-padding: 12px 20px 0 10px !default;
$--radio-bordered-medium-padding: 10px 20px 0 10px !default;
$--radio-bordered-small-padding: 8px 15px 0 10px !default;
$--radio-bordered-mini-padding: 6px 15px 0 10px !default;
$--radio-bordered-medium-input-height: 14px !default;
$--radio-bordered-medium-input-width: 14px !default;
$--radio-bordered-medium-height: 36px !default;
$--radio-bordered-small-input-height: 12px !default;
$--radio-bordered-small-input-width: 12px !default;
$--radio-bordered-small-height: 32px !default;
$--radio-bordered-mini-input-height: 12px !default;
$--radio-bordered-mini-input-width: 12px !default;
$--radio-bordered-mini-height: 28px !default;
/// fontSize||Font|1
$--radio-button-font-size: $--font-size-base !default;
/// color||Color|0
$--radio-button-checked-background-color: $--color-primary !default;
/// color||Color|0
$--radio-button-checked-font-color: $--color-white !default;
/// color||Color|0
$--radio-button-checked-border-color: $--color-primary !default;
$--radio-button-disabled-checked-fill: $--border-color-extra-light !default;
/* Select
-------------------------- */
$--select-border-color-hover: $--border-color-hover !default;
$--select-disabled-border: $--disabled-border-base !default;
/// fontSize||Font|1
$--select-font-size: $--font-size-base !default;
$--select-close-hover-color: $--color-text-secondary !default;
$--select-input-color: $--color-text-placeholder !default;
$--select-multiple-input-color: #666 !default;
/// color||Color|0
$--select-input-focus-border-color: $--color-primary !default;
/// fontSize||Font|1
$--select-input-font-size: 14px !default;
$--select-option-color: $--color-text-regular !default;
$--select-option-disabled-color: $--color-text-placeholder !default;
$--select-option-disabled-background: $--color-white !default;
/// height||Other|4
$--select-option-height: 34px !default;
$--select-option-hover-background: $--background-color-base !default;
/// color||Color|0
$--select-option-selected-font-color: $--color-primary !default;
$--select-option-selected-hover: $--background-color-base !default;
$--select-group-color: $--color-info !default;
$--select-group-height: 30px !default;
$--select-group-font-size: 12px !default;
$--select-dropdown-background: $--color-white !default;
$--select-dropdown-shadow: $--box-shadow-light !default;
$--select-dropdown-empty-color: #999 !default;
/// height||Other|4
$--select-dropdown-max-height: 274px !default;
$--select-dropdown-padding: 6px 0 !default;
$--select-dropdown-empty-padding: 10px 0 !default;
$--select-dropdown-border: solid 1px $--border-color-light !default;
/* Alert
-------------------------- */
$--alert-padding: 8px 16px !default;
/// borderRadius||Border|2
$--alert-border-radius: $--border-radius-base !default;
/// fontSize||Font|1
$--alert-title-font-size: 13px !default;
/// fontSize||Font|1
$--alert-description-font-size: 12px !default;
/// fontSize||Font|1
$--alert-close-font-size: 12px !default;
/// fontSize||Font|1
$--alert-close-customed-font-size: 13px !default;
$--alert-success-color: $--color-success-lighter !default;
$--alert-info-color: $--color-info-lighter !default;
$--alert-warning-color: $--color-warning-lighter !default;
$--alert-danger-color: $--color-danger-lighter !default;
/// height||Other|4
$--alert-icon-size: 16px !default;
/// height||Other|4
$--alert-icon-large-size: 28px !default;
/* MessageBox
-------------------------- */
/// color||Color|0
$--messagebox-title-color: $--color-text-primary !default;
$--msgbox-width: 420px !default;
$--msgbox-border-radius: 4px !default;
/// fontSize||Font|1
$--messagebox-font-size: $--font-size-large !default;
/// fontSize||Font|1
$--messagebox-content-font-size: $--font-size-base !default;
/// color||Color|0
$--messagebox-content-color: $--color-text-regular !default;
/// fontSize||Font|1
$--messagebox-error-font-size: 12px !default;
$--msgbox-padding-primary: 15px !default;
/// color||Color|0
$--messagebox-success-color: $--color-success !default;
/// color||Color|0
$--messagebox-info-color: $--color-info !default;
/// color||Color|0
$--messagebox-warning-color: $--color-warning !default;
/// color||Color|0
$--messagebox-danger-color: $--color-danger !default;
/* Message
-------------------------- */
$--message-shadow: $--box-shadow-base !default;
$--message-min-width: 380px !default;
$--message-background-color: #edf2fc !default;
$--message-padding: 15px 15px 15px 20px !default;
/// color||Color|0
$--message-close-icon-color: $--color-text-placeholder !default;
/// height||Other|4
$--message-close-size: 16px !default;
/// color||Color|0
$--message-close-hover-color: $--color-text-secondary !default;
/// color||Color|0
$--message-success-font-color: $--color-success !default;
/// color||Color|0
$--message-info-font-color: $--color-info !default;
/// color||Color|0
$--message-warning-font-color: $--color-warning !default;
/// color||Color|0
$--message-danger-font-color: $--color-danger !default;
/* Notification
-------------------------- */
$--notification-width: 330px !default;
/// padding||Spacing|3
$--notification-padding: 14px 26px 14px 13px !default;
$--notification-radius: 8px !default;
$--notification-shadow: $--box-shadow-light !default;
/// color||Color|0
$--notification-border-color: $--border-color-lighter !default;
$--notification-icon-size: 24px !default;
$--notification-close-font-size: $--message-close-size !default;
$--notification-group-margin-left: 13px !default;
$--notification-group-margin-right: 8px !default;
/// fontSize||Font|1
$--notification-content-font-size: $--font-size-base !default;
/// color||Color|0
$--notification-content-color: $--color-text-regular !default;
/// fontSize||Font|1
$--notification-title-font-size: 16px !default;
/// color||Color|0
$--notification-title-color: $--color-text-primary !default;
/// color||Color|0
$--notification-close-color: $--color-text-secondary !default;
/// color||Color|0
$--notification-close-hover-color: $--color-text-regular !default;
/// color||Color|0
$--notification-success-icon-color: $--color-success !default;
/// color||Color|0
$--notification-info-icon-color: $--color-info !default;
/// color||Color|0
$--notification-warning-icon-color: $--color-warning !default;
/// color||Color|0
$--notification-danger-icon-color: $--color-danger !default;
/* Input
-------------------------- */
$--input-font-size: $--font-size-base !default;
/// color||Color|0
$--input-font-color: $--color-text-regular !default;
/// height||Other|4
$--input-width: 150px !default;
/// height||Other|4
$--input-height: 50px !default;
$--input-border: $--border-base !default;
$--input-border-color: $--border-color-base !default;
/// borderRadius||Border|2
$--input-border-radius: $--border-radius-base !default;
$--input-border-color-hover: $--border-color-hover !default;
/// color||Color|0
$--input-background-color: $--color-white !default;
$--input-fill-disabled: $--disabled-fill-base !default;
$--input-color-disabled: $--font-color-disabled-base !default;
/// color||Color|0
$--input-icon-color: $--color-text-placeholder !default;
/// color||Color|0
$--input-placeholder-color: $--color-text-placeholder !default;
$--input-max-width: 314px !default;
$--input-hover-border: $--border-color-hover !default;
$--input-clear-hover-color: $--color-text-secondary !default;
$--input-focus-border: $--color-primary !default;
$--input-focus-fill: $--color-white !default;
$--input-disabled-fill: $--disabled-fill-base !default;
$--input-disabled-border: $--disabled-border-base !default;
$--input-disabled-color: $--disabled-color-base !default;
$--input-disabled-placeholder-color: $--color-text-placeholder !default;
/// fontSize||Font|1
$--input-medium-font-size: 14px !default;
/// height||Other|4
$--input-medium-height: 36px !default;
/// fontSize||Font|1
$--input-small-font-size: 13px !default;
/// height||Other|4
$--input-small-height: 32px !default;
/// fontSize||Font|1
$--input-mini-font-size: 12px !default;
/// height||Other|4
$--input-mini-height: 28px !default;
/* Cascader
-------------------------- */
/// color||Color|0
$--cascader-menu-font-color: $--color-text-regular !default;
/// color||Color|0
$--cascader-menu-selected-font-color: $--color-primary !default;
$--cascader-menu-fill: $--fill-base !default;
$--cascader-menu-font-size: $--font-size-base !default;
$--cascader-menu-radius: $--border-radius-base !default;
$--cascader-menu-border: solid 1px $--border-color-light !default;
$--cascader-menu-shadow: $--box-shadow-light !default;
$--cascader-node-background-hover: $--background-color-base !default;
$--cascader-node-color-disabled:$--color-text-placeholder !default;
$--cascader-color-empty:$--color-text-placeholder !default;
$--cascader-tag-background: #f0f2f5;
/* Group
-------------------------- */
$--group-option-flex: 0 0 (1/5) * 100% !default;
$--group-option-offset-bottom: 12px !default;
$--group-option-fill-hover: rgba($--color-black, 0.06) !default;
$--group-title-color: $--color-black !default;
$--group-title-font-size: $--font-size-base !default;
$--group-title-width: 66px !default;
/* Tab
-------------------------- */
$--tab-font-size: $--font-size-base !default;
$--tab-border-line: 1px solid #e4e4e4 !default;
$--tab-header-color-active: $--color-text-secondary !default;
$--tab-header-color-hover: $--color-text-regular !default;
$--tab-header-color: $--color-text-regular !default;
$--tab-header-fill-active: rgba($--color-black, 0.06) !default;
$--tab-header-fill-hover: rgba($--color-black, 0.06) !default;
$--tab-vertical-header-width: 90px !default;
$--tab-vertical-header-count-color: $--color-white !default;
$--tab-vertical-header-count-fill: $--color-text-secondary !default;
/* Button
-------------------------- */
/// fontSize||Font|1
$--button-font-size: $--font-size-base !default;
/// fontWeight||Font|1
$--button-font-weight: $--font-weight-primary !default;
/// borderRadius||Border|2
$--button-border-radius: $--border-radius-base !default;
/// padding||Spacing|3
$--button-padding-vertical: 12px !default;
/// padding||Spacing|3
$--button-padding-horizontal: 20px !default;
/// fontSize||Font|1
$--button-medium-font-size: $--font-size-base !default;
/// borderRadius||Border|2
$--button-medium-border-radius: $--border-radius-base !default;
/// padding||Spacing|3
$--button-medium-padding-vertical: 10px !default;
/// padding||Spacing|3
$--button-medium-padding-horizontal: 20px !default;
/// fontSize||Font|1
$--button-small-font-size: 12px !default;
$--button-small-border-radius: #{$--border-radius-base - 1} !default;
/// padding||Spacing|3
$--button-small-padding-vertical: 9px !default;
/// padding||Spacing|3
$--button-small-padding-horizontal: 15px !default;
/// fontSize||Font|1
$--button-mini-font-size: 12px !default;
$--button-mini-border-radius: #{$--border-radius-base - 1} !default;
/// padding||Spacing|3
$--button-mini-padding-vertical: 7px !default;
/// padding||Spacing|3
$--button-mini-padding-horizontal: 15px !default;
/// color||Color|0
$--button-default-font-color: $--color-text-regular !default;
/// color||Color|0
$--button-default-background-color: $--color-white !default;
/// color||Color|0
$--button-default-border-color: $--border-color-base !default;
/// color||Color|0
$--button-disabled-font-color: $--color-text-placeholder !default;
/// color||Color|0
$--button-disabled-background-color: $--color-white !default;
/// color||Color|0
$--button-disabled-border-color: $--border-color-lighter !default;
/// color||Color|0
$--button-primary-border-color: $--color-primary !default;
/// color||Color|0
$--button-primary-font-color: $--color-white !default;
/// color||Color|0
$--button-primary-background-color: $--color-primary !default;
/// color||Color|0
$--button-success-border-color: $--color-success !default;
/// color||Color|0
$--button-success-font-color: $--color-white !default;
/// color||Color|0
$--button-success-background-color: $--color-success !default;
/// color||Color|0
$--button-warning-border-color: $--color-warning !default;
/// color||Color|0
$--button-warning-font-color: $--color-white !default;
/// color||Color|0
$--button-warning-background-color: $--color-warning !default;
/// color||Color|0
$--button-danger-border-color: $--color-danger !default;
/// color||Color|0
$--button-danger-font-color: $--color-white !default;
/// color||Color|0
$--button-danger-background-color: $--color-danger !default;
/// color||Color|0
$--button-info-border-color: $--color-info !default;
/// color||Color|0
$--button-info-font-color: $--color-white !default;
/// color||Color|0
$--button-info-background-color: $--color-info !default;
$--button-hover-tint-percent: 20% !default;
$--button-active-shade-percent: 10% !default;
/* cascader
-------------------------- */
$--cascader-height: 200px !default;
/* Switch
-------------------------- */
/// color||Color|0
$--switch-on-color: $--color-primary !default;
/// color||Color|0
$--switch-off-color: $--border-color-base !default;
/// fontSize||Font|1
$--switch-font-size: $--font-size-base !default;
$--switch-core-border-radius: 10px !default;
// height||Other|4 TODO: width 40px
$--switch-width: 40px !default;
// height||Other|4
$--switch-height: 20px !default;
// height||Other|4
$--switch-button-size: 16px !default;
/* Dialog
-------------------------- */
$--dialog-background-color: $--color-white !default;
$--dialog-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3) !default;
/// fontSize||Font|1
$--dialog-title-font-size: $--font-size-large !default;
/// fontSize||Font|1
$--dialog-content-font-size: 14px !default;
/// fontLineHeight||LineHeight|2
$--dialog-font-line-height: $--font-line-height-primary !default;
/// padding||Spacing|3
$--dialog-padding-primary: 20px !default;
/* Table
-------------------------- */
/// color||Color|0
$--table-border-color: $--border-color-lighter !default;
$--table-border: 1px solid $--table-border-color !default;
/// color||Color|0
$--table-font-color: $--color-text-regular !default;
/// color||Color|0
$--table-header-font-color: $--color-text-secondary !default;
/// color||Color|0
$--table-row-hover-background-color: $--background-color-base !default;
$--table-current-row-background-color: $--color-primary-light-9 !default;
/// color||Color|0
$--table-header-background-color: $--color-white !default;
$--table-fixed-box-shadow: 0 0 10px rgba(0, 0, 0, .12) !default;
/* Pagination
-------------------------- */
/// fontSize||Font|1
$--pagination-font-size: 13px !default;
/// color||Color|0
$--pagination-background-color: $--color-white !default;
/// color||Color|0
$--pagination-font-color: $--color-text-primary !default;
$--pagination-border-radius: 3px !default;
/// color||Color|0
$--pagination-button-color: $--color-text-primary !default;
/// height||Other|4
$--pagination-button-width: 35.5px !default;
/// height||Other|4
$--pagination-button-height: 28px !default;
/// color||Color|0
$--pagination-button-disabled-color: $--color-text-placeholder !default;
/// color||Color|0
$--pagination-button-disabled-background-color: $--color-white !default;
/// color||Color|0
$--pagination-hover-color: $--color-primary !default;
/* Popup
-------------------------- */
/// color||Color|0
$--popup-modal-background-color: $--color-black !default;
/// opacity||Other|1
$--popup-modal-opacity: 0.5 !default;
/* Popover
-------------------------- */
/// color||Color|0
$--popover-background-color: $--color-white !default;
/// fontSize||Font|1
$--popover-font-size: $--font-size-base !default;
/// color||Color|0
$--popover-border-color: $--border-color-lighter !default;
$--popover-arrow-size: 6px !default;
/// padding||Spacing|3
$--popover-padding: 12px !default;
$--popover-padding-large: 18px 20px !default;
/// fontSize||Font|1
$--popover-title-font-size: 16px !default;
/// color||Color|0
$--popover-title-font-color: $--color-text-primary !default;
/* Tooltip
-------------------------- */
/// color|1|Color|0
$--tooltip-fill: $--color-text-primary !default;
/// color|1|Color|0
$--tooltip-color: $--color-white !default;
/// fontSize||Font|1
$--tooltip-font-size: 12px !default;
/// color||Color|0
$--tooltip-border-color: $--color-text-primary !default;
$--tooltip-arrow-size: 6px !default;
/// padding||Spacing|3
$--tooltip-padding: 10px !default;
/* Tag
-------------------------- */
/// color||Color|0
$--tag-info-color: $--color-info !default;
/// color||Color|0
$--tag-primary-color: $--color-primary !default;
/// color||Color|0
$--tag-success-color: $--color-success !default;
/// color||Color|0
$--tag-warning-color: $--color-warning !default;
/// color||Color|0
$--tag-danger-color: $--color-danger !default;
/// fontSize||Font|1
$--tag-font-size: 12px !default;
$--tag-border-radius: 4px !default;
$--tag-padding: 0 10px !default;
/* Tree
-------------------------- */
/// color||Color|0
$--tree-node-hover-background-color: $--background-color-base !default;
/// color||Color|0
$--tree-font-color: $--color-text-regular !default;
/// color||Color|0
$--tree-expand-icon-color: $--color-text-placeholder !default;
/* Dropdown
-------------------------- */
$--dropdown-menu-box-shadow: $--box-shadow-light !default;
$--dropdown-menuItem-hover-fill: $--color-primary-light-9 !default;
$--dropdown-menuItem-hover-color: $--link-color !default;
/* Badge
-------------------------- */
/// color||Color|0
$--badge-background-color: $--color-danger !default;
$--badge-radius: 10px !default;
/// fontSize||Font|1
$--badge-font-size: 12px !default;
/// padding||Spacing|3
$--badge-padding: 6px !default;
/// height||Other|4
$--badge-size: 18px !default;
/* Card
--------------------------*/
/// color||Color|0
$--card-border-color: $--border-color-lighter !default;
$--card-border-radius: 4px !default;
/// padding||Spacing|3
$--card-padding: 20px !default;
/* Slider
--------------------------*/
/// color||Color|0
$--slider-main-background-color: $--color-primary !default;
/// color||Color|0
$--slider-runway-background-color: $--border-color-light !default;
$--slider-button-hover-color: mix($--color-primary, black, 97%) !default;
$--slider-stop-background-color: $--color-white !default;
$--slider-disable-color: $--color-text-placeholder !default;
$--slider-margin: 16px 0 !default;
$--slider-border-radius: 3px !default;
/// height|1|Other|4
$--slider-height: 6px !default;
/// height||Other|4
$--slider-button-size: 16px !default;
$--slider-button-wrapper-size: 36px !default;
$--slider-button-wrapper-offset: -15px !default;
/* Steps
--------------------------*/
$--steps-border-color: $--disabled-border-base !default;
$--steps-border-radius: 4px !default;
$--steps-padding: 20px !default;
/* Menu
--------------------------*/
/// fontSize||Font|1
$--menu-item-font-size: $--font-size-base !default;
/// color||Color|0
$--menu-item-font-color: $--color-text-primary !default;
/// color||Color|0
$--menu-background-color: $--color-white !default;
$--menu-item-hover-fill: $--color-primary-light-9 !default;
/* Rate
--------------------------*/
$--rate-height: 20px !default;
/// fontSize||Font|1
$--rate-font-size: $--font-size-base !default;
/// height||Other|3
$--rate-icon-size: 18px !default;
/// margin||Spacing|2
$--rate-icon-margin: 6px !default;
$--rate-icon-color: $--color-text-placeholder !default;
/* DatePicker
--------------------------*/
$--datepicker-font-color: $--color-text-regular !default;
/// color|1|Color|0
$--datepicker-off-font-color: $--color-text-placeholder !default;
/// color||Color|0
$--datepicker-header-font-color: $--color-text-regular !default;
$--datepicker-icon-color: $--color-text-primary !default;
$--datepicker-border-color: $--disabled-border-base !default;
$--datepicker-inner-border-color: #e4e4e4 !default;
/// color||Color|0
$--datepicker-inrange-background-color: $--border-color-extra-light !default;
/// color||Color|0
$--datepicker-inrange-hover-background-color: $--border-color-extra-light !default;
/// color||Color|0
$--datepicker-active-color: $--color-primary !default;
/// color||Color|0
$--datepicker-hover-font-color: $--color-primary !default;
$--datepicker-cell-hover-color: #fff !default;
/* Loading
--------------------------*/
/// height||Other|4
$--loading-spinner-size: 42px !default;
/// height||Other|4
$--loading-fullscreen-spinner-size: 50px !default;
/* Scrollbar
--------------------------*/
$--scrollbar-background-color: rgba($--color-text-secondary, .3) !default;
$--scrollbar-hover-background-color: rgba($--color-text-secondary, .5) !default;
/* Carousel
--------------------------*/
/// fontSize||Font|1
$--carousel-arrow-font-size: 12px !default;
$--carousel-arrow-size: 36px !default;
$--carousel-arrow-background: rgba(31, 45, 61, 0.11) !default;
$--carousel-arrow-hover-background: rgba(31, 45, 61, 0.23) !default;
/// width||Other|4
$--carousel-indicator-width: 30px !default;
/// height||Other|4
$--carousel-indicator-height: 2px !default;
$--carousel-indicator-padding-horizontal: 4px !default;
$--carousel-indicator-padding-vertical: 12px !default;
$--carousel-indicator-out-color: $--border-color-hover !default;
/* Collapse
--------------------------*/
/// color||Color|0
$--collapse-border-color: $--border-color-lighter !default;
/// height||Other|4
$--collapse-header-height: 48px !default;
/// color||Color|0
$--collapse-header-background-color: $--color-white !default;
/// color||Color|0
$--collapse-header-font-color: $--color-text-primary !default;
/// fontSize||Font|1
$--collapse-header-font-size: 13px !default;
/// color||Color|0
$--collapse-content-background-color: $--color-white !default;
/// fontSize||Font|1
$--collapse-content-font-size: 13px !default;
/// color||Color|0
$--collapse-content-font-color: $--color-text-primary !default;
/* Transfer
--------------------------*/
$--transfer-border-color: $--border-color-lighter !default;
$--transfer-border-radius: $--border-radius-base !default;
/// height||Other|4
$--transfer-panel-width: 200px !default;
/// height||Other|4
$--transfer-panel-header-height: 40px !default;
/// color||Color|0
$--transfer-panel-header-background-color: $--background-color-base !default;
/// height||Other|4
$--transfer-panel-footer-height: 40px !default;
/// height||Other|4
$--transfer-panel-body-height: 246px !default;
/// height||Other|4
$--transfer-item-height: 30px !default;
/// height||Other|4
$--transfer-filter-height: 32px !default;
/* Header
--------------------------*/
$--header-padding: 0 20px !default;
/* Footer
--------------------------*/
$--footer-padding: 0 20px !default;
/* Main
--------------------------*/
$--main-padding: 20px !default;
/* Timeline
--------------------------*/
$--timeline-node-size-normal: 12px !default;
$--timeline-node-size-large: 14px !default;
$--timeline-node-color: $--border-color-light !default;
/* Backtop
--------------------------*/
/// color||Color|0
$--backtop-background-color: $--color-white !default;
/// color||Color|0
$--backtop-font-color: $--color-primary !default;
/// color||Color|0
$--backtop-hover-background-color: $--border-color-extra-light !default;
/* Link
--------------------------*/
/// fontSize||Font|1
$--link-font-size: $--font-size-base !default;
/// fontWeight||Font|1
$--link-font-weight: $--font-weight-primary !default;
/// color||Color|0
$--link-default-font-color: $--color-text-regular !default;
/// color||Color|0
$--link-default-active-color: $--color-primary !default;
/// color||Color|0
$--link-disabled-font-color: $--color-text-placeholder !default;
/// color||Color|0
$--link-primary-font-color: $--color-primary !default;
/// color||Color|0
$--link-success-font-color: $--color-success !default;
/// color||Color|0
$--link-warning-font-color: $--color-warning !default;
/// color||Color|0
$--link-danger-font-color: $--color-danger !default;
/// color||Color|0
$--link-info-font-color: $--color-info !default;
/* Calendar
--------------------------*/
/// border||Other|4
$--calendar-border: $--table-border !default;
/// color||Other|4
$--calendar-selected-background-color: #F2F8FE !default;
$--calendar-cell-width: 85px !default;
/* Form
-------------------------- */
/// fontSize||Font|1
$--form-label-font-size: $--font-size-base !default;
/* Avatar
--------------------------*/
/// color||Color|0
$--avatar-font-color: #fff !default;
/// color||Color|0
$--avatar-background-color: #C0C4CC !default;
/// fontSize||Font Size|1
$--avatar-text-font-size: 14px !default;
/// fontSize||Font Size|1
$--avatar-icon-font-size: 18px !default;
/// borderRadius||Border|2
$--avatar-border-radius: $--border-radius-base !default;
/// size|1|Avatar Size|3
$--avatar-large-size: 40px !default;
/// size|1|Avatar Size|3
$--avatar-medium-size: 36px !default;
/// size|1|Avatar Size|3
$--avatar-small-size: 28px !default;
/* Break-point
--------------------------*/
$--sm: 768px !default;
$--md: 992px !default;
$--lg: 1200px !default;
$--xl: 1920px !default;
$--breakpoints: (
'xs' : (max-width: $--sm - 1),
'sm' : (min-width: $--sm),
'md' : (min-width: $--md),
'lg' : (min-width: $--lg),
'xl' : (min-width: $--xl)
);
$--breakpoints-spec: (
'xs-only' : (max-width: $--sm - 1),
'sm-and-up' : (min-width: $--sm),
'sm-only': "(min-width: #{$--sm}) and (max-width: #{$--md - 1})",
'sm-and-down': (max-width: $--md - 1),
'md-and-up' : (min-width: $--md),
'md-only': "(min-width: #{$--md}) and (max-width: #{$--lg - 1})",
'md-and-down': (max-width: $--lg - 1),
'lg-and-up' : (min-width: $--lg),
'lg-only': "(min-width: #{$--lg}) and (max-width: #{$--xl - 1})",
'lg-and-down': (max-width: $--xl - 1),
'xl-only' : (min-width: $--xl),
);
@import '~element-ui/packages/theme-chalk/src/index';

View File

@ -0,0 +1,23 @@
// Element components
@import './element/variables';
@import './custom/mixins';
@import './custom/global';
// Custom components
@import './custom/app-footer';
@import './custom/app-header';
@import './custom/app-home';
@import './custom/app-layout';
@import './custom/article';
@import './custom/card-list';
@import './custom/carousel';
@import './custom/chunk';
@import './custom/error';
@import './custom/image-list';
@import './custom/news';
@import './custom/overview';
@import './custom/research';
@import './custom/search';
@import './custom/teacher-list';
@import './custom/teacher';
@import './custom/team';

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

View File

@ -0,0 +1,102 @@
<template>
<div class="card-list">
<div v-if="!data.length" class="tip">
暂无内容
</div>
<el-row
:gutter="gutter"
v-for="line in Math.ceil(data.length / column)"
:key="line"
:style="{ margin: gutter + 'px' }"
>
<el-col
:span="24 / column"
v-for="(item, index) in data.slice((line - 1) * column, line * column)"
:key="index"
>
<el-card
:body-style="{ padding: '0px', height: height }"
:style="showBorder ? '' : 'border: none'"
class="card-list-item"
shadow="hover"
@click.native="
item.path ? $router.push(item.path) : openNewTab(item.href)
"
>
<!-- 封面图片 -->
<img
:src="item.fileUrl"
:alt="item.title"
:width="width"
:height="height"
object-fit="scale-down"
/>
<!-- 横幅 -->
<div v-show="showBanner" class="banner">
<!-- 标题 -->
<div>{{ item.title }}</div>
<!-- 内容 -->
<div v-if="item.content" class="content">
{{ item.content }}
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
import { openNewTab } from '@/utils/common'
export default {
props: {
gutter: {
default: 15,
type: Number,
description: '卡片间距'
},
data: {
default: () => [],
type: Array,
description: '填充数据'
},
column: {
default: 6,
type: Number,
description: '列数(只可取24的约数1 | 2 | 3 | 4 | 6 | 8 | 12 | 24)'
},
'card-width': {
default: 0,
type: Number,
description: '卡片宽度'
},
'card-height': {
default: 0,
type: Number,
description: '卡片高度'
},
'show-border': {
default: false,
type: Boolean,
description: '显示边界'
},
'show-banner': {
default: true,
type: Boolean,
description: '显示横幅'
}
},
methods: {
openNewTab
},
computed: {
width() {
return this.cardWidth ? this.cardWidth + 'px' : '100%'
},
height() {
return this.cardHeight ? this.cardHeight + 'px' : '100%'
}
}
}
</script>

View File

@ -0,0 +1,59 @@
<template>
<footer class="app-footer">
<div class="footer-inner">
<!-- <div class="focus-us">
<span>关注我们</span>
<ul>
<li v-for="(item, index) in config.mediaList" :key="index">
<el-link :underline="false" :href="item.href" target="_blank">
<i :class="item.icon"></i>
</el-link>
</li>
</ul>
</div>
<el-divider></el-divider> -->
<div class="footer-row">
<div class="footer-info">
<ul class="link-list">
<li v-for="(item, index) in config.linkList" :key="index">
<el-link :underline="false" :href="item.href" target="_blank">
{{ item.name }}
</el-link>
</li>
</ul>
<ul class="contact-us">
<li v-for="(item, index) in config.contacts" :key="index">
{{ item }}
</li>
</ul>
</div>
<div class="footer-brand">
<router-link to="/">
<el-image src="/img/brand_blue.png"></el-image>
</router-link>
</div>
</div>
<div class="footer-area">
<div>{{ config.ICP }}</div>
<div>
Copyright &copy; {{ year }} UP. All Rights Reserved.
公共安全技术研究中心 版权所有
</div>
</div>
</div>
</footer>
</template>
<script>
import loadConfig from '@/mixins/load-config'
export default {
name: 'AppFooter',
mixins: [loadConfig],
computed: {
year() {
return new Date().getFullYear()
}
}
}
</script>

View File

@ -0,0 +1,94 @@
<template>
<header class="app-header" :class="[`header-${effect}`]">
<div class="header-inner">
<div class="header-before">
<!-- Logo -->
<router-link to="/">
<!-- <el-image
:src="`/img/brand_${effect === 'light' ? 'blue' : 'white'}.png`"
fit="scale-down"
></el-image> -->
<el-image
:src="`/img/logo.png`"
fit="scale-down"
style="width: 300px"
></el-image>
</router-link>
<!-- 导航菜单 -->
<el-menu
:default-active="$route.path"
mode="horizontal"
router
unique-opened
>
<template v-for="item in allModules">
<template v-if="!item.hidden && item.status">
<!-- 没有子菜单 -->
<el-menu-item
v-if="!item.children"
:key="item.id"
:index="item.path"
>
{{ item.name }}
</el-menu-item>
<!-- 有子菜单 -->
<el-submenu v-else :key="item.id" :index="item.id + ''">
<template slot="title">{{ item.name }}</template>
<template v-for="subitem in item.children">
<template v-if="!subitem.hidden && subitem.status">
<el-menu-item
v-if="!subitem.isExternal"
:key="subitem.id"
:index="subitem.path"
>
{{ subitem.name }}
</el-menu-item>
<el-menu-item
v-else
:key="subitem.id"
@click="openNewTab(subitem.path)"
>
{{ subitem.name }}
</el-menu-item>
</template>
</template>
</el-submenu>
</template>
</template>
</el-menu>
</div>
<router-link to="/search">
<el-link :underline="false">
<i class="el-icon-search"></i>
</el-link>
</router-link>
<el-link :underline="false" href="http://192.168.1.133:8080">
<div>后台入口</div>
</el-link>
</div>
</header>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import { mapState } from 'vuex'
import { openNewTab } from '@/utils/common.js'
export default {
name: 'AppHeader',
mixins: [loadConfig],
props: {
effect: {
type: String,
default: 'transparent',
description: '导航栏主题,(transparent | dark | light)'
}
},
methods: {
openNewTab
},
computed: {
...mapState(['allModules'])
}
}
</script>

View File

@ -0,0 +1,2 @@
export { default as AppFooter } from './AppFooter'
export { default as AppHeader } from './AppHeader'

View File

@ -0,0 +1,53 @@
<template>
<section>
<app-header effect="light"></app-header>
<div class="layout-header">
<div class="header-inner">
<h1>{{ currentModule.name }}</h1>
</div>
</div>
<div class="layout-body">
<div class="body-inner">
<transition name="el-fade-in-linear">
<router-view></router-view>
</transition>
</div>
</div>
<app-footer></app-footer>
</section>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import { AppHeader, AppFooter } from './components'
import { mapState, mapMutations } from 'vuex'
import { queryModuleByRoute } from '@/api/module'
export default {
name: 'AppLayout',
mixins: [loadConfig],
components: { AppHeader, AppFooter },
methods: {
...mapMutations(['SET_CURRENT_MODULE']),
getModule() {
queryModuleByRoute(this.route).then(res => {
this.SET_CURRENT_MODULE(res.data)
})
}
},
computed: {
...mapState(['currentModule']),
route() {
return this.$route.name
}
},
watch: {
route() {
this.getModule()
}
},
created() {
this.getModule()
}
}
</script>

15
portal_client/src/main.js Normal file
View File

@ -0,0 +1,15 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import Up from './plugins/up-kit'
Vue.config.productionTip = false
Vue.use(Up)
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')

View File

@ -0,0 +1,15 @@
import { mapState } from 'vuex'
export default {
data() {
return {
config: null
}
},
computed: {
...mapState(['appSetting'])
},
created() {
this.config = this.appSetting[this.$options.name]
}
}

View File

@ -0,0 +1,45 @@
import { mapState } from 'vuex'
import { queryByQuery } from '../api/article.js'
export default {
data() {
return {
articles: [],
currentPage: 1,
pageSize: 10,
total: 0
}
},
methods: {
getArticles() {
queryByQuery({
title: '',
author: '',
module: this.currentModule.name,
status: "'已发布'",
startDate: null,
endDate: null,
isDeleted: 0,
currentPage: this.currentPage,
pageSize: this.pageSize
}).then(res => {
this.articles = res.data.list
this.total = res.data.total
})
},
showMore() {
this.pageSize += 10
this.getArticles()
}
},
computed: {
...mapState(['currentModule'])
},
watch: {
currentModule() {
if (this.currentModule) {
this.getArticles()
}
}
}
}

View File

@ -0,0 +1,15 @@
import '../assets/vendor/font-awesome/css/font-awesome.css'
import '../assets/scss/up.scss'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import Element from 'element-ui'
import VueLazyload from 'vue-lazyload'
export default {
install(Vue) {
Vue.use(Element)
Vue.use(VueLazyload)
}
}

View File

@ -0,0 +1,105 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '../store'
import { getAppSetting } from '../utils/index'
import { queryAllModules } from '../api/module'
Vue.use(VueRouter)
const routes = [
{
path: '/',
redirect: { name: 'home' }
},
{
path: '/home',
name: 'home',
component: () => import('../views/home')
},
{
path: '/article/:id/:uuid',
name: 'article',
component: () => import('../views/article'),
props: true
},
{
path: '/teacher/:uuid',
name: 'teacher',
component: () => import('../views/teacher'),
props: true
},
{
path: '/student/:uuid',
name: 'studnet',
component: () => import('../views/student'),
props: true
},
{
path: '/error',
name: 'error',
component: () => import('../views/error')
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
scrollBehavior: () => ({ x: 0, y: 0 }),
routes
})
// 配置路由导航守卫
router.beforeEach((to, from, next) => {
// 如果路由不为空,则放行
if (store.state.allModules.length > 0) {
return next()
}
// 获取全局配置
getAppSetting()
// 获取菜单列表
queryAllModules()
.then(res => {
// 将菜单全局保存
store.commit('SET_ALL_MODULES', res.data)
var dynamicRoutes = []
// 递归生成路由
generateRoutes(dynamicRoutes, res.data)
// 添加布局组件路由
router.addRoute({
path: '/layout',
name: 'AppLayout',
component: () => import('../layout'),
children: dynamicRoutes
})
// 除已定义的路由其他路由全部跳转至404页面
router.addRoute({ path: '/*', redirect: { name: 'error' } })
// 确保动态路由已经完全加载上去
next({ ...to, replace: true })
})
.catch(() => {
next({ name: 'error' })
})
})
// 递归生成路由
function generateRoutes(dynamicRoutes, modules) {
modules.forEach(item => {
// 只有子菜单拥有路由和路由名称
if (item.path || item.routeName) {
dynamicRoutes.push({
path: item.path,
name: item.routeName,
component: () =>
Promise.resolve(
require(`@/views${item.component}`).default // 路径中不能包含.或..等
)
})
}
// 如果有子菜单,生成子菜单的路由
if (item.children) {
return generateRoutes(dynamicRoutes, item.children)
}
})
}
export default router

View File

@ -0,0 +1,25 @@
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
appSetting: {},
currentModule: {},
allModules: []
},
mutations: {
SET_APP_SETTING(state, appSetting) {
state.appSetting = appSetting
},
SET_CURRENT_MODULE(state, currentModule) {
state.currentModule = currentModule
},
SET_ALL_MODULES(state, allModules) {
state.allModules = allModules
}
},
actions: {},
modules: {}
})

View File

@ -0,0 +1,80 @@
/**
* 打开新标签页
* @param {String} href 网页链接
*/
export function openNewTab(href) {
if (!href) return
window.open(href, '_blank')
}
/**
* 日期格式化
* @param {String} date 待格式化日期
* @returns 格式化日期
*/
export function dateFormat1(date) {
// 待格式化日期
var dateObject = new Date(date)
// 现在
var nowDate = new Date()
const year =
dateObject.getFullYear() === nowDate.getFullYear()
? ''
: dateObject.getFullYear() + '-'
const month = prefixInteger(dateObject.getMonth() + 1, 2)
const day = prefixInteger(dateObject.getDate(), 2)
return `${year}${month}-${day}`
}
/**
* 日期格式化
* @param {String} date 待格式化日期
* @returns 格式化日期
*/
export function dateFormat2(date) {
// 待格式化日期
var dateObject = new Date(date)
var dateTime = dateObject.getTime()
// 现在
var nowDate = new Date()
// 今天23:59:59
var tonightTime = new Date(
`${nowDate.getFullYear()}-${nowDate.getMonth() +
1}-${nowDate.getDate()} 23:59:59`
).getTime()
// 一天的毫秒数
const oneDayTime = 24 * 60 * 60 * 1000
if (tonightTime - dateTime < oneDayTime) {
return '今天'
} else if (tonightTime - dateTime < 2 * oneDayTime) {
return '昨天'
} else if (tonightTime - dateTime < 3 * oneDayTime) {
return '前天'
} else if (tonightTime - dateTime < 4 * oneDayTime) {
return '三天前'
} else if (tonightTime - dateTime < 5 * oneDayTime) {
return '四天前'
} else if (tonightTime - dateTime < 6 * oneDayTime) {
return '五天前'
} else if (tonightTime - dateTime < 7 * oneDayTime) {
return '六天前'
} else if (tonightTime - dateTime < 14 * oneDayTime) {
return '一周前'
} else {
return `${
dateObject.getFullYear() === nowDate.getFullYear()
? ''
: dateObject.getFullYear() + '年'
}${dateObject.getMonth() + 1}月${dateObject.getDate()}`
}
}
/**
* 在数字前补0
* @param {Number} num 数字
* @param {Number} n 需要的字符长度
* @returns 补0后的数字
*/
function prefixInteger(num, n) {
return (Array(n).join(0) + num).slice(-n)
}

View File

@ -0,0 +1,12 @@
import { load } from '../api/config'
import store from '../store'
/**
* 获取全局配置
*/
export function getAppSetting() {
load().then(res => {
const appSetting = JSON.parse(res.data)
store.commit('SET_APP_SETTING', appSetting)
})
}

View File

@ -0,0 +1,25 @@
import axios from 'axios'
const service = axios.create({
baseURL: '/portal', // 配置请求的根路径
timeout: 5000
})
// 配置响应拦截器
service.interceptors.response.use(
res => {
console.log(res)
const status = res.data.code
const message = res.data.msg
if (status !== 0) {
return Promise.reject(new Error(message))
}
return res.data
},
error => {
console.log(error)
return Promise.reject(error)
}
)
export default service

View File

@ -0,0 +1,87 @@
<template>
<div>
<app-header effect="light"></app-header>
<div class="layout-body">
<div class="body-inner">
<!-- 文章标题 -->
<span class="article-title">{{ article.title }}</span>
<!-- 其他信息 -->
<div class="article-info">
<span v-if="article.author">{{ article.author.realName }}</span>
<span>{{ article.updateTime | dateFormat2 }}</span>
</div>
<!-- 分割线 -->
<el-divider></el-divider>
<!-- 文章内容 -->
<div v-html="article.content" class="article-content ql-editor"></div>
<!-- 文章附件 -->
<div v-if="article.files && article.files.length" class="article-file">
<div v-for="(item, index) in article.files" :key="index">
<el-link icon="el-icon-download" @click="openNewTab(item.url)">
附件{{ index + 1 }}{{ item.name }}
</el-link>
</div>
</div>
</div>
</div>
<app-footer></app-footer>
</div>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import { AppHeader, AppFooter } from '@/layout/components'
import { openNewTab, dateFormat2 } from '@/utils/common'
import { queryById } from '@/api/article'
export default {
name: 'AnArticle',
props: {
id: {
type: String,
default: '',
description: '文章id'
},
uuid: {
type: String,
default: '',
description: '文章uuid'
}
},
mixins: [loadConfig],
components: { AppHeader, AppFooter },
filters: {
dateFormat2
},
data() {
return {
article: {}
}
},
methods: {
openNewTab,
getArticle() {
queryById(this.id, this.uuid).then(res => {
if (res.data) {
this.article = res.data
} else {
this.$router.push('/error')
}
})
}
},
computed: {
path() {
return this.$route.path
}
},
watch: {
path() {
this.getArticle()
}
},
created() {
this.getArticle()
}
}
</script>

View File

@ -0,0 +1,21 @@
<template>
<card-list
class="card-view"
slot="body"
:data="articles"
:column="3"
:image-height="280"
></card-list>
</template>
<script>
import CardList from '@/components/CardList'
import loadConfig from '@/mixins/load-config'
import queryArticle from '@/mixins/query-article'
export default {
name: 'card-view',
mixins: [loadConfig, queryArticle],
components: { CardList }
}
</script>

View File

@ -0,0 +1,33 @@
<template>
<div>
<app-header effect="light"></app-header>
<section class="section-error">
<div>
<el-image src="/img/404.png"></el-image>
<h1>抱歉页面无法访问</h1>
<div>
您要查看的页面不存在建议您访问我们的
<el-link :underline="false" href="/">首页</el-link>
</div>
</div>
</section>
<app-footer></app-footer>
</div>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import { AppHeader, AppFooter } from '@/layout/components'
export default {
name: 'error',
mixins: [loadConfig],
components: {
AppHeader,
AppFooter
}
}
</script>
<style></style>

View File

@ -0,0 +1,95 @@
<template>
<div class="college">
<h1>{{ value }}</h1>
<el-divider></el-divider>
<el-row
v-for="line in Math.ceil(students.length / 3)"
:key="line"
:gutter="20"
>
<el-col
v-for="(item, index) in students.slice((line - 1) * 3, line * 3)"
:key="index"
:span="12"
>
<el-row
:gutter="10"
class="card"
@click.native="$router.push(item.path)"
>
<el-col :span="6">
<!-- 学生照片 -->
<!-- <el-image-->
<!-- :src="item.file.url"-->
<!-- :alt="item.name"-->
<!-- fit="scale-down"-->
<!-- ></el-image>-->
<img
:src="item.file.url"
:alt="item.name"
object-fit="scale-down"
width="110px"
height="155px"
/>
</el-col>
<el-col :span="18">
<!-- 学生姓名与学号 -->
<div>
<span class="teacher-name">{{ item.name }}</span>
<span class="el-icon--right">{{ item.stuId }}</span>
</div>
</el-col>
</el-row>
</el-col>
</el-row>
</div>
</template>
<script>
import { queryBySession } from '@/api/student'
export default {
name: 'Session',
props: {
value: {
default: '',
type: String,
description: '哪一届'
}
},
data() {
return {
students: []
}
},
methods: {
getStudents() {
queryBySession(this.value).then((res) => {
this.students = this.selectPost(res.data)
console.log(this.students)
})
},
selectPost(data) {
var res = []
for (var i = 0; i < data.length; i++) {
if (data[i].state === 0) res.push(data[i]) // 12
}
return res
}
},
watch: {
value: {
handler(val) {
if (val) {
this.getStudents()
}
},
deep: true,
immediate: true
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,32 @@
<template>
<div>
<template v-for="(item, index) in sessions">
<session :key="index" :value="item.toString()"></session>
</template>
</div>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import Session from './Session'
import { querySession } from '@/api/student'
export default {
name: 'StudentList',
mixins: [loadConfig],
components: { Session },
data() {
return {
sessions: []
}
},
created() {
querySession().then((res) => {
this.sessions = res.data
})
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,18 @@
<template>
<section class="carousel">
<el-carousel height="40vw" :interval="5000">
<el-carousel-item v-for="item in config" :key="item.id">
<el-image :src="item.url"></el-image>
</el-carousel-item>
</el-carousel>
</section>
</template>
<script>
import loadConfig from '@/mixins/load-config'
export default {
name: 'Carousel',
mixins: [loadConfig]
}
</script>

View File

@ -0,0 +1,39 @@
<template>
<section
class="chunk"
:class="[`chunk-${theme}`]"
:style="[
bgImage ? '' : `bg-image: url(${bgImage})`,
bgColor ? '' : `bg-color: ${bgColor}`,
'bg-size: contain'
]"
>
<div class="title">
<h1><slot></slot></h1>
</div>
<slot name="body"></slot>
</section>
</template>
<script>
export default {
name: 'Chunk',
props: {
theme: {
default: 'light',
type: String,
description: '主题light | dark'
},
'bg-image': {
default: '',
type: String,
description: '背景图片'
},
'bg-color': {
default: '',
type: String,
description: '背景颜色'
}
}
}
</script>

View File

@ -0,0 +1,29 @@
<template>
<chunk>
<card-list
slot="body"
:data="Array.from(config)"
:column="4"
:card-width="250"
:card-height="100"
:show-border="true"
:show-banner="false"
></card-list>
企业合作
</chunk>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import Chunk from '../Chunk'
import CardList from '@/components/CardList'
export default {
name: 'Cooperation',
mixins: [loadConfig],
components: {
Chunk,
CardList
}
}
</script>

View File

@ -0,0 +1,71 @@
<template>
<el-card class="news-item" shadow="never">
<div class="news-item-title">
<span>{{ module.name }}</span>
<el-link @click.native="$router.push(module.path)" :underline="false">
更多
<i class="el-icon-arrow-right"></i>
</el-link>
</div>
<ul>
<li v-for="(article, index) in list" :key="index">
<div>
<a @click="$router.push(article.path)">{{ article.title }}</a>
</div>
<span>{{ article.updateTime | dateFormat1 }}</span>
</li>
</ul>
</el-card>
</template>
<script>
import { openNewTab, dateFormat1 } from '@/utils/common'
import { queryByQuery } from '@/api/article'
export default {
name: 'Item',
props: {
module: {
type: Object,
description: '模块信息'
}
},
data() {
return {
list: []
}
},
methods: {
openNewTab,
getArticles() {
queryByQuery({
title: '',
author: '',
module: this.module.name,
status: "'已发布'",
startDate: null,
endDate: null,
isDeleted: 0,
currentPage: 1,
pageSize: 10
}).then(res => {
this.list = res.data.list
})
}
},
filters: {
dateFormat1
},
watch: {
module: {
handler(val) {
if (val) {
this.getArticles()
}
},
deep: true,
immediate: true
}
}
}
</script>

View File

@ -0,0 +1,26 @@
<template>
<chunk class="news">
<el-row :gutter="15" slot="body">
<el-col
:span="24 / config.length"
v-for="(item, index) in config"
:key="index"
>
<item :module="item"></item>
</el-col>
</el-row>
新闻中心
</chunk>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import Chunk from '../Chunk'
import Item from './Item'
export default {
name: 'News',
mixins: [loadConfig],
components: { Chunk, Item }
}
</script>

View File

@ -0,0 +1,29 @@
<template>
<chunk class="research">
<el-row :gutter="15" slot="body">
<el-col
:span="6"
v-for="(item, index) in Array.from(config)"
:key="index"
@click.native="$router.push(item.path)"
>
<div class="item">
<el-image :src="item.fileUrl"></el-image>
<span>{{ item.title }}</span>
</div>
</el-col>
</el-row>
科研动态
</chunk>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import Chunk from '../Chunk'
export default {
name: 'Research',
mixins: [loadConfig],
components: { Chunk }
}
</script>

View File

@ -0,0 +1,23 @@
<template>
<chunk class="team" theme="dark">
<card-list
slot="body"
:data="Array.from(config)"
:column="3"
:image-height="280"
></card-list>
科研团队
</chunk>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import Chunk from '../Chunk'
import CardList from '@/components/CardList'
export default {
name: 'Team',
components: { Chunk, CardList },
mixins: [loadConfig]
}
</script>

View File

@ -0,0 +1,5 @@
export { default as Carousel } from './Carousel'
export { default as Cooperation } from './Cooperation'
export { default as News } from './News'
export { default as Research } from './Research'
export { default as Team } from './Team'

View File

@ -0,0 +1,51 @@
<template>
<div>
<app-header effect="transparent"></app-header>
<component
v-for="(item, index) in components"
:key="index"
:is="item"
></component>
<app-footer></app-footer>
</div>
</template>
<script>
import loadConfig from '@/mixins/load-config'
import { AppHeader, AppFooter } from '@/layout/components'
import { Carousel, Cooperation, News, Research, Team } from './components'
import { queryComponents } from '@/api/component.js'
export default {
name: 'AppHome',
mixins: [loadConfig],
components: {
AppHeader,
AppFooter,
Carousel,
Cooperation,
News,
Research,
Team
},
data() {
return {
components: []
}
},
methods: {
getComponents() {
queryComponents().then(res => {
res.data.forEach(item => {
if (item.status) {
this.components.push(item.name)
}
})
})
}
},
created() {
this.getComponents()
}
}
</script>

Some files were not shown because too many files have changed in this diff Show More