提交 6dcbeb07 authored 作者: caijian's avatar caijian

first commit

上级
VITE_BASE_API= '/api'
\ No newline at end of file
# 线上地址
VITE_BASE_API= '/api'
\ No newline at end of file
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
# Dependencies
node_modules
.pnpm
.npm
# Build outputs
dist
dist-ssr
*.local
# Environment variables
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# OS generated files
Thumbs.db
.DS_Store
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Dependency directories
jspm_packages/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
# Storybook build outputs
.out
.storybook-out
# Temporary folders
tmp/
temp/
\ No newline at end of file
# Think Tank
一个基于 Vue 3 + Element Plus + Vue Router 的现代化前端项目模板。
## 技术栈
- **Vue 3** - 渐进式 JavaScript 框架
- **Element Plus** - 基于 Vue 3 的企业级 UI 组件库
- **Vue Router** - Vue.js 官方路由管理器
- **Vite** - 下一代前端构建工具
## 项目特性
- ✨ 使用 Vue 3 Composition API
- 🎨 集成 Element Plus UI 组件库
- 🚀 Vite 构建工具,开发体验极佳
- 📱 响应式设计,支持多种设备
- 🛣️ Vue Router 路由管理
- 🔧 自动导入配置,开发更高效
## 快速开始
### 安装依赖
```bash
npm install
```
### 启动开发服务器
```bash
npm run dev
```
### 构建生产版本
```bash
npm run build
```
### 预览生产构建
```bash
npm run preview
```
## 项目结构
```
think-tank/
├── src/
│ ├── components/ # 可复用组件
│ ├── views/ # 页面组件
│ ├── router/ # 路由配置
│ ├── App.vue # 根组件
│ └── main.js # 应用入口
├── package.json # 项目配置
├── vite.config.js # Vite 配置
└── index.html # HTML 模板
```
## 开发指南
### 添加新页面
1.`src/views/` 目录下创建新的 Vue 组件
2.`src/router/index.js` 中添加路由配置
3. 在导航菜单中添加链接
### 使用 Element Plus 组件
项目已配置自动导入,可以直接使用 Element Plus 组件:
```vue
<template>
<el-button type="primary">按钮</el-button>
<el-input v-model="input" placeholder="请输入内容"></el-input>
</template>
```
### 图标使用
项目已全局注册 Element Plus 图标,可以直接使用:
```vue
<template>
<el-icon><User /></el-icon>
</template>
<script setup>
import { User } from '@element-plus/icons-vue'
</script>
```
## 浏览器支持
- Chrome >= 87
- Firefox >= 78
- Safari >= 14
- Edge >= 88
## 许可证
MIT License
\ No newline at end of file
File added
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>某方向风险监测预警系统</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
\ No newline at end of file
{
"compilerOptions": {
"baseUrl": "src",
"paths": {
"@/*": ["*"]
},
"target": "esnext",
"module": "esnext",
"moduleResolution": "node",
"allowJs": true,
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "think-tank",
"version": "1.0.0",
"description": "Vue3 + Element Plus + Vue Router 项目",
"main": "index.js",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"serve": "vite preview"
},
"keywords": [
"vue3",
"element-plus",
"vue-router",
"vite"
],
"author": "",
"license": "MIT",
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"axios": "^1.12.2",
"echarts": "^5.4.3",
"echarts-wordcloud": "^2.1.0",
"element-plus": "^2.4.4",
"vue": "^3.4.0",
"vue-router": "^4.2.5"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.0.0",
"sass": "^1.92.1",
"unplugin-auto-import": "^0.17.0",
"unplugin-vue-components": "^0.26.0",
"vite": "^5.0.0"
}
}
<template>
<div id="app">
<el-container>
<el-header>
<nav class="navbar">
<div class="nav-brand">
<el-icon class="brand-icon"><Monitor /></el-icon>
<span class="brand-text">某方向风险监测预警系统</span>
</div>
<div class="nav-menu">
<el-dropdown @command="handleHomeCommand" class="home-dropdown">
<div class="nav-link dropdown-trigger">
<el-icon><House /></el-icon>
<span>首页</span>
<el-icon class="dropdown-arrow"><ArrowDown /></el-icon>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="/">智库首页</el-dropdown-item>
<el-dropdown-item command="/billHome">法案首页</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<div class="nav-link">
<el-icon><User /></el-icon>
<span>国家</span>
</div>
<div class="nav-link">
<el-icon><Location /></el-icon>
<span>领域</span>
</div>
<div class="nav-link">
<el-icon><Document /></el-icon>
<span>要素</span>
</div>
<div class="nav-link">
<el-icon><Bell /></el-icon>
<span>事件</span>
</div>
</div>
<div class="user-info">
<el-icon><Message /></el-icon>
<el-icon><User /></el-icon>
<span>管理员</span>
</div>
</nav>
</el-header>
<el-main class="main-container">
<router-view />
</el-main>
</el-container>
</div>
</template>
<script setup>
import { Monitor, House, User, Location, Document, Bell, Message, ArrowDown } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
const router = useRouter()
const handleHomeCommand = (command) => {
router.push(command)
}
</script>
<style>
/* 全局样式重置 */
* {
box-sizing: border-box;
}
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
body {
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
}
</style>
<style scoped>
#app {
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
width: 100%;
min-height: 100vh;
}
/* 确保Element Plus容器组件占满宽度 */
.el-container {
width: 100%;
min-height: 100vh;
}
.navbar {
display: flex;
justify-content: center;
align-items: center;
padding: 0 24px;
background: white;
color: #333;
height: 100%;
border-bottom: 1px solid #e5e7eb;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
position: relative;
}
.main-container {
/* 移除宽度限制,让子页面自己控制布局 */
width: 100%;
}
.nav-brand {
display: flex;
align-items: center;
gap: 12px;
position: absolute;
left: 24px;
}
.brand-icon {
font-size: 24px;
color: #1e3a8a;
}
.brand-text {
font-size: 18px;
font-weight: 600;
color: #333;
}
.nav-menu {
display: flex;
align-items: center;
gap: 32px;
}
.nav-link {
display: flex;
align-items: center;
gap: 6px;
color: #333;
text-decoration: none;
padding: 8px 12px;
border-radius: 6px;
transition: all 0.3s;
font-size: 14px;
cursor: pointer;
}
.nav-link:hover,
.nav-link.router-link-active {
background-color: #1459BB;
color: #fff;
}
.home-dropdown {
display: inline-block;
}
.dropdown-trigger {
cursor: pointer;
}
.dropdown-arrow {
font-size: 12px;
margin-left: 4px;
transition: transform 0.3s;
}
.home-dropdown:hover .dropdown-arrow {
transform: rotate(180deg);
}
.user-info {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
background: #f3f4f6;
border-radius: 6px;
color: #333;
position: absolute;
right: 24px;
}
.el-header {
padding: 0;
height: 60px;
}
.el-main {
padding: 0;
min-height: calc(100vh - 60px);
background-color: rgba(246, 251, 255, 1);
}
</style>
\ No newline at end of file
## 根据智库ID获取智库基本信息
**接口地址**:`/thinkTankInfo/basic/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«ThinkTankBasicInfoVO»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|ThinkTankBasicInfoVO|ThinkTankBasicInfoVO|
|&emsp;&emsp;country|国家|string||
|&emsp;&emsp;foundingDate|成立时间|string||
|&emsp;&emsp;position|位置|string||
|&emsp;&emsp;nature|机构性质|string||
|&emsp;&emsp;memnum|成员数|integer(int64)||
|&emsp;&emsp;budget|年度预算|number||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": {
"country": "",
"foundingDate": "",
"position": "",
"nature": "",
"memnum": 0,
"budget": 0
}
}
```
## 根据智库ID获取分支机构信息
**接口地址**:`/thinkTankInfo/branch/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«ThinkTankBranchVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|ThinkTankBranchVO|
|&emsp;&emsp;city|城市|string||
|&emsp;&emsp;area|区域|string||
|&emsp;&emsp;hq|是否总部|boolean||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"city": "",
"area": "",
"hq": true
}
]
}
```
## 根据智库ID获取经费来源
**接口地址**:`/thinkTankInfo/fundsSource/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«ThinkTankFundsSourceVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|ThinkTankFundsSourceVO|
|&emsp;&emsp;amount|金额|number||
|&emsp;&emsp;institution|机构|string||
|&emsp;&emsp;percent|占比|integer(int32)||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"amount": 0,
"institution": "",
"percent": 0
}
]
}
```
## 根据智库ID获取经费统计
**接口地址**:`/thinkTankInfo/fundsTotal/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«ThinkTankFundsTotalVO»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|ThinkTankFundsTotalVO|ThinkTankFundsTotalVO|
|&emsp;&emsp;totalJe|总金额|number||
|&emsp;&emsp;zfJe|政府资金|number||
|&emsp;&emsp;otherJe|非政府资金|number||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": {
"totalJe": 0,
"zfJe": 0,
"otherJe": 0
}
}
```
## 根据智库ID获取成员列表
**接口地址**:`/thinkTankInfo/person/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«ThinkTankPersonVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|ThinkTankPersonVO|
|&emsp;&emsp;name|姓名|string||
|&emsp;&emsp;describe|描述|string||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"name": "",
"describe": ""
}
]
}
```
## 根据智库ID获取政策情况
**接口地址**:`/thinkTankInfo/policy/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|researchTypeIds|研究类型ID列表|query|false|array|string|
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«ThinkTankPolicyCountVO»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|ThinkTankPolicyCountVO|ThinkTankPolicyCountVO|
|&emsp;&emsp;statusVoList|状态列表|array|ThinkTankStatusVO|
|&emsp;&emsp;&emsp;&emsp;statusName|状态名称||false|string||
|&emsp;&emsp;&emsp;&emsp;statusNum|状态数量||false|integer(int64)||
|&emsp;&emsp;policyVoList|政策列表|array|ThinkTankPolicyVO|
|&emsp;&emsp;&emsp;&emsp;content|政策内容||false|string||
|&emsp;&emsp;&emsp;&emsp;status|政策状态||false|string||
|&emsp;&emsp;&emsp;&emsp;reportId|报告id||false|integer(int64)||
|&emsp;&emsp;&emsp;&emsp;name|报告名称||false|string||
|&emsp;&emsp;&emsp;&emsp;times|报告时间||false|string(date)||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": {
"statusVoList": [
{
"statusName": "",
"statusNum": 0
}
],
"policyVoList": [
{
"content": "",
"status": "",
"reportId": 0,
"name": "",
"times": ""
}
]
}
}
```
## 根据智库ID获取政策情况
**接口地址**:`/thinkTankInfo/policy/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|researchTypeIds|研究类型ID列表|query|false|array|string|
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«ThinkTankPolicyCountVO»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|ThinkTankPolicyCountVO|ThinkTankPolicyCountVO|
|&emsp;&emsp;statusVoList|状态列表|array|ThinkTankStatusVO|
|&emsp;&emsp;&emsp;&emsp;statusName|状态名称||false|string||
|&emsp;&emsp;&emsp;&emsp;statusNum|状态数量||false|integer(int64)||
|&emsp;&emsp;policyVoList|政策列表|array|ThinkTankPolicyVO|
|&emsp;&emsp;&emsp;&emsp;content|政策内容||false|string||
|&emsp;&emsp;&emsp;&emsp;status|政策状态||false|string||
|&emsp;&emsp;&emsp;&emsp;reportId|报告id||false|integer(int64)||
|&emsp;&emsp;&emsp;&emsp;name|报告名称||false|string||
|&emsp;&emsp;&emsp;&emsp;times|报告时间||false|string(date)||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": {
"statusVoList": [
{
"statusName": "",
"statusNum": 0
}
],
"policyVoList": [
{
"content": "",
"status": "",
"reportId": 0,
"name": "",
"times": ""
}
]
}
}
```
## 获取智库报告类型列表
**接口地址**:`/thinkTankInfo/reportType`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«DThinkTankReportType»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|DThinkTankReportType|
|&emsp;&emsp;id|主键|integer(int64)||
|&emsp;&emsp;typeId|报告类型id|string||
|&emsp;&emsp;typeName|报告类型|string||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"id": 0,
"typeId": "",
"typeName": ""
}
]
}
```
## 根据智库ID获取研究领域情况
**接口地址**:`/thinkTankInfo/researchArea/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«ThinkTankResearchAreaVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|ThinkTankResearchAreaVO|
|&emsp;&emsp;describe|研究领域描述|string||
|&emsp;&emsp;time|研究时间范围|string||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"describe": "",
"time": ""
}
]
}
```
## 根据智库ID获取研究领域情况
**接口地址**:`/thinkTankInfo/researchArea/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«ThinkTankResearchAreaVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|ThinkTankResearchAreaVO|
|&emsp;&emsp;describe|研究领域描述|string||
|&emsp;&emsp;time|研究时间范围|string||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"describe": "",
"time": ""
}
]
}
```
## 根据智库ID获取智库全局信息
**接口地址**:`/thinkTankInfo/summary/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|智库id|path|false|integer(int64)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«ThinkTankInfoVO»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|ThinkTankInfoVO|ThinkTankInfoVO|
|&emsp;&emsp;name|智库名称|string||
|&emsp;&emsp;describe|智库描述|string||
|&emsp;&emsp;ename|智库英文名|string||
|&emsp;&emsp;url|智库网址|string||
|&emsp;&emsp;tags|智库标签|array|string|
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": {
"name": "",
"describe": "",
"ename": "",
"url": "",
"tags": []
}
}
```
## 根据报告ID获取报告内容
**接口地址**:`/thinkTankReport/content/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|报告id|path|true|integer(int64)||
|currentPage|当前页码|query|false|integer(int32)||
|pageSize|分页大小|query|false|integer(int32)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«Page«ThinkTankReportContentVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|Page«ThinkTankReportContentVO»|Page«ThinkTankReportContentVO»|
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": {}
}
```
## 根据报告ID获取政策情况
**接口地址**:`/thinkTankReport/policy/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|报告id|path|false|integer(int64)||
|statusList|政策状态ID列表|query|false|array|string|
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«ThinkTankReportPolicyVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|ThinkTankReportPolicyVO|
|&emsp;&emsp;content|政策内容|string||
|&emsp;&emsp;status|政策状态|string||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"content": "",
"status": ""
}
]
}
```
## 根据报告ID获取报告全局信息
**接口地址**:`/thinkTankReport/summary/{id}`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|id|报告id|path|false|integer(int64)||
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«ThinkTankReportDetailVO»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|ThinkTankReportDetailVO|ThinkTankReportDetailVO|
|&emsp;&emsp;name|报告名称|string||
|&emsp;&emsp;times|报告时间|string(date)||
|&emsp;&emsp;ename|报告英文名称|string||
|&emsp;&emsp;summary|报告摘要|string||
|&emsp;&emsp;thinkTankName|智库名称|string||
|&emsp;&emsp;tags|报告标签|array|string|
|&emsp;&emsp;researchTypes|报告研究类型|array|string|
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": {
"name": "",
"times": "",
"ename": "",
"summary": "",
"thinkTankName": "",
"tags": [],
"researchTypes": []
}
}
```
## 获取概览智库政策
**接口地址**:`/thinkTankOverview/policy`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|researchTypeIds|研究类型ID列表|query|false|array|string|
|statusList|政策状态ID列表|query|false|array|string|
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«ThinkTankPolicyVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|ThinkTankPolicyVO|
|&emsp;&emsp;content|政策内容|string||
|&emsp;&emsp;status|政策状态|string||
|&emsp;&emsp;reportId|报告id|integer(int64)||
|&emsp;&emsp;name|报告名称|string||
|&emsp;&emsp;times|报告时间|string(date)||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"content": "",
"status": "",
"reportId": 0,
"name": "",
"times": ""
}
]
}
```
## 获取概览智库报告
**接口地址**:`/thinkTankOverview/report`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|areas|区域名称列表|query|false|array|string|
|researchTypeIds|研究类型ID列表|query|false|array|string|
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«ThinkTankSummaryReportVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|ThinkTankSummaryReportVO|
|&emsp;&emsp;id|报告id|integer(int64)||
|&emsp;&emsp;name|报告名称|string||
|&emsp;&emsp;times|报告时间|string(date)||
|&emsp;&emsp;thinkTankName|智库名称|string||
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"id": 0,
"name": "",
"times": "",
"thinkTankName": ""
}
]
}
```
## 获取智库列表
**接口地址**:`/thinkTankOverview/thinkTanks`
**请求方式**:`GET`
**请求数据类型**:`*`
**响应数据类型**:`*/*`
**接口描述**:
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|token|Token Request Header|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK|返回参数«List«ThinkTankListVO»»|
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|响应码|integer(int32)|integer(int32)|
|message|响应消息|string||
|success|是否成功|boolean||
|data|响应数据|array|ThinkTankListVO|
|&emsp;&emsp;id|智库id|integer(int64)||
|&emsp;&emsp;name|智库名称|string||
|&emsp;&emsp;describe|智库描述|string||
|&emsp;&emsp;country|智库国家|string||
|&emsp;&emsp;tags|智库标签|array|string|
**响应示例**:
```javascript
{
"code": 0,
"message": "",
"success": true,
"data": [
{
"id": 0,
"name": "",
"describe": "",
"country": "",
"tags": []
}
]
}
```
\ No newline at end of file
import request from "@/api/request.js";
// 基本信息-根据法案ID获取法案信息
/**
* @param {id}
*/
export function getBillInfo(params) {
return request({
method: 'GET',
url: `/billInfoBean/info/${params.id}`,
params,
})
}
// 提出人-根据动议ID获取对应的提出人信息
/**
* @param {id}
* @header token
*/
export function getBillPerson(params) {
return request({
method: 'GET',
url: `/billInfoBean/person/${params.id}`,
params,
})
}
// 法案进程、相关事件(最新进展)-根据法案ID获取事件信息
/**
* @param {id}
* @header token
*/
export function getBillEvent(params) {
return request({
method: 'GET',
url: `/billInfoBean/event/${params.id}`,
params,
})
}
// 法案进程(前期进展)-根据法案ID获取动议流程
/**
* @param {id}
* @header token
*/
export function getBillDyqk(params) {
return request({
method: 'GET',
url: `/billInfoBean/dyqk/${params.id}`,
params,
})
}
// 立法背景-根据法案ID获取背景内容
/**
* @param {id,cRelated,currentPage,pageSize}
* @header token
*/
export function getBillBackground(params) {
return request({
method: 'GET',
url: `/billInfoBean/background/${params.id}`,
params,
})
}
// 议员相关性-根据法案ID获取议员分析信息(现在只包括名称 支持 反对,没有标签和事件动态)
/**
* @param {id, isOppose}
* @header token
*/
export function getBillPersonAnalyze(params) {
return request({
method: 'GET',
url: `/billInfoBean/personAnalyze/${params.id}`,
params,
})
}
// 主要条款-根据法案ID获取原文id列表
/**
* @param {id}
* @header token
*/
export function getBillContentId(params) {
return request({
method: 'GET',
url: `/billInfoBean/contentId/${params.id}`,
params,
})
}
// 主要条款-根据原文ID获取条款内容
/**
* @param {id,cRelated,currentPage,pageSize}
* @header token
*/
export function getBillContentTk(params) {
return request({
method: 'GET',
url: `/billInfoBean/content/tk/${params.id}`,
params,
})
}
// 限制方式-根据法案原文ID获取限制方式列表
/**
* @param {id}
* @header token
*/
export function getBillContentXzfs(params) {
return request({
method: 'GET',
url: `/billInfoBean/content/xzfs/${params.id}`,
params,
})
}
// 涉及行业-根据法案原文ID获取行业领域列表
/**
* @param {id}
* @header token
*/
export function getBillHyly(params) {
return request({
method: 'GET',
url: `/billInfoBean/content/hyly/${params.id}`,
params,
})
}
\ No newline at end of file
import request from "@/api/request.js";
// 根据法案ID获取耗时分析
/**
* @param {id}
*/
export function getBillTimeAnalyze(params) {
return request({
method: 'GET',
url: `/billDeepDive/processAnalyze/time/${params.id}`,
params,
})
}
// 根据法案ID获取党派政治献金
/**
* @param {id, personCongress}
*/
export function getBillTotalXj(params) {
return request({
method: 'GET',
url: `/billDeepDive/processAnalyze/totalxj/${params.id}`,
params,
})
}
// 根据法案ID获取投票情况
/**
* @param {id}
*/
export function getBillTp(params) {
return request({
method: 'GET',
url: `/billDeepDive/processAnalyze/tp/${params.id}`,
params,
})
}
// 根据法案ID获取政治献金
/**
* @param {id, personCongress}
*/
export function getBillXj(params) {
return request({
method: 'GET',
url: `/billDeepDive/processAnalyze/xj/${params.id}`,
params,
})
}
// 根据动议ID获取动议详细信息
/**
* @param {id}
*/
export function getProcessSummaryDetail(params) {
return request({
method: 'GET',
url: `/billDeepDive/processSummary/detail/${params.id}`,
params,
})
}
// 根据动议ID获取条款内容
/**
* @param {id,cRelated,currentPage,pageSize}
*/
export function getProcessSummaryTk(params) {
return request({
method: 'GET',
url: `/billDeepDive/processSummary/tk/${params.id}`,
params,
})
}
// 根据动议ID获取动议流程
/**
* @param {id}
*/
export function getProcessSummary(params) {
return request({
method: 'GET',
url: `/billDeepDive/processSummary/${params.id}`,
params,
})
}
\ No newline at end of file
import request from "@/api/request.js";
// 获取热门法案列表
export function getHotBills() {
return request({
method: 'GET',
url: '/BillOverview/hotBills',
})
}
// 根据法案类型获取法案列表
/**
* @param {type}
*/
export function getBillsByType(params) {
return request({
method: 'GET',
url: '/BillOverview/bills',
params,
})
}
// 根据行业领域字典列表
export function getHylyList() {
return request({
method: 'GET',
url: `/billImpactAnalysis/industry/hylyList`,
})
}
\ No newline at end of file
import http from './request'
/**
* 智库信息相关的API接口
* 假设您有一个名为 'http' 的对象来处理请求,且已在 http 封装中处理了 token。
* 例如:
* import http from '@/utils/request';
*/
// --- 智库信息接口 ---
/**
* @description 根据智库ID获取智库基本信息
* @param {object} params - 请求参数
* @param {number|string} params.id - 智库id (路径参数, 必须)
* @returns {Promise<object>} 响应数据,data字段类型为 ThinkTankBasicInfoVO
* @returns {string} data.country - 国家
* @returns {string} data.foundingDate - 成立时间
* @returns {string} data.position - 位置
* @returns {string} data.nature - 机构性质
* @returns {number} data.memnum - 成员数
* @returns {number} data.budget - 年度预算
*/
export const getThinkTankBasicInfo = (params) => {
// 假设 http 封装中会自动处理 token
return http.get(`/thinkTankInfo/basic/${params.id}`);
}
/**
* @description 根据智库ID获取分支机构信息
* @param {object} params - 请求参数
* @param {number|string} params.id - 智库id (路径参数, 必须)
* @returns {Promise<object>} 响应数据,data字段为数组 List<ThinkTankBranchVO>
* @returns {Array<object>} data[] - 分支机构列表
* @returns {string} data[].city - 城市
* @returns {string} data[].area - 区域
* @returns {boolean} data[].hq - 是否总部
*/
export const getThinkTankBranchInfo = (params) => {
return http.get(`/thinkTankInfo/branch/${params.id}`);
}
/**
* @description 根据智库ID获取经费来源
* @param {object} params - 请求参数
* @param {number|string} params.id - 智库id (路径参数, 必须)
* @returns {Promise<object>} 响应数据,data字段为数组 List<ThinkTankFundsSourceVO>
* @returns {Array<object>} data[] - 经费来源列表
* @returns {number} data[].amount - 金额
* @returns {string} data[].institution - 机构
* @returns {number} data[].percent - 占比
*/
export const getThinkTankFundsSource = (params) => {
return http.get(`/thinkTankInfo/fundsSource/${params.id}`);
}
/**
* @description 根据智库ID获取经费统计
* @param {object} params - 请求参数
* @param {number|string} params.id - 智库id (路径参数, 必须)
* @returns {Promise<object>} 响应数据,data字段类型为 ThinkTankFundsTotalVO
* @returns {number} data.totalJe - 总金额
* @returns {number} data.zfJe - 政府资金
* @returns {number} data.otherJe - 非政府资金
*/
export const getThinkTankFundsTotal = (params) => {
return http.get(`/thinkTankInfo/fundsTotal/${params.id}`);
}
/**
* @description 根据智库ID获取成员列表
* @param {object} params - 请求参数
* @param {number|string} params.id - 智库id (路径参数, 必须)
* @returns {Promise<object>} 响应数据,data字段为数组 List<ThinkTankPersonVO>
* @returns {Array<object>} data[] - 成员列表
* @returns {string} data[].name - 姓名
* @returns {string} data[].describe - 描述
*/
export const getThinkTankPersonList = (params) => {
return http.get(`/thinkTankInfo/person/${params.id}`);
}
/**
* @description 根据智库ID获取政策情况
* @param {object} params - 请求参数
* @param {number|string} params.id - 智库id (路径参数, 必须)
* @param {Array<string>} [params.researchTypeIds] - 研究类型ID列表 (Query参数)
* @returns {Promise<object>} 响应数据,data字段类型为 ThinkTankPolicyCountVO
* @returns {Array<object>} data.statusVoList[] - 状态列表
* @returns {string} data.statusVoList[].statusName - 状态名称
* @returns {number} data.statusVoList[].statusNum - 状态数量
* @returns {Array<object>} data.policyVoList[] - 政策列表
* @returns {string} data.policyVoList[].content - 政策内容
* @returns {string} data.policyVoList[].status - 政策状态
* @returns {number} data.policyVoList[].reportId - 报告id
* @returns {string} data.policyVoList[].name - 报告名称
* @returns {string} data.policyVoList[].times - 报告时间 (date格式)
*/
export const getThinkTankPolicyInfo = (params) => {
const { id, ...queryParams } = params;
// 假设 http.get 会将 queryParams 作为查询参数传递
return http.get(`/thinkTankInfo/policy/${id}`, { params: queryParams });
}
/**
* @description 获取智库报告类型列表
* @returns {Promise<object>} 响应数据,data字段为数组 List<DThinkTankReportType>
* @returns {Array<object>} data[] - 报告类型列表
* @returns {number} data[].id - 主键
* @returns {string} data[].typeId - 报告类型id
* @returns {string} data[].typeName - 报告类型
*/
export const getThinkTankReportTypeList = () => {
return http.get('/thinkTankInfo/reportType');
}
/**
* @description 根据智库ID获取研究领域情况
* @param {object} params - 请求参数
* @param {number|string} params.id - 智库id (路径参数, 必须)
* @returns {Promise<object>} 响应数据,data字段为数组 List<ThinkTankResearchAreaVO>
* @returns {Array<object>} data[] - 研究领域列表
* @returns {string} data[].describe - 研究领域描述
* @returns {string} data[].time - 研究时间范围
*/
export const getThinkTankResearchArea = (params) => {
return http.get(`/thinkTankInfo/researchArea/${params.id}`);
}
// /thinkTankInfo/report/{id}
export const getThinkTankReport = (params) => {
return http.get(`/thinkTankInfo/report/${params.id}`);
}
/**
* @description 根据智库ID获取智库全局信息
* @param {object} params - 请求参数
* @param {number|string} params.id - 智库id (路径参数, 必须)
* @returns {Promise<object>} 响应数据,data字段类型为 ThinkTankInfoVO
* @returns {string} data.name - 智库名称
* @returns {string} data.describe - 智库描述
* @returns {string} data.ename - 智库英文名
* @returns {string} data.url - 智库网址
* @returns {Array<string>} data.tags[] - 智库标签列表
*/
export const getThinkTankSummary = (params) => {
return http.get(`/thinkTankInfo/summary/${params.id}`);
}
// --- 智库报告接口 ---
/**
* @description 根据报告ID获取报告内容
* @param {object} params - 请求参数
* @param {number|string} params.id - 报告id (路径参数, 必须)
* @param {number} [params.currentPage] - 当前页码 (Query参数)
* @param {number} [params.pageSize] - 分页大小 (Query参数)
* @returns {Promise<object>} 响应数据,data字段类型为 Page<ThinkTankReportContentVO> (分页内容对象)
*/
export const getThinkTankReportContent = (params) => {
const { id, ...queryParams } = params;
return http.get(`/thinkTankReport/content/${id}`, { params: queryParams });
}
/**
* @description 根据报告ID获取政策情况
* @param {object} params - 请求参数
* @param {number|string} params.id - 报告id (路径参数, 必须)
* @param {Array<string>} [params.statusList] - 政策状态ID列表 (Query参数)
* @returns {Promise<object>} 响应数据,data字段为数组 List<ThinkTankReportPolicyVO>
* @returns {Array<object>} data[] - 政策列表
* @returns {string} data[].content - 政策内容
* @returns {string} data[].status - 政策状态
*/
export const getThinkTankReportPolicy = (params) => {
const { id, ...queryParams } = params;
return http.get(`/thinkTankReport/policy/${id}`, { params: queryParams });
}
/**
* @description 根据报告ID获取报告全局信息
* @param {object} params - 请求参数
* @param {number|string} params.id - 报告id (路径参数, 必须)
* @returns {Promise<object>} 响应数据,data字段类型为 ThinkTankReportDetailVO
* @returns {string} data.name - 报告名称
* @returns {string} data.times - 报告时间 (date格式)
* @returns {string} data.ename - 报告英文名称
* @returns {string} data.summary - 报告摘要
* @returns {string} data.thinkTankName - 智库名称
* @returns {Array<string>} data.tags[] - 报告标签列表
* @returns {Array<string>} data.researchTypes[] - 报告研究类型列表
*/
export const getThinkTankReportSummary = (params) => {
return http.get(`/thinkTankReport/summary/${params.id}`);
}
// --- 智库概览接口 ---
/**
* @description 获取概览智库政策
* @param {object} [params] - 请求参数
* @param {Array<string>} [params.researchTypeIds] - 研究类型ID列表 (Query参数)
* @param {Array<string>} [params.statusList] - 政策状态ID列表 (Query参数)
* @returns {Promise<object>} 响应数据,data字段为数组 List<ThinkTankPolicyVO>
* @returns {Array<object>} data[] - 政策列表
* @returns {string} data[].content - 政策内容
* @returns {string} data[].status - 政策状态
* @returns {number} data[].reportId - 报告id
* @returns {string} data[].name - 报告名称
* @returns {string} data[].times - 报告时间 (date格式)
*/
export const getOverviewPolicy = (params = {}) => {
// 假设 http.get 会将 params 作为查询参数传递
return http.get('/thinkTankOverview/policy', { params });
}
/**
* @description 获取概览智库报告
* @param {object} [params] - 请求参数
* @param {Array<string>} [params.areas] - 区域名称列表 (Query参数)
* @param {Array<string>} [params.researchTypeIds] - 研究类型ID列表 (Query参数)
* @returns {Promise<object>} 响应数据,data字段为数组 List<ThinkTankSummaryReportVO>
* @returns {Array<object>} data[] - 报告列表
* @returns {number} data[].id - 报告id
* @returns {string} data[].name - 报告名称
* @returns {string} data[].times - 报告时间 (date格式)
* @returns {string} data[].thinkTankName - 智库名称
*/
export const getOverviewReport = (params = {}) => {
return http.get('/thinkTankOverview/report', { params });
}
/**
* @description 获取智库列表
* @returns {Promise<object>} 响应数据,data字段为数组 List<ThinkTankListVO>
* @returns {Array<object>} data[] - 智库列表
* @returns {number} data[].id - 智库id
* @returns {string} data[].name - 智库名称
* @returns {string} data[].describe - 智库描述
* @returns {string} data[].country - 智库国家
* @returns {Array<string>} data[].tags[] - 智库标签列表
*/
export const getThinkTankList = () => {
return http.get('/thinkTankOverview/thinkTanks');
}
// 获取智库报告研究类型 /thinkTankInfo/researchType
export const getThinkTankResearchType = () => {
return http.get('/thinkTankInfo/researchType');
}
import request from "@/api/request.js";
// 根据行业领域id获取公司列表
/**
* @param {id}
*/
export function getCompanyList(params) {
return request({
method: 'GET',
url: `/billImpactAnalysis/industry/company/${params.id}`,
params,
})
}
// 根据法案id获取行业领域统计
/**
* @param {id}
*/
export function getIndustryHyly(params) {
return request({
method: 'GET',
url: `/billImpactAnalysis/industry/hyly/${params.id}`,
params,
})
}
// 根据行业领域字典列表
export function getHylyList() {
return request({
method: 'GET',
url: `/billImpactAnalysis/industry/hylyList`,
})
}
\ No newline at end of file
export const policyList = [
{
id: 1,
imageUrl: 'https://picsum.photos/60/80?random=101',
title: '允许OPT国际学生出境旅行并持多次入境签证重新进入美国。',
date: '2025年6月24日',
source: '中美经济竞争:复杂经济和地缘政治关系中的收益与风险',
tags: ['人才交流', '移民政策'],
status: 'implemented',
relatedBill: { text: '相关立法已通过:《2024值得关注的国会人口结构法案》' }
},
{
id: 2,
imageUrl: 'https://picsum.photos/60/80?random=102',
title: '增加中国公民可获得的 H-1B 签证数量。',
date: '2025年6月24日',
source: '中美经济竞争:复杂经济和地缘政治关系中的收益与风险',
tags: ['人才交流', '移民政策'],
status: 'unimplemented',
relatedBill: null
},
{
id: 3,
imageUrl: 'https://picsum.photos/60/80?random=103',
title: '通过职业偏好类别增加绿卡的数量。',
date: '2025年6月24日',
source: '中美经济竞争:复杂经济和地缘政治关系中的收益与风险',
tags: ['人才交流', '移民政策'],
status: 'partial',
relatedBill: { text: '存在相关提案:《2024调整签证以吸引国外顶尖人才法案》' }
},
{
id: 4,
imageUrl: 'https://picsum.photos/60/80?random=104',
title: '推动清洁能源生产的内用,化石燃料重新配置出口。',
date: '2025年6月24日',
source: '中美经济竞争:复杂经济和地缘政治关系中的收益与风险',
tags: ['能源政策', '环境保护'],
status: 'partial',
relatedBill: { text: '存在相关提案:《2024清洁能源转型促进法案》' }
},
{
id: 5,
imageUrl: 'https://picsum.photos/60/80?random=105',
title: '加强对关键技术出口的管制措施。',
date: '2025年6月24日',
source: '中美经济竞争:复杂经济和地缘政治关系中的收益与风险',
tags: ['技术安全', '出口管制'],
status: 'implemented',
relatedBill: { text: '相关立法已通过:《2024关键技术保护法案》' }
},
{
id: 6,
imageUrl: 'https://picsum.photos/60/80?random=106',
title: '建立多边技术合作框架,促进盟友间技术共享。',
date: '2025年6月23日',
source: '中美经济竞争:复杂经济和地缘政治关系中的收益与风险',
tags: ['国际合作', '技术共享'],
status: 'unimplemented',
relatedBill: null
},
{
id: 7,
imageUrl: 'https://picsum.photos/60/80?random=107',
title: '完善供应链韧性,减少对单一国家的依赖。',
date: '2025年6月23日',
source: '中美经济竞争:复杂经济和地缘政治关系中的收益与风险',
tags: ['供应链', '经济安全'],
status: 'partial',
relatedBill: { text: '存在相关提案:《2024供应链韧性提升法案》' }
},
{
id: 8,
imageUrl: 'https://picsum.photos/60/80?random=108',
title: '加大对新兴技术研发的投资力度。',
date: '2025年6月22日',
source: '中美经济竞争:复杂经济和地缘政治关系中的收益与风险',
tags: ['科技投资', '研发创新'],
status: 'implemented',
relatedBill: { text: '相关立法已通过:《2024科技创新投资法案》' }
}
]
export const corePersom = [
{
id: 1,
name: '杰森·马西尼',
position: '兰德公司总裁兼首席执行官',
avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop&crop=face'
},
{
id: 2,
name: '安德鲁·R·霍恩',
position: '高级副总裁,研究与分析',
avatar: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=100&h=100&fit=crop&crop=face'
},
{
id: 3,
name: '杰森·马西尼',
position: '兰德公司总裁兼首席执行官',
avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop&crop=face'
},
{
id: 4,
name: '梅丽莎·罗',
position: '副总裁,全球研究人才政策分析数据政策分析政策学院',
avatar: 'https://images.unsplash.com/photo-1494790108755-2616b612b786?w=100&h=100&fit=crop&crop=face'
},
{
id: 5,
name: '梅丽莎·罗',
position: '副总裁,全球研究人才政策分析数据政策分析政策学院',
avatar: 'https://images.unsplash.com/photo-1494790108755-2616b612b786?w=100&h=100&fit=crop&crop=face'
},
{
id: 6,
name: '安妮塔·钱德拉',
position: '副总裁兼主任,兰德社会经济福利,高级政策研究员',
avatar: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop&crop=face'
},
{
id: 7,
name: '安妮塔·钱德拉',
position: '兰德研究院研究员,兰德公司政策中心临时副总裁兼主任,工程和应用科学部',
avatar: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop&crop=face'
},
{
id: 8,
name: '安妮塔·钱德拉',
position: '副总裁兼主任,兰德社会经济福利,高级政策研究员',
avatar: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop&crop=face'
},
{
id: 9,
name: '梅丽莎·罗',
position: '副总裁,全球研究人才政策分析数据政策分析政策学院',
avatar: 'https://images.unsplash.com/photo-1494790108755-2616b612b786?w=100&h=100&fit=crop&crop=face'
},
{
id: 10,
name: '安妮塔·钱德拉',
position: '副总裁兼主任,兰德社会经济福利,高级政策研究员政策分析数据',
avatar: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop&crop=face'
}
]
\ No newline at end of file
//引入axios请求
import axios from 'axios'
//引入element-plus里面的消息提示
import {
ElMessage
} from 'element-plus'
// Token管理
const TOKEN_KEY = 'auth_token'
// 获取token
const getToken = () => {
return 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw'
// return localStorage.getItem(TOKEN_KEY)
}
// 设置token
const setToken = (token) => {
localStorage.setItem(TOKEN_KEY, token)
}
// 移除token
const removeToken = () => {
localStorage.removeItem(TOKEN_KEY)
}
// 导出token管理方法
export { getToken, setToken, removeToken }
const BASE_API = import.meta.env.VITE_BASE_API
// 创建axios实例
const service = axios.create({
baseURL: BASE_API, //所有的后端接口请求地址前缀部分(没有后端请求不用写)
timeout: 60000*5 // 请求超时时间,这里15秒
//withCredentials: true,// 异步请求携带cookie,true为携带,false为不携带
//请求头里面设置通用传参类型
/*headers: {
//设置后端需要的传参类型
'Content-Type': 'application/json',
'token': 'x-auth-token',//一开始就要token
'X-Requested-With': 'XMLHttpRequest',
}*/
})
// request拦截器
service.interceptors.request.use(config => {
// 获取token并添加到请求头
const token = getToken()
if (token) {
// 根据curl命令,后端接受的是token字段名,而不是Authorization
config.headers['token'] = token
// config.headers['Authorization'] = `Bearer ${token}` // 如果后端需要Bearer格式可以使用这个
}
return config
}, error => {
console.log(error)
return Promise.reject(error)
})
// response拦截器
service.interceptors.response.use(
response => {
//对数据返回做什么
if (response.data.code == 0) {
ElMessage({
message: response.data.message,
type: 'error',
duration: 3 * 1000
})
}
return response.data
},
error => {
console.log('err' + error)
// 处理token过期或无效的情况
if (error.response && (error.response.status === 401 || error.response.status === 403)) {
ElMessage({
message: 'Token已过期,请重新登录',
type: 'error',
duration: 3 * 1000
})
// 清除无效的token
removeToken()
// 可以在这里跳转到登录页
// router.push('/login')
} else {
ElMessage({
message: error.message,
type: 'error',
duration: 3 * 1000
})
}
return Promise.reject(error)
}
)
export default service
\ No newline at end of file
<template>
<div
class="card-title-custom"
:style="{ '--left-offset': leftOffset }"
>
{{ props.title }}
</div>
</template>
<script setup>
const props = defineProps({
title: {
type: String,
required: true
},
leftOffset: {
type: String,
default: '-22px'
}
})
</script>
<style scoped>
.card-title-custom {
font-size: 16px;
font-weight: 600;
color: #333;
position: relative;
}
.card-title-custom::before {
content: '';
position: absolute;
left: var(--left-offset, -22px);
top: 50%;
transform: translateY(-50%);
width: 8px;
height: 16px;
background-color: #1459BB;
}
</style>
\ No newline at end of file
<template>
<div class="hello-world">
<el-card>
<template #header>
<div class="card-header">
<el-icon><Star /></el-icon>
<span>Hello World 组件</span>
</div>
</template>
<div class="content">
<h3>{{ title }}</h3>
<p>{{ description }}</p>
<el-divider />
<div class="counter-section">
<h4>计数器示例</h4>
<div class="counter">
<el-button type="primary" :icon="Minus" @click="decrement" :disabled="count <= 0"></el-button>
<el-input-number v-model="count" :min="0" :max="100" style="margin: 0 10px;"></el-input-number>
<el-button type="primary" :icon="Plus" @click="increment" :disabled="count >= 100"></el-button>
</div>
<el-progress :percentage="count" :color="progressColor" style="margin-top: 20px;"></el-progress>
</div>
<el-divider />
<div class="theme-section">
<h4>主题切换</h4>
<el-radio-group v-model="theme" @change="handleThemeChange">
<el-radio-button label="light">浅色主题</el-radio-button>
<el-radio-button label="dark">深色主题</el-radio-button>
</el-radio-group>
</div>
</div>
</el-card>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
import { ElMessage } from 'element-plus'
import { Star, Plus, Minus } from '@element-plus/icons-vue'
// Props
const props = defineProps({
title: {
type: String,
default: '欢迎使用 Vue 3 + Element Plus'
},
description: {
type: String,
default: '这是一个可复用的组件示例,展示了 Vue 3 Composition API 的强大功能。'
}
})
// 响应式数据
const count = ref(0)
const theme = ref('light')
// 计算属性
const progressColor = computed(() => {
if (count.value < 30) return '#f56c6c'
if (count.value < 70) return '#e6a23c'
return '#67c23a'
})
// 方法
const increment = () => {
if (count.value < 100) {
count.value++
if (count.value === 100) {
ElMessage.success('恭喜!达到最大值!')
}
}
}
const decrement = () => {
if (count.value > 0) {
count.value--
if (count.value === 0) {
ElMessage.info('已归零')
}
}
}
const handleThemeChange = (value) => {
ElMessage.success(`已切换到${value === 'light' ? '浅色' : '深色'}主题`)
}
// 暴露给父组件的方法
defineExpose({
reset: () => {
count.value = 0
theme.value = 'light'
ElMessage.success('组件已重置')
}
})
</script>
<style scoped>
.hello-world {
margin: 20px 0;
}
.card-header {
display: flex;
align-items: center;
gap: 8px;
font-weight: bold;
}
.content h3 {
color: #409eff;
margin-bottom: 12px;
}
.content p {
color: #606266;
line-height: 1.6;
}
.counter-section,
.theme-section {
text-align: center;
}
.counter-section h4,
.theme-section h4 {
color: #303133;
margin-bottom: 16px;
}
.counter {
display: flex;
align-items: center;
justify-content: center;
}
</style>
\ No newline at end of file
<template>
<div class="policy-list">
<div v-for="item in props.policyList" :key="item.id" class="policy-item">
<el-image :src="$withFallbackImage(item.imageUrl, item.content) " class="item-cover" fit="cover"/>
<div class="item-details">
<h3 class="item-title">{{ item.name }}</h3>
<div class="item-content"> {{ item.times }} · {{ item.content }} <el-icon><Link /></el-icon></div>
<div class="item-tags">
<el-tag v-for="tag in item.tags" :key="tag" class="custom-tag">{{ tag }}</el-tag>
</div>
<div
v-if="item.relatedBill"
class="related-bill-box"
:class="`status-bg-${item.status}`"
>
<span>{{ item.relatedBill.text }}</span>
<div class="status-badge" :class="`status-color-${item.status}`">
<span class="badge-dot"></span>
{{ getStatusInfo(item.status).text }}
</div>
</div>
<div v-else class="related-bill-box status-bg-unimplemented">
<span>不存在相关提案。</span>
<div class="status-badge status-color-unimplemented">
<span class="badge-dot"></span>
{{ item.status }}
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, defineProps } from 'vue'
import { Link } from '@element-plus/icons-vue'
const props = defineProps({
policyList: {
type: Array,
default: () => []
}
})
// --- Status Styling Helper ---
const getStatusInfo = (status) => {
switch (status) {
case 'implemented':
return { text: '已实施', color: '#e66657', bgColor: '#fdeeed' };
case 'partial':
return { text: '部分实施', color: '#d38f24', bgColor: '#fcf3e4' };
case 'unimplemented':
return { text: '未实施', color: '#409eff', bgColor: '#ecf5ff' };
default:
return { text: '未知', color: '#909399', bgColor: '#f4f4f5' };
}
};
</script>
<style scoped>
/* --- Policy List Styles --- */
.policy-list {
display: flex;
flex-direction: column;
}
.policy-item {
display: flex;
padding: 20px 0;
border-bottom: 1px solid #e4e7ed;
}
.policy-item:last-child {
border-bottom: none;
}
.item-cover {
width: 80px;
height: 80px;
margin-right: 20px;
flex-shrink: 0;
border-radius: 4px;
border: 1px solid #ebeef5;
}
.item-details {
flex-grow: 1;
}
.item-title {
font-size: 16px;
font-weight: 600;
color: #303133;
margin: 0 0 8px;
cursor: pointer;
line-height: 1.4;
}
.item-title:hover {
color: #409eff;
}
.item-content {
color: #909399;
font-size: 14px;
display: flex;
align-items: center;
}
.item-tags {
margin-bottom: 12px;
}
.custom-tag {
margin-right: 8px;
background-color: #f0f2f5;
color: #606266;
border-color: #e4e7ed;
font-size: 12px;
}
.related-bill-box {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 12px;
border-radius: 6px;
font-size: 14px;
line-height: 1.4;
}
.status-badge {
display: flex;
align-items: center;
font-size: 13px;
padding: 4px 8px;
border-radius: 4px;
white-space: nowrap;
font-weight: 500;
}
.badge-dot {
width: 6px;
height: 6px;
border-radius: 50%;
background-color: currentColor;
margin-right: 6px;
}
/* Dynamic status colors */
.status-bg-implemented {
background-color: #fdeeed;
}
.status-color-implemented {
color: #e66657;
}
.status-bg-partial {
background-color: #fcf3e4;
}
.status-color-partial {
color: #d38f24;
}
.status-bg-unimplemented {
background-color: #ecf5ff;
}
.status-color-unimplemented {
color: #409eff;
}
/* 响应式设计 */
@media (max-width: 768px) {
.policy-item {
flex-direction: column;
gap: 12px;
padding: 16px 0;
}
.item-cover {
width: 100%;
height: 120px;
margin-right: 0;
margin-bottom: 12px;
}
.item-title {
font-size: 15px;
}
.related-bill-box {
flex-direction: column;
align-items: flex-start;
gap: 8px;
padding: 12px;
}
.status-badge {
align-self: flex-end;
}
}
</style>
<template>
<div class="policy-tracker-container">
<!-- 顶部搜索栏 -->
<div class="top-search-bar" v-if="props.showSearch">
<div class="search-left">
<el-input
v-model="searchQuery"
placeholder="搜索政策建议"
class="search-input"
size="default"
>
<template #suffix>
<el-icon><Search /></el-icon>
</template>
</el-input>
</div>
<div class="search-right">
<el-select v-model="dateRange" class="select-item" size="default">
<el-option label="近一年发布" value="last_year" />
<el-option label="近三年发布" value="last_three_years" />
</el-select>
<el-select v-model="sortOrder" class="select-item" size="default">
<el-option label="发布时间" value="time" />
<el-option label="热度" value="popularity" />
</el-select>
</div>
</div>
<el-row :gutter="24">
<el-col :span="6">
<aside class="filter-sidebar">
<div class="filter-group">
<CardTitle title="实施状态" style="margin-bottom: 10px"/>
<div class="checkbox-group">
<el-checkbox-group v-model="activeStatus">
<el-checkbox
v-for="status in statusFilters"
:key="status.id"
:label="status.id"
class="filter-checkbox"
>
<span
class="status-dot"
:style="`background-color: ${status.color}; border-color: ${status.borderColor || status.color || '#dcdfe6'}`"
></span>
{{ status.label }} ({{ status.count }})
</el-checkbox>
</el-checkbox-group>
</div>
</div>
<div class="filter-group">
<CardTitle title="科技领域" style="margin-bottom: 10px"/>
<div class="checkbox-group">
<el-checkbox-group v-model="activeTechField">
<el-checkbox
v-for="field in techFieldFilters"
:key="field.id"
:label="field.id"
class="filter-checkbox tech-checkbox"
>
{{ field.label }}
</el-checkbox>
</el-checkbox-group>
</div>
</div>
</aside>
</el-col>
<el-col :span="18">
<div class="main-content">
<PolicyList :policyList="policies" />
</div>
</el-col>
</el-row>
</div>
</template>
<script setup lang="ts">
import { ref, defineProps, onMounted } from 'vue';
import { Search } from '@element-plus/icons-vue';
import PolicyList from './PolicyList.vue';
import CardTitle from './CardTitle.vue';
import { getOverviewPolicy } from '@/api'
const props = defineProps({
showSearch: {
type: Boolean,
default: true
}
})
// --- Sidebar Filters State & Data ---
const activeStatus = ref(['implemented']); // 改为数组支持多选
const activeTechField = ref(['ai']); // 改为数组支持多选
const statusFilters = ref([
{ id: 'implemented', label: '已实施', count: 18, color: '#e66657' },
{ id: 'partial', label: '部分实施', count: 12, color: '#e6a23c' },
{ id: 'unimplemented', label: '未实施', count: 12, color: '#909399' },
{ id: 'unknown', label: '未知状态', count: 4, color: 'transparent', borderColor: '#909399' },
]);
const techFieldFilters = ref([
{ id: 'ai', label: '人工智能' },
{ id: 'semiconductor', label: '半导体/芯片' },
{ id: 'energy', label: '能源与气候' },
{ id: 'international', label: '国际关系' },
{ id: 'economy', label: '经济决策' },
{ id: 'national_security', label: '国防与安全' },
]);
// --- Main Content State ---
const searchQuery = ref('');
const dateRange = ref('last_year');
const sortOrder = ref('time');
const policies = ref([]);
const getPolicies = async () => {
const { data } = await getOverviewPolicy({
researchTypeIds: activeTechField.value,
statusList: activeStatus.value,
})
policies.value = data
}
onMounted(() => {
getPolicies()
})
</script>
<style scoped>
.policy-tracker-container {
padding-top: 0;
}
/* 顶部搜索栏样式 */
.top-search-bar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.search-left {
flex: 1;
max-width: 400px;
}
.search-input {
width: 100%;
}
.search-input :deep(.el-input__wrapper) {
border-radius: 6px;
box-shadow: 0 0 0 1px #dcdfe6;
transition: box-shadow 0.3s ease;
}
.search-input :deep(.el-input__wrapper:hover) {
box-shadow: 0 0 0 1px #409EFF;
}
.search-input :deep(.el-input__wrapper.is-focus) {
box-shadow: 0 0 0 1px #409EFF;
}
.search-right {
display: flex;
align-items: center;
gap: 12px;
}
.select-item {
width: 140px;
}
.select-item :deep(.el-input__wrapper) {
border-radius: 6px;
box-shadow: 0 0 0 1px #dcdfe6;
transition: box-shadow 0.3s ease;
}
.select-item :deep(.el-input__wrapper:hover) {
box-shadow: 0 0 0 1px #409EFF;
}
.main-content {
background-color: #fff;
padding: 8px;
}
/* --- Sidebar Styles --- */
.filter-sidebar {
background-color: #fff;
padding: 20px;
border-radius: 4px;
}
.filter-group {
margin-bottom: 25px;
}
.filter-title {
font-size: 15px;
font-weight: 600;
color: #303133;
margin: 0 0 15px 0;
display: flex;
align-items: center;
}
.implementation-title {
padding-left: 12px;
position: relative;
}
.implementation-title::before {
content: '';
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 16px;
background-color: #409EFF;
border-radius: 2px;
}
.icon-square {
display: inline-block;
width: 4px;
height: 16px;
background-color: #409EFF;
margin-right: 8px;
border-radius: 2px;
}
.filter-sidebar ul {
list-style: none;
padding: 0;
margin: 0;
}
/* 复选框组样式 */
.checkbox-group {
display: flex;
flex-direction: column;
gap: 8px;
}
.filter-checkbox {
margin: 0 !important;
padding: 8px 12px;
border-radius: 4px;
transition: all 0.3s ease;
width: 100%;
display: flex;
align-items: center;
}
.filter-checkbox:hover {
background-color: #f0f2f5;
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
margin-right: 0;
border: 1px solid transparent;
display: inline-block;
flex-shrink: 0;
}
/* 响应式设计 */
@media (max-width: 768px) {
.top-search-bar {
flex-direction: column;
gap: 16px;
padding: 16px;
}
.search-left {
max-width: none;
width: 100%;
}
.search-right {
width: 100%;
justify-content: center;
gap: 8px;
}
.select-item {
width: 120px;
}
}
@media (max-width: 480px) {
.search-right {
flex-direction: column;
gap: 8px;
}
.select-item {
width: 100%;
max-width: 200px;
}
}
</style>
\ No newline at end of file
<template>
<div class="report-page-container">
<!-- 顶部过滤区域 -->
<div class="top-filters">
<div class="filter-left">
<span class="filter-label" :class="{ 'active': activeTab === 'report' }" @click="activeTab = 'report'">智库报告</span>
<span class="filter-label" :class="{ 'active': activeTab === 'policy' }" @click="activeTab = 'policy'">政策建议</span>
</div>
<div class="filter-right">
<el-select v-model="selectedDateRange" placeholder="请选择" class="filter-select">
<el-option label="近一年发布" value="last_year"></el-option>
<el-option label="近三年发布" value="last_three_years"></el-option>
</el-select>
<el-select v-model="selectedSort" placeholder="请选择" class="filter-select">
<el-option label="发布时间" value="publish_time"></el-option>
<el-option label="热度" value="popularity"></el-option>
</el-select>
</div>
</div>
<el-row :gutter="24" v-if="activeTab === 'report'">
<el-col :span="5">
<div class="sidebar-filters">
<div class="filter-group">
<CardTitle title="地区筛选" style="margin-bottom: 10px"/>
<div class="checkbox-group">
<el-checkbox
v-for="region in filters.regions"
:key="region.id"
v-model="activeFilters.regions"
:label="region.id"
class="filter-checkbox"
>
{{ region.name }}
</el-checkbox>
</div>
</div>
<div class="filter-group">
<CardTitle title="智库类型" style="margin-bottom: 10px"/>
<div class="checkbox-group">
<el-checkbox
v-for="type in filters.types"
:key="type.id"
v-model="activeFilters.types"
:label="type.id"
class="filter-checkbox"
>
{{ type.name }}
</el-checkbox>
</div>
</div>
<div class="filter-group">
<CardTitle title="研究类型" style="margin-bottom: 10px"/>
<div class="checkbox-group">
<el-checkbox
v-for="research in filters.researches"
:key="research.id"
v-model="activeFilters.researches"
:label="research.id"
class="filter-checkbox"
>
{{ research.rtypeName }}
</el-checkbox>
</div>
</div>
<div class="subscription-box">
<h3>动态订阅</h3>
<p>选择您感兴趣的研究领域,获取最新报告和相关书目。</p>
<el-button type="primary" style="width: 100%;">保存订阅设置</el-button>
</div>
</div>
</el-col>
<el-col :span="19">
<div class="main-content">
<el-row :gutter="20">
<el-col :span="8" v-for="report in reportList" :key="report.id" class="card-col"
@click="handleReportClick(report)">
<el-card shadow="hover" class="report-card" :body-style="{ padding: '0px' }">
<el-image :src="$withFallbackImage(report.imageUrl, report.id) " fit="cover" class="card-image" lazy></el-image>
<div class="card-content">
<h4 class="card-title">{{ report.name }}</h4>
<div class="card-meta">
<span class="card-date">{{ report.times }}</span>
<span class="card-source">{{ report.thinkTankName }}</span>
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
<PolicyTab v-if="activeTab === 'policy'" :showSearch="false" />
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { useRouter } from 'vue-router'
import PolicyTab from '@/components/PolicyTab.vue'
import { getOverviewReport, getThinkTankResearchType } from '@/api'
const router = useRouter()
const activeTab = ref('report')
// --- Reactive Data for Filters ---
const filters = reactive({
regions: [
{ id: 'north_america', name: '北美' },
{ id: 'europe', name: '欧洲' },
{ id: 'asia', name: '亚洲' },
{ id: 'other', name: '其他地区' },
],
types: [
{ id: 'gov', name: '政府背景' },
{ id: 'university', name: '高校附庸' },
{ id: 'independent', name: '独立智库' },
{ id: 'corporate', name: '企业视景' },
],
researches: [],
});
const activeFilters = reactive({
regions: ['north_america'],
types: ['gov'],
researches: [],
});
// --- Reactive Data for Right Content ---
const selectedDateRange = ref('last_year');
const selectedSort = ref('publish_time');
const reportList = ref([
{ id: 1, title: '中国对AI的转型产业政策', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://picsum.photos/600/320?random=1' },
{ id: 2, title: '中美对抗、竞争和合作将跨越人工智能通用领域的五个...', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://picsum.photos/600/320?random=2' },
{ id: 3, title: '中国、智慧城市和中东:地区和美国的选择', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://picsum.photos/600/320?random=3' },
{ id: 4, title: '中国对AI的转型产业政策', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://picsum.photos/600/320?random=4' },
{ id: 5, title: '中美经济竞争:复杂经济和地缘政治关系中的收益...', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://picsum.photos/600/320?random=5' },
{ id: 6, title: '中国、智慧城市和中东:留给地区和美国的选择', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://picsum.photos/600/320?random=6' },
{ id: 7, title: '中国对AI的转型产业政策', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://picsum.photos/600/320?random=7' },
{ id: 8, title: '中美对抗、竞争和合作将跨越人工智能通用领域的五个...', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://picsum.photos/600/320?random=8' },
{ id: 9, title: '中国、智慧城市和中东:地区和美国的选择', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://picsum.photos/600/320?random=9' },
]);
const getReports = async () => {
const { data } = await getOverviewReport({
areas: activeFilters.regions,
researchTypeIds: activeFilters.researches,
})
reportList.value = data
}
const handleReportClick = (report) => {
router.push({ name: 'ReportDetail', params: { id: report.id } })
}
const getResearchType = async () => {
const { data } = await getThinkTankResearchType()
console.log('getResearchType', data)
filters.researches = data
}
onMounted(() => {
getReports()
getResearchType()
})
</script>
<style scoped>
.report-page-container {
/* padding: 24px; */
margin-top: 20px;
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif;
}
/* --- Left Sidebar Styles --- */
.sidebar-filters {
background-color: #fff;
padding: 20px;
border-radius: 4px;
}
.filter-group {
margin-bottom: 25px;
}
.filter-title {
font-size: 16px;
font-weight: 600;
color: #303133;
margin: 0 0 15px 0;
display: flex;
align-items: center;
}
.filter-title .icon-square {
display: inline-block;
width: 4px;
height: 16px;
background-color: #409EFF;
margin-right: 8px;
border-radius: 2px;
}
/* 复选框组样式 */
.checkbox-group {
display: flex;
flex-direction: column;
gap: 4px;
}
.filter-checkbox {
margin: 0 !important;
border-radius: 4px;
transition: all 0.3s ease;
width: 100%;
display: flex;
align-items: center;
}
.filter-checkbox:hover {
background-color: #f0f2f5;
}
.subscription-box {
background-color: #f5f7fa;
border-radius: 4px;
padding: 15px;
text-align: center;
}
.subscription-box p {
font-size: 13px;
color: #909399;
line-height: 1.6;
margin: 10px 0 15px 0;
}
/* --- Right Content Styles --- */
.main-content {
background-color: #fff;
padding: 20px;
border-radius: 4px;
}
/* 顶部过滤区域样式 */
.top-filters {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 24px;
/* background: #fff; */
border-radius: 8px;
/* box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); */
margin-bottom: 10px;
}
.filter-left {
display: flex;
align-items: center;
gap: 32px;
}
.filter-label {
font-size: 16px;
color: #606266;
cursor: pointer;
position: relative;
padding: 8px 0;
transition: color 0.3s ease;
border-radius: 14px;
padding: 4px 10px;
}
.filter-label.active {
color: #fff;
background: #1459BB;
}
.filter-label:hover {
color: #409EFF;
}
.filter-right {
display: flex;
align-items: center;
gap: 12px;
}
.filter-select {
width: 140px;
}
.filter-select :deep(.el-input__wrapper) {
border-radius: 6px;
box-shadow: 0 0 0 1px #dcdfe6;
transition: box-shadow 0.3s ease;
}
.filter-select :deep(.el-input__wrapper:hover) {
box-shadow: 0 0 0 1px #409EFF;
}
.card-col {
margin-bottom: 20px;
}
.report-card {
cursor: pointer;
transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
}
.report-card:hover {
transform: translateY(-5px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.card-image {
width: 100%;
height: 160px;
display: block;
}
.card-content {
padding: 16px;
}
.card-title {
font-size: 15px;
font-weight: 600;
color: #303133;
margin: 0 0 10px 0;
line-height: 1.4;
/* For multi-line ellipsis */
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
min-height: 42px; /* 2 lines * 1.4 line-height * 15px font-size */
}
.card-meta {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 12px;
color: #909399;
}
/* 响应式设计 */
@media (max-width: 768px) {
.top-filters {
flex-direction: column;
gap: 16px;
padding: 16px;
}
.filter-left {
width: 100%;
justify-content: center;
gap: 24px;
}
.filter-right {
width: 100%;
justify-content: center;
gap: 8px;
}
.filter-select {
width: 120px;
}
}
@media (max-width: 480px) {
.filter-left {
gap: 16px;
}
.filter-label {
font-size: 14px;
}
.filter-right {
flex-direction: column;
gap: 8px;
}
.filter-select {
width: 100%;
max-width: 200px;
}
}
</style>
\ No newline at end of file
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import CardTitle from './components/CardTitle.vue'
import { withFallbackImage } from './utils'
const app = createApp(App)
// 注册所有图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
// 注册全局函数
app.config.globalProperties.$withFallbackImage = withFallbackImage
app.use(router)
app.use(ElementPlus)
app.component('CardTitle', CardTitle)
app.mount('#app')
\ No newline at end of file
import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'
import ThinkTankDetail from '@/views/ThinkTankDetail/index.vue'
import ReportDetail from '@/views/ReportDetail/index.vue'
// 法案相关组件
import BillHome from '@/views/billHome/index.vue'
import BillLayoutContainer from '@/views/billLayout/index.vue'
import BillLayout from '@/views/bill/index.vue'
import BillIntroduction from '@/views/bill/introdoction/index.vue'
import BillBackground from '@/views/bill/background/index.vue'
import BillTemplate from '@/views/bill/template/index.vue'
// 深度挖掘相关组件
import DeepDigLayout from '@/views/deepDig/index.vue'
import DeepDigProcessOverview from '@/views/deepDig/processOverview/index.vue'
import DeepDigProcessAnalysis from '@/views/deepDig/processAnalysis/index.vue'
import DeepDigProgressOverview from '@/views/deepDig/progressAnalysis/index.vue'
// 影响分析相关组件
import InfluenceLayout from '@/views/influence/index.vue'
import InfluenceIndustry from '@/views/influence/industry/index.vue'
import InfluenceScientificResearch from '@/views/influence/scientificResearch/index.vue'
const routes = [
// 智库系统的主要路由
{
path: '/',
name: 'Home',
component: Home,
meta: {
title: '首页'
},
},
{
path: '/about',
name: 'About',
component: About,
meta: {
title: '关于我们'
}
},
{
path: '/think-tank/:id',
name: 'ThinkTankDetail',
component: ThinkTankDetail,
meta: {
title: '智库详情'
}
},
{
path: '/report/:id',
name: 'ReportDetail',
component: ReportDetail,
meta: {
title: '报告详情'
}
},
// 法案系统路由
{
path: '/billHome',
name: 'BillHome',
component: BillHome,
meta: {
title: '法案首页'
},
},
{
path: '/billLayout',
name: 'BillLayoutContainer',
component: BillLayoutContainer,
redirect: '/billLayout/bill',
meta: {
title: '法案布局'
},
children: [
// 法案分析路由
{
path: 'bill',
name: 'BillLayout',
component: BillLayout,
redirect: '/billLayout/bill/introduction',
meta: {
title: '法案分析'
},
children: [
{
path: 'introduction',
name: 'BillIntroduction',
component: BillIntroduction,
meta: { title: '法案简介' }
},
{
path: 'background',
name: 'BillBackground',
component: BillBackground,
meta: { title: '法案背景' }
},
{
path: 'template',
name: 'BillTemplate',
component: BillTemplate,
meta: { title: '内容概要' }
}
]
},
// 深度挖掘路由
{
path: 'deepDig',
name: 'DeepDigLayout',
component: DeepDigLayout,
redirect: '/billLayout/deepDig/processOverview',
meta: {
title: '深度挖掘'
},
children: [
{
path: 'processOverview',
name: 'DeepDigProcessOverview',
component: DeepDigProcessOverview,
meta: { title: '流程概要' }
},
{
path: 'processAnalysis',
name: 'DeepDigProcessAnalysis',
component: DeepDigProcessAnalysis,
meta: { title: '流程分析' }
},
{
path: 'progressAnalysis',
name: 'DeepDigProgressAnalysis',
component: DeepDigProgressOverview,
meta: { title: '进程分析' }
},
]
},
// 影响分析路由
{
path: 'influence',
name: 'InfluenceLayout',
component: InfluenceLayout,
redirect: '/billLayout/influence/industry',
meta: {
title: '影响分析'
},
children: [
{
path: 'industry',
name: 'InfluenceIndustry',
component: InfluenceIndustry,
meta: { title: '对华产业影响' }
},
{
path: 'scientificResearch',
name: 'InfluenceScientificResearch',
component: InfluenceScientificResearch,
meta: { title: '对华科研影响' }
}
]
}
]
},
]
const router = createRouter({
history: createWebHistory(),
routes
})
// 路由守卫 - 设置页面标题
router.beforeEach((to, from, next) => {
if (to.meta.title) {
// document.title = `${to.meta.title} - Think Tank`
}
next()
})
export default router
\ No newline at end of file
export const withFallbackImage = (img, key) => {
return img || `https://picsum.photos/80/60?random=${key}`
}
\ No newline at end of file
<template>
<div class="about">
<el-row :gutter="20">
<el-col :span="24">
<el-card>
<template #header>
<div class="card-header">
<el-icon><InfoFilled /></el-icon>
<span>关于 Think Tank</span>
</div>
</template>
<div class="about-content">
<el-row :gutter="20">
<el-col :span="12">
<h3>项目介绍</h3>
<p>Think Tank 是一个基于 Vue 3 + Element Plus + Vue Router 构建的现代化前端项目模板。</p>
<p>该项目采用了最新的前端技术栈,提供了完整的开发环境配置和项目结构,帮助开发者快速启动新项目。</p>
<h3>技术特性</h3>
<el-timeline>
<el-timeline-item timestamp="Vue 3" placement="top">
<el-card>
<h4>Vue 3 Composition API</h4>
<p>使用最新的 Composition API,提供更好的逻辑复用和类型推导</p>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="Element Plus" placement="top">
<el-card>
<h4>Element Plus UI 组件库</h4>
<p>基于 Vue 3 的企业级 UI 组件库,提供丰富的组件和主题定制</p>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="Vue Router" placement="top">
<el-card>
<h4>Vue Router 4</h4>
<p>Vue.js 官方路由管理器,支持动态路由和路由守卫</p>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="Vite" placement="top">
<el-card>
<h4>Vite 构建工具</h4>
<p>下一代前端构建工具,提供极速的开发体验</p>
</el-card>
</el-timeline-item>
</el-timeline>
</el-col>
<el-col :span="12">
<h3>项目结构</h3>
<el-tree
:data="projectStructure"
:props="treeProps"
default-expand-all
:expand-on-click-node="false"
>
<template #default="{ node, data }">
<span class="tree-node">
<el-icon v-if="data.type === 'folder'"><Folder /></el-icon>
<el-icon v-else><Document /></el-icon>
<span>{{ node.label }}</span>
</span>
</template>
</el-tree>
<h3 style="margin-top: 30px;">开发指南</h3>
<el-steps :active="3" finish-status="success">
<el-step title="安装依赖" description="npm install"></el-step>
<el-step title="启动开发" description="npm run dev"></el-step>
<el-step title="构建项目" description="npm run build"></el-step>
<el-step title="部署上线" description="部署到服务器"></el-step>
</el-steps>
</el-col>
</el-row>
</div>
</el-card>
</el-col>
</el-row>
<el-row :gutter="20" style="margin-top: 20px;">
<el-col :span="8">
<el-card>
<template #header>
<div class="card-header">
<el-icon><Star /></el-icon>
<span>版本信息</span>
</div>
</template>
<el-descriptions :column="1" border>
<el-descriptions-item label="项目版本">1.0.0</el-descriptions-item>
<el-descriptions-item label="Vue">^3.4.0</el-descriptions-item>
<el-descriptions-item label="Element Plus">^2.4.4</el-descriptions-item>
<el-descriptions-item label="Vue Router">^4.2.5</el-descriptions-item>
<el-descriptions-item label="Vite">^5.0.0</el-descriptions-item>
</el-descriptions>
</el-card>
</el-col>
<el-col :span="8">
<el-card>
<template #header>
<div class="card-header">
<el-icon><Link /></el-icon>
<span>相关链接</span>
</div>
</template>
<div class="links">
<el-button type="primary" link @click="openLink('https://vuejs.org/')">
<el-icon><Link /></el-icon>
Vue.js 官网
</el-button>
<el-button type="primary" link @click="openLink('https://element-plus.org/')">
<el-icon><Link /></el-icon>
Element Plus 官网
</el-button>
<el-button type="primary" link @click="openLink('https://router.vuejs.org/')">
<el-icon><Link /></el-icon>
Vue Router 官网
</el-button>
<el-button type="primary" link @click="openLink('https://vitejs.dev/')">
<el-icon><Link /></el-icon>
Vite 官网
</el-button>
</div>
</el-card>
</el-col>
<el-col :span="8">
<el-card>
<template #header>
<div class="card-header">
<el-icon><ChatDotRound /></el-icon>
<span>联系我们</span>
</div>
</template>
<div class="contact">
<p><el-icon><Message /></el-icon> 邮箱:contact@thinktank.com</p>
<p><el-icon><Phone /></el-icon> 电话:+86 123-4567-8900</p>
<p><el-icon><Location /></el-icon> 地址:北京市朝阳区</p>
<el-button type="success" style="width: 100%; margin-top: 10px;">
<el-icon><ChatDotRound /></el-icon>
在线咨询
</el-button>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import {
InfoFilled,
Folder,
Document,
Star,
Link,
ChatDotRound,
Message,
Phone,
Location
} from '@element-plus/icons-vue'
// 项目结构数据
const projectStructure = ref([
{
label: 'think-tank',
type: 'folder',
children: [
{
label: 'src',
type: 'folder',
children: [
{ label: 'views', type: 'folder' },
{ label: 'router', type: 'folder' },
{ label: 'components', type: 'folder' },
{ label: 'App.vue', type: 'file' },
{ label: 'main.js', type: 'file' }
]
},
{ label: 'package.json', type: 'file' },
{ label: 'vite.config.js', type: 'file' },
{ label: 'index.html', type: 'file' }
]
}
])
const treeProps = {
children: 'children',
label: 'label'
}
// 打开链接
const openLink = (url) => {
window.open(url, '_blank')
ElMessage.success('正在打开链接...')
}
</script>
<style scoped>
.about {
max-width: 1200px;
margin: 0 auto;
}
.about-content h3 {
color: #409eff;
margin-bottom: 16px;
border-bottom: 2px solid #409eff;
padding-bottom: 8px;
}
.about-content p {
color: #606266;
line-height: 1.6;
margin-bottom: 16px;
}
.card-header {
display: flex;
align-items: center;
gap: 8px;
font-weight: bold;
}
.tree-node {
display: flex;
align-items: center;
gap: 8px;
}
.links {
display: flex;
flex-direction: column;
gap: 12px;
}
.contact p {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 12px;
}
</style>
\ No newline at end of file
<template>
<div class="tech-think-tank">
<!-- 面包屑导航 -->
<el-breadcrumb separator=">" class="breadcrumb">
<el-breadcrumb-item>国家科技安全</el-breadcrumb-item>
<el-breadcrumb-item>中美博弈概览</el-breadcrumb-item>
<el-breadcrumb-item class="current">科技智库</el-breadcrumb-item>
</el-breadcrumb>
<!-- 搜索区域 -->
<div class="search-section">
<el-input
v-model="searchText"
placeholder="搜索智库、报告或政策建议"
class="search-input"
size="large"
>
<template #append>
<el-button
type="primary"
style="background: #1677FF; color: #fff;"
:icon="Search">搜索</el-button>
</template>
</el-input>
</div>
<!-- 统计数据 -->
<div class="stats-section">
<div class="stat-item">
<div class="stat-number">128</div>
<div class="stat-label">追踪智库数量</div>
</div>
<div class="stat-item">
<div class="stat-number">42</div>
<div class="stat-label">本月新增报告</div>
</div>
<div class="stat-item">
<div class="stat-number">18</div>
<div class="stat-label">重点政策建议</div>
</div>
<div class="stat-item">
<div class="stat-number">12</div>
<div class="stat-label">热点科技领域</div>
</div>
</div>
<!-- 主要内容区域 -->
<div class="main-content">
<!-- 左侧数据分布 -->
<div class="left-section">
<div class="section-header">
<el-icon class="location-icon"><Location /></el-icon>
<span class="section-title">数据分布</span>
<div class="time-filters">
<span :class="{ active: activeTime === '今天' }" @click="activeTime = '今天'">今天</span>
<span :class="{ active: activeTime === '本周' }" @click="activeTime = '本周'">本周</span>
<span :class="{ active: activeTime === '本月' }" @click="activeTime = '本月'">本月</span>
<span :class="{ active: activeTime === '今年' }" @click="activeTime = '今年'">今年</span>
</div>
</div>
<!-- 地图区域 -->
<div class="map-container">
<div ref="worldMapRef" class="world-map" style="width: 100%; height: 400px;"></div>
</div>
</div>
<!-- 右侧网络信号 -->
<div class="right-section">
<div class="signal-header">
<el-icon class="signal-icon"><Warning /></el-icon>
<span class="signal-title">风险信号</span>
<el-badge :value="5" class="signal-badge" />
<span class="more-link">更多 ></span>
</div>
<div class="signal-list">
<div v-for="signal in signals" :key="signal.id" class="signal-item">
<div class="signal-content">
<div class="signal-left">
<el-tag :type="signal.type" size="small" class="signal-tag">{{ signal.tag }}</el-tag>
<div class="signal-text">{{ signal.content }}</div>
</div>
<div class="signal-time">{{ signal.time }}</div>
</div>
</div>
</div>
<el-button type="primary" class="process-btn" block>
<el-icon><Setting /></el-icon>
风险处理
</el-button>
</div>
</div>
<!-- 智库展示区域 -->
<div class="think-tanks-section">
<div
v-for="tank in thinkTanks" :key="tank.id" class="think-tank-card"
@click="handleClick(tank)">
<div class="tank-header">
<div class="tank-logo">
<el-image :src="$withFallbackImage(tank.logo, tank.id)" :alt="tank.name" />
</div>
<div class="tank-country">{{ tank.country }}</div>
</div>
<div class="tank-name">{{ tank.name }}</div>
<div class="tank-description" :title="tank.describe">{{ tank.describe }}</div>
<div class="tank-tags">
<el-tag v-for="tag in tank.tags" :key="tag" type="primary" size="small">
{{ tag }}
</el-tag>
</div>
</div>
<div class="view-all">
<span class="view-all-link">查看全部智库 ></span>
</div>
</div>
<ReportList />
</div>
</template>
<script setup>
import { ref, onMounted, nextTick } from 'vue'
import { Search, Location, Warning, Setting } from '@element-plus/icons-vue'
import * as echarts from 'echarts'
import ReportList from '@/components/ReportList.vue'
import { useRouter } from 'vue-router'
import rand from '@/assets/images/rand.png'
import brookings from '@/assets/images/brookings.png'
import mit from '@/assets/images/mit.png'
import itif from '@/assets/images/itif.png'
import mckinsley from '@/assets/images/mckinsey.png'
import { getThinkTankList } from '@/api'
const router = useRouter()
const searchText = ref('')
const activeTime = ref('本月')
const worldMapRef = ref(null)
// 世界地图数据 - 各国智库数量统计
const mapData = ref([
{ name: 'United States', value: 6, itemStyle: { color: '#ff4757' } },
{ name: 'China', value: 3, itemStyle: { color: '#ffa726' } },
{ name: 'United Kingdom', value: 2, itemStyle: { color: '#42a5f5' } },
{ name: 'Germany', value: 1, itemStyle: { color: '#66bb6a' } },
{ name: 'Japan', value: 1, itemStyle: { color: '#66bb6a' } },
{ name: 'France', value: 1, itemStyle: { color: '#66bb6a' } }
])
// 初始化世界地图
const initWorldMap = async () => {
if (!worldMapRef.value) return
const chart = echarts.init(worldMapRef.value)
// 使用可靠的世界地图数据源
try {
const response = await fetch('https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/world.geojson')
const geoJson = await response.json()
// 注册世界地图
echarts.registerMap('world', geoJson)
const option = {
title: {
text: '全球智库分布',
left: 'center',
top: 20,
textStyle: {
color: '#333',
fontSize: 18,
fontWeight: 'bold'
}
},
tooltip: {
trigger: 'item',
formatter: function(params) {
if (params.seriesType === 'map') {
const data = mapData.value.find(item => item.name === params.name)
if (data) {
return `${params.name}<br/>智库数量: ${data.value}个`
}
return `${params.name}<br/>暂无数据`
}
return params.name
}
},
visualMap: {
min: 0,
max: 6,
left: 'left',
top: 'bottom',
text: ['高', '低'],
calculable: true,
inRange: {
color: ['#e3f2fd', '#1976d2']
},
textStyle: {
color: '#333'
}
},
series: [
{
name: '智库数量',
type: 'map',
map: 'world',
roam: true,
emphasis: {
label: {
show: true
}
},
data: [
{ name: 'United States of America', value: 6, itemStyle: { color: '#ff4757' } },
{ name: 'China', value: 3, itemStyle: { color: '#ffa726' } },
{ name: 'United Kingdom', value: 2, itemStyle: { color: '#42a5f5' } },
{ name: 'Germany', value: 1, itemStyle: { color: '#66bb6a' } },
{ name: 'Japan', value: 1, itemStyle: { color: '#66bb6a' } },
{ name: 'France', value: 1, itemStyle: { color: '#66bb6a' } }
],
itemStyle: {
borderColor: '#fff',
borderWidth: 1
}
}
]
}
chart.setOption(option)
} catch (error) {
console.log('使用备用地图方案')
// 如果外部数据源失败,使用内置的简化世界地图
const option = {
title: {
text: '全球智库分布',
left: 'center',
top: 20,
textStyle: {
color: '#333',
fontSize: 18,
fontWeight: 'bold'
}
},
tooltip: {
trigger: 'item',
formatter: function(params) {
return `${params.name}<br/>智库数量: ${params.value}个`
}
},
geo: {
type: 'map',
map: 'world',
roam: true,
itemStyle: {
color: '#f0f0f0',
borderColor: '#999',
borderWidth: 0.5
},
emphasis: {
itemStyle: {
color: '#e0e0e0'
}
},
regions: [
{
name: 'United States',
itemStyle: {
color: '#ff4757'
}
},
{
name: 'China',
itemStyle: {
color: '#ffa726'
}
},
{
name: 'United Kingdom',
itemStyle: {
color: '#42a5f5'
}
}
]
},
series: [
{
name: '智库分布',
type: 'scatter',
coordinateSystem: 'geo',
data: [
{ name: '美国', value: [-95, 37, 6], itemStyle: { color: '#ff4757' } },
{ name: '中国', value: [104, 35, 3], itemStyle: { color: '#ffa726' } },
{ name: '英国', value: [-3, 55, 2], itemStyle: { color: '#42a5f5' } },
{ name: '德国', value: [10, 51, 1], itemStyle: { color: '#66bb6a' } },
{ name: '日本', value: [138, 36, 1], itemStyle: { color: '#66bb6a' } },
{ name: '法国', value: [2, 46, 1], itemStyle: { color: '#66bb6a' } }
],
symbolSize: function (val) {
return Math.max(val[2] * 15, 25)
},
label: {
show: true,
formatter: function(params) {
return params.data.name + '\n' + params.data.value[2] + '个'
},
position: 'top',
textStyle: {
color: '#333',
fontSize: 12,
fontWeight: 'bold'
}
},
emphasis: {
scale: true,
scaleSize: 10
}
}
]
}
chart.setOption(option)
}
// 响应式处理
window.addEventListener('resize', () => {
chart.resize()
})
}
const signals = ref([
{
id: 1,
type: 'danger',
tag: '特别重大',
content: '兰德科技智库发布2025中美年度科技报告',
time: '一天前'
},
{
id: 2,
type: 'danger',
tag: '特别重大',
content: '信息技术与创新基金会发布《中国正在迅速成...',
time: '一天前'
},
{
id: 3,
type: 'warning',
tag: '重大',
content: '战略与国际研究中心发布《DeepSeek、华为、...',
time: '一天前'
},
{
id: 4,
type: 'warning',
tag: '重大',
content: '兰德科技智库发布《中国对AI的转型产业政策》',
time: '一天前'
},
{
id: 5,
type: 'success',
tag: '一般',
content: '兰德科技智库发布《中美对抗、竞争和合作...',
time: '一天前'
}
])
const thinkTanks = ref([])
const getThinkTanks= async () => {
const { data } = await getThinkTankList()
thinkTanks.value = data
}
const handleClick = (tank) => {
router.push({ name: 'ThinkTankDetail', params: { id: tank.id } })
}
// 组件挂载后初始化地图
onMounted(() => {
getThinkTanks()
nextTick(() => {
initWorldMap()
})
})
</script>
<style scoped lang="scss">
.tech-think-tank {
max-width: 1400px;
margin: 0 auto;
padding: 20px;
background: url('@/assets/images/background.png') no-repeat;
background-position: center -100px;
background-size: 100% 100%;
min-height: 100vh;
}
.breadcrumb {
margin-bottom: 20px;
.current {
font-weight: 600;
}
}
.search-section {
margin-bottom: 30px;
display: flex;
justify-content: center;
}
.search-input {
max-width: 800px;
}
.stats-section {
display: flex;
justify-content: center;
gap: 80px;
margin-bottom: 40px;
}
.stat-item {
text-align: center;
}
.stat-number {
font-size: 48px;
font-weight: bold;
color: #1459BB;
line-height: 1;
margin-bottom: 8px;
}
.stat-label {
font-size: 14px;
color: #666;
}
.main-content {
display: flex;
gap: 10px;
margin-bottom: 40px;
height: 490px;
}
.left-section {
flex: 2;
background: white;
border-radius: 2px;
padding: 20px;
}
.section-header {
display: flex;
align-items: center;
margin-bottom: 20px;
}
.location-icon {
color: #409eff;
margin-right: 8px;
}
.section-title {
font-weight: 500;
margin-right: auto;
}
.time-filters {
display: flex;
gap: 15px;
}
.time-filters span {
cursor: pointer;
padding: 4px 8px;
border-radius: 4px;
font-size: 14px;
color: #666;
}
.time-filters span.active {
background-color: #409eff;
color: white;
}
.map-container {
// height: 300px;
background: #f0f2f5;
border-radius: 8px;
position: relative;
overflow: hidden;
}
.map-placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, #e3f2fd 0%, #f3e5f5 100%);
position: relative;
}
.data-point {
position: absolute;
}
.point-circle {
width: 30px;
height: 30px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 12px;
font-weight: bold;
}
.point-circle.yellow {
background-color: #f39c12;
}
.point-circle.red {
background-color: #e74c3c;
}
.point-circle.blue {
background-color: #3498db;
}
.right-section {
flex: 1;
background: white;
border-radius: 2px;
padding: 20px;
}
.signal-header {
display: flex;
align-items: center;
margin-bottom: 20px;
}
.signal-icon {
color: #f56c6c;
margin-right: 2px;
}
.signal-title {
font-weight: 500;
margin-right: 8px;
}
.signal-badge {
margin-right: auto;
}
.more-link {
color: #409eff;
font-size: 14px;
cursor: pointer;
}
.signal-list {
margin-bottom: 40px;
height: 330px;
overflow-y: auto;
}
.signal-item {
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid #f0f0f0;
}
.signal-item:last-child {
border-bottom: none;
}
.signal-content {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 12px;
}
.signal-left {
flex: 1;
display: flex;
gap: 6px;
}
.signal-tag {
align-self: flex-start;
}
.signal-text {
font-size: 14px;
color: #333;
line-height: 1.4;
word-break: break-word;
}
.signal-time {
font-size: 12px;
color: #999;
white-space: nowrap;
flex-shrink: 0;
}
.process-btn {
width: 100%;
}
.think-tanks-section {
display: flex;
flex-wrap: wrap;
gap: 20px;
justify-content: flex-start;
}
.think-tank-card {
background: white;
border-radius: 8px;
padding: 12px;
border: 1px solid #e4e7ed;
width: 220px;
// height: 180px;
flex-shrink: 0;
display: flex;
flex-direction: column;
cursor: pointer;
}
.tank-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 15px;
}
.tank-logo {
width: 60px;
height: 60px;
background: #f0f0f0;
border-radius: 8px;
margin-right: 15px;
display: flex;
align-items: center;
justify-content: center;
.el-image {
width: 100%;
height: 100%;
border-radius: 8px;
object-fit: contain;
}
}
.tank-logo img {
width: 100%;
height: 100%;
object-fit: contain;
}
.tank-country {
background: #f0f0f0;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
color: #666;
}
.tank-name {
font-size: 16px;
font-weight: 500;
margin-bottom: 10px;
color: #333;
}
.tank-description {
font-size: 12px;
color: #666;
flex: 1;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
margin-bottom: 5px;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
.tank-tags {
display: flex;
gap: 8px;
flex-wrap: wrap;
margin-top: auto;
}
.view-all {
text-align: center;
width: 180px;
padding: 0 5px;
background: #fff;
display: flex;
align-items: center;
cursor: pointer;
}
.view-all-link {
color:#1459BB;
font-size: 16px;
font-weight: 600;
text-align: center;
margin: 0 auto;
}
.view-all-link:hover {
text-decoration: underline;
}
</style>
\ No newline at end of file
<template>
<div class="effect-analysis">
<div class="placeholder-card">
<div class="card-header">
<CardTitle title="影响分析" />
<el-icon class="expand-icon"><TrendCharts /></el-icon>
</div>
<div class="card-body">
<div class="placeholder-content">
<h3 class="placeholder-title">影响分析功能开发中</h3>
<el-empty description="暂无数据" />
</div>
</div>
</div>
</div>
</template>
<script setup>
import { TrendCharts } from '@element-plus/icons-vue'
import CardTitle from '@/components/CardTitle.vue'
</script>
<style scoped>
.effect-analysis {
/* padding: 20px 0; */
}
.placeholder-card {
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
min-height: 500px;
}
.card-header {
padding: 16px 20px;
border-bottom: 1px solid #f0f0f0;
display: flex;
justify-content: space-between;
align-items: center;
}
.card-body {
padding: 40px 20px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
}
.expand-icon {
color: #999;
}
.placeholder-content {
display: flex;
flex-direction: column;
align-items: center;
max-width: 400px;
}
.placeholder-icon {
margin-bottom: 24px;
color: #d3d3d3;
}
.placeholder-title {
font-size: 20px;
color: #333;
margin: 0 0 16px 0;
}
.placeholder-description {
font-size: 14px;
color: #666;
margin-bottom: 20px;
line-height: 1.6;
}
.feature-list {
list-style: none;
padding: 0;
margin: 0 0 30px 0;
text-align: left;
}
.feature-list li {
padding: 8px 0;
color: #666;
font-size: 14px;
position: relative;
padding-left: 20px;
}
.feature-list li::before {
content: "•";
color: #409eff;
font-weight: bold;
position: absolute;
left: 0;
}
</style>
<template>
<div class="overview-container">
<el-row :gutter="20">
<!-- 左侧内容 -->
<el-col :span="8">
<!-- 内容摘要 -->
<div class="content-card">
<div class="card-header">
<CardTitle title="内容摘要" />
<el-icon class="expand-icon"><ArrowRight /></el-icon>
</div>
<div class="card-body">
<div class="summary-content">
<div v-html="props.reportSummary.summary"></div>
<el-button type="text" class="more-btn">查看更多 ></el-button>
</div>
</div>
</div>
<!-- 涉及科技领域 -->
<div class="content-card tech-fields" style="margin-top: 20px;">
<div class="card-header">
<CardTitle title="涉及科技领域" />
<el-icon class="expand-icon"><ArrowRight /></el-icon>
</div>
<div class="card-body">
<div class="tech-tags">
<el-tag type="primary" size="small" v-for="tag in props.reportSummary.researchTypes" :key="tag">{{ tag }}</el-tag>
</div>
</div>
</div>
</el-col>
<!-- 右侧主要内容 -->
<el-col :span="16">
<div class="content-card main-content-card">
<div class="card-header">
<CardTitle title="主要内容" />
<div class="content-actions">
<el-button type="plain" size="small">核心发现</el-button>
<el-button type="plain" size="small">政策建议</el-button>
<el-icon class="expand-icon"><Paperclip /></el-icon>
</div>
</div>
<div class="card-body">
<div class="main-content-list">
<div v-for="(item, index) in mainContentList" :key="item.id" class="content-item">
<!-- 左侧:序号 -->
<div class="item-number">{{ item.serialNum }}</div>
<!-- 中间:标题和内容 -->
<div class="item-main">
<h4 class="item-title">{{ item.title }}</h4>
<p class="item-content">{{ item.content }}</p>
</div>
<!-- 右侧:标签 -->
<div class="item-tags">
<el-tag
v-for="tag in item.tags"
:key="tag.name"
:type="tag.type"
size="small"
class="content-tag"
>
{{ tag.name }}
</el-tag>
</div>
</div>
</div>
<!-- 分页 -->
<div class="pagination-wrapper">
<el-pagination
v-model:current-page="currentPage"
:page-size="pageSize"
:total="totalElements"
layout="prev, pager, next"
:pager-count="5"
small
/>
<span class="total-info">{{ totalElements }}项结果</span>
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { Paperclip } from '@element-plus/icons-vue'
import CardTitle from '@/components/CardTitle.vue'
const props = defineProps({
reportSummary: {
type: Object,
required: true
},
content: {
type: Object,
required: true
}
})
const currentPage = ref(1)
const totalElements = ref(6)
const pageSize = ref(10)
// 标签类型映射 - 根据限制方式设置不同的标签颜色
const getTagType = (tagName) => {
const tagTypeMap = {
'出口管制': 'danger',
'资本管制': 'warning',
'技术封锁': 'danger',
'金融制裁': 'danger',
'对台军售': 'warning',
'关税贸易': 'primary',
'供应链打击': 'warning'
}
return tagTypeMap[tagName] || 'info'
}
// 处理接口数据的方法
const processApiData = (apiResponse) => {
if (!apiResponse || !apiResponse.content) return []
return apiResponse.content.map(item => ({
id: item.id,
title: item.content, // 使用content作为标题
content: item.content, // 内容
econtent: item.econtent,
serialNum: item.serialNum,
tags: item.xzfsList.map(tag => ({
name: tag,
type: getTagType(tag)
}))
}))
}
// 更新分页信息的方法
const updatePagination = (apiResponse) => {
if (apiResponse) {
totalElements.value = apiResponse.totalElements || 0
pageSize.value = apiResponse.size || 10
currentPage.value = (apiResponse.number || 0) + 1 // API返回的是0基础的页码
}
}
const mainContentList = ref([
{
id: 1,
title: '主要内容1',
content: '主要内容1',
econtent: 'main content one',
serialNum: 1,
tags: [
{ name: '出口管制', type: 'danger' },
{ name: '资本管制', type: 'warning' },
{ name: '技术封锁', type: 'danger' }
]
},
{
id: 2,
title: '主要内容2',
content: '主要内容2',
econtent: 'main content two',
serialNum: 2,
tags: [
{ name: '金融制裁', type: 'danger' }
]
},
{
id: 3,
title: '主要内容3',
content: '主要内容3',
econtent: 'main content three',
serialNum: 3,
tags: [
{ name: '资本管制', type: 'warning' }
]
},
{
id: 4,
title: '主要内容4',
content: '主要内容4',
econtent: 'main content four',
serialNum: 4,
tags: [
{ name: '对台军售', type: 'warning' }
]
},
{
id: 5,
title: '主要内容5',
content: '主要内容5',
econtent: 'main content five',
serialNum: 5,
tags: [
{ name: '出口管制', type: 'danger' }
]
},
{
id: 6,
title: '主要内容6',
content: '主要内容6',
econtent: 'main content six',
serialNum: 6,
tags: [
{ name: '关税贸易', type: 'primary' },
{ name: '供应链打击', type: 'warning' }
]
}
])
</script>
<style scoped>
.overview-container {
padding: 0;
}
.content-card {
background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
.card-header {
padding: 16px 20px;
border-bottom: 1px solid #f0f0f0;
display: flex;
justify-content: space-between;
align-items: center;
}
.card-body {
padding: 20px;
}
.expand-icon {
color: #999;
cursor: pointer;
margin-left: 10px;
}
.summary-content {
line-height: 1.8;
color: #666;
}
.summary-content p {
margin-bottom: 16px;
text-align: justify;
}
.more-btn {
color: #409eff;
padding: 0;
}
.tech-tags {
display: flex;
gap: 12px;
}
.tag-row {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.tech-tag {
background: #f5f7fa;
border: 1px solid #dcdfe6;
color: #606266;
border-radius: 4px;
padding: 4px 8px;
font-size: 12px;
}
.tech-tag.ai-chip {
background: #fff7e6;
border-color: #ffd591;
color: #fa8c16;
}
.content-actions {
display: flex;
align-items: center;
}
.main-content-list {
margin-bottom: 20px;
}
.content-item {
display: flex;
align-items: flex-start;
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #f0f0f0;
gap: 16px;
}
.content-item:last-child {
border-bottom: none;
margin-bottom: 0;
padding-bottom: 0;
}
.item-number {
width: 28px;
height: 28px;
background: #409eff;
color: white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 600;
flex-shrink: 0;
margin-top: 2px;
}
.item-main {
flex: 1;
min-width: 0;
}
.item-title {
margin: 0 0 8px 0;
font-size: 16px;
font-weight: 600;
color: #1f2937;
line-height: 1.4;
}
.item-content {
margin: 0;
line-height: 1.6;
color: #4b5563;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.item-tags {
display: flex;
flex-direction: column;
gap: 6px;
flex-shrink: 0;
min-width: 120px;
align-items: flex-end;
}
.content-tag {
font-size: 12px;
height: 22px;
line-height: 20px;
padding: 0 8px;
white-space: nowrap;
}
.pagination-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 20px;
border-top: 1px solid #f0f0f0;
}
.total-info {
font-size: 12px;
color: #999;
}
.pagination-wrapper :deep(.el-pagination) {
--el-pagination-font-size: 12px;
}
.pagination-wrapper :deep(.el-pagination .el-pager li) {
min-width: 28px;
height: 28px;
line-height: 28px;
}
.pagination-wrapper :deep(.el-pagination .btn-prev),
.pagination-wrapper :deep(.el-pagination .btn-next) {
height: 28px;
line-height: 28px;
}
/* 响应式设计 */
@media (max-width: 768px) {
.content-item {
flex-direction: column;
gap: 12px;
margin-bottom: 20px;
padding-bottom: 20px;
}
.item-number {
align-self: flex-start;
}
.item-main {
order: 2;
}
.item-tags {
order: 3;
flex-direction: row;
align-items: flex-start;
flex-wrap: wrap;
min-width: auto;
}
.item-title {
font-size: 15px;
}
.item-content {
font-size: 13px;
}
}
</style>
<template>
<div class="policy-tracking">
<el-row :gutter="20">
<!-- 左侧:政策建议落实情况 -->
<el-col :span="14">
<div class="policy-card">
<div class="card-header">
<CardTitle title="政策建议落实情况" />
<div class="filter-buttons">
<el-button
:class="{ active: activeFilter === 'all' }"
@click="setFilter('all')"
size="small"
text
>
全部
</el-button>
<el-button
:class="{ active: activeFilter === 'implemented' }"
@click="setFilter('implemented')"
size="small"
text
>
已实施
</el-button>
<el-button
:class="{ active: activeFilter === 'partial' }"
@click="setFilter('partial')"
size="small"
text
>
部分实施
</el-button>
<el-button
:class="{ active: activeFilter === 'pending' }"
@click="setFilter('pending')"
size="small"
text
>
未实施
</el-button>
</div>
</div>
<div class="card-body">
<div class="policy-list">
<div
v-for="(item, index) in props.policy"
:key="index"
class="policy-item"
@click="openPolicyDetail(item)"
>
<div class="policy-number">{{ index + 1 }}</div>
<div class="policy-content">
<p class="policy-text">{{ item.content }}</p>
<!-- <div class="policy-tags">
<el-tag size="small">{{ item.category }}</el-tag>
<el-tag size="small">{{ item.subcategory }}</el-tag>
</div> -->
<!-- <div class="policy-status">
<div class="status-info">
<span class="status-label">相关立法已通过:</span>
<span class="status-bill">{{ item.relatedBill }}</span>
<el-tag
:type="getStatusType(item.status)"
size="small"
class="status-tag"
>
{{ item.status }}
</el-tag>
</div>
</div> -->
</div>
<div class="policy-status">
<el-tag :type="getStatusType(item.status)" size="small">{{ item.status }}</el-tag>
</div>
</div>
</div>
</div>
</div>
</el-col>
<!-- 右侧:相关政策动态 -->
<el-col :span="10">
<div class="policy-dynamics-card">
<div class="card-header">
<CardTitle title="相关政策动态" />
<el-button type="text" size="small" class="more-link">
查看更多
<el-icon><ArrowRight /></el-icon>
</el-button>
</div>
<div class="card-body">
<!-- 暂未开发 -->
<!-- <el-empty description="暂无数据" /> -->
<div class="dynamics-list">
<div
v-for="(item, index) in policyDynamics"
:key="index"
class="dynamics-item"
>
<div class="dynamics-content">
<div class="dynamics-header">
<div class="dynamics-dot"></div>
<h4 class="dynamics-title">{{ item.title }}</h4>
<span class="dynamics-date">{{ item.date }}</span>
</div>
<p class="dynamics-description">{{ item.description }}</p>
<div class="dynamics-image" v-if="item.image">
<img :src="item.image" :alt="item.title" />
</div>
</div>
</div>
</div>
</div>
</div>
</el-col>
</el-row>
<!-- 政策详情弹窗 -->
<el-dialog
v-model="showDetailModal"
title="智库政策追踪"
width="800px"
class="policy-detail-dialog"
@close="closeDetailModal"
>
<div v-if="selectedPolicy" class="policy-detail-content">
<!-- 政策标题 -->
<h3 class="policy-detail-title">{{ selectedPolicy.text }}</h3>
<!-- 标签区域 -->
<div class="policy-detail-tags">
<el-tag size="small">{{ selectedPolicy.category }}</el-tag>
<el-tag size="small">{{ selectedPolicy.subcategory }}</el-tag>
</div>
<!-- 政策详细内容 -->
<div class="policy-detail-body">
<p class="policy-description">
{{ selectedPolicy.detailedDescription || selectedPolicy.text }}
</p>
</div>
<!-- 相关法案信息 -->
<div v-if="selectedPolicy.relatedBill" class="related-bill-section">
<div class="bill-info">
<span class="bill-label">相关立法已通过:</span>
<span class="bill-name">{{ selectedPolicy.relatedBill }}</span>
<el-tag
:type="getStatusType(selectedPolicy.status)"
size="small"
class="bill-status"
>
{{ selectedPolicy.status }}
</el-tag>
</div>
</div>
<!-- 右侧信息区域 -->
<div class="policy-side-info">
<div class="think-tank-info">
<div class="think-tank-cover">
<img src="https://picsum.photos/120/160?random=7" alt="智库报告" />
</div>
<div class="think-tank-details">
<h4 class="think-tank-title">兰德科技智库</h4>
<p class="publish-date">2025年6月26日</p>
<p class="report-title">中美经济竞争:复杂经济和地缘政治关系中的收益与风险</p>
<el-button type="primary" size="small" class="download-btn">
<el-icon><Download /></el-icon>
下载智库报告原文
</el-button>
</div>
</div>
</div>
</div>
</el-dialog>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
import { ArrowRight, Download } from '@element-plus/icons-vue'
import CardTitle from '@/components/CardTitle.vue'
// props
const props = defineProps({
policy: {
type: Array,
required: true
}
})
const activeFilter = ref('all')
const showDetailModal = ref(false)
const selectedPolicy = ref(null)
// 政策建议落实情况数据
const policyList = ref([
{
text: '允许OPT的国际学生出国旅行并持多次入境签证重新进入美国。',
category: '人才交流',
subcategory: '移民政策',
relatedBill: '2024重塑美国人口结构法案',
status: '已实施',
detailedDescription: '当前基于就业的绿卡上限设定为140,000个。每个国家的上限设定为总数的7%。这意味着每年只有大约9,800名在美国的中国工人可以通过就业优先类别成为合法永久居民。这个上限造成了符合要求的中国申请者的积压,他们必须等待多年才能获得绿卡批准。在这种情况中,高技能移民报告他们有意愿离开第三国或返回原籍国。美国可以从自己1992年通过的《华人学生保护法》中汲取训练。该法案使某些中国公民免于上限和其他要求。因此,54,000名中国移民住于了这个机会。受过教育的中国移民的回归率较低于今天,尽管有美国移民身份可以让他们提高工人在中国劳动力市场的价值并降低回中国的风险来同时间注,但持有绿卡可以对回归的效果太大,因为维持绿卡需要满足国际任务要求。'
},
{
text: '增加中国公民可获得 H-1B 签证数量。',
category: '人才交流',
subcategory: '移民政策',
relatedBill: '2024调整签证政策以吸纳外国重点领域人才法案',
status: '部分实施'
},
{
text: '通过就业偏好类别增加卡的数量。',
category: '人才交流',
subcategory: '移民政策',
relatedBill: '2024重塑美国人口结构法案',
status: '已实施'
},
{
text: '推动清洁能源生产的内,化石燃料重新配置出口。',
category: '人才交流',
subcategory: '移民政策',
relatedBill: '',
status: '未实施'
},
{
text: '支持国内核工业商业化扩张。',
category: '人才交流',
subcategory: '移民政策',
relatedBill: '2024重塑美国人口结构法案',
status: '已实施'
},
{
text: '在美国和友好国家建立关键矿产加工能力',
category: '人才交流',
subcategory: '移民政策',
relatedBill: '2024重塑美国人口结构法案',
status: '已实施'
}
])
// 相关政策动态数据
const policyDynamics = ref([
{
title: '减税与就业法案的出台与立法博弈',
date: '2025-08-30',
description: '2017年,美国通过了一项旨在根本性以来最为重大的税制改革——《减税与就业法案》...',
image: 'https://picsum.photos/80/60?random=1'
},
{
title: '信用评级机构穆迪下调美国信用评级',
date: '2025-05-16',
description: '2025年5月16日,信用评级机构穆迪自2011年以来第三次下调美国主权信用评级,首...',
image: 'https://picsum.photos/80/60?random=2'
},
{
title: '马斯克与特朗普首次会',
date: '2025-05-16',
description: '马斯克5月30日高任政府效率部负责人时与特朗普首次会面别,但6月3日美然批评OBB...',
image: 'https://picsum.photos/80/60?random=3'
},
{
title: '马斯克成立"美国党"',
date: '2025-05-16',
description: '7月5日(法案签署次日),马斯克宣布成立新政党"美国党",计划参与2026年中期...',
image: 'https://picsum.photos/80/60?random=4'
},
{
title: '"90天关税暂缓期"即将到期',
date: '2025-05-16',
description: '法案通过议会美国对多国"90天关税暂缓期"即将到期(2025年7月9日),欧盟...',
image: 'https://picsum.photos/80/60?random=5'
},
{
title: '减税与就业法案的出台与立法博弈',
date: '2025-08-30',
description: '2017年,美国通过了一项旨在根本性以来最为重大的税制改革——《减税与就业法案》...',
image: 'https://picsum.photos/80/60?random=6'
}
])
// 过滤后的政策列表
const filteredPolicyList = computed(() => {
if (activeFilter.value === 'all') {
return policyList.value
}
const statusMap = {
'implemented': '已实施',
'partial': '部分实施',
'pending': '未实施'
}
return policyList.value.filter(item => item.status === statusMap[activeFilter.value])
})
// 设置过滤器
const setFilter = (filter) => {
activeFilter.value = filter
}
// 获取状态标签类型
const getStatusType = (status) => {
const typeMap = {
'已实施': 'success',
'部分实施': 'warning',
'未实施': 'info'
}
return typeMap[status] || 'info'
}
// 打开政策详情弹窗
const openPolicyDetail = (policy) => {
selectedPolicy.value = policy
showDetailModal.value = true
}
// 关闭政策详情弹窗
const closeDetailModal = () => {
showDetailModal.value = false
selectedPolicy.value = null
}
</script>
<style scoped>
.policy-tracking {
/* padding: 20px 0; */
}
.policy-card,
.policy-dynamics-card {
border: 1px solid #e4e7ed;
border-radius: 8px;
height: fit-content;
}
.policy-card,
.policy-dynamics-card {
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
.policy-card .card-header,
.policy-dynamics-card .card-header {
padding: 16px 20px;
border-bottom: 1px solid #f0f0f0;
display: flex;
justify-content: space-between;
align-items: center;
}
.policy-card .card-body,
.policy-dynamics-card .card-body {
padding: 20px;
max-height: 600px;
overflow-y: auto;
}
.filter-buttons {
display: flex;
gap: 8px;
}
.filter-buttons .el-button {
color: #666;
padding: 4px 8px;
border-radius: 4px;
border: 1px solid transparent;
}
.filter-buttons .el-button.active {
color: #409eff;
background: #ecf5ff;
border-color: #b3d8ff;
}
.more-link {
color: #666;
display: flex;
align-items: center;
gap: 4px;
}
/* 左侧政策列表样式 */
.policy-list {
display: flex;
flex-direction: column;
gap: 20px;
}
.policy-item {
display: flex;
gap: 12px;
padding-bottom: 20px;
border-bottom: 1px solid #f0f0f0;
cursor: pointer;
transition: background-color 0.2s;
}
.policy-item:hover {
background-color: #f8f9fa;
}
.policy-item:last-child {
border-bottom: none;
padding-bottom: 0;
}
.policy-item:last-child:hover {
padding-bottom: 12px;
}
.policy-number {
width: 24px;
height: 24px;
background: #409eff;
color: white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: 600;
flex-shrink: 0;
margin-top: 2px;
}
.policy-content {
flex: 1;
}
.policy-text {
margin: 0 0 12px 0;
line-height: 1.6;
color: #333;
font-size: 14px;
}
.policy-tags {
display: flex;
gap: 8px;
margin-bottom: 12px;
}
.policy-status {
/* background: #f8f9fa; */
padding: 8px 12px;
border-radius: 4px;
/* border-left: 3px solid #409eff; */
}
.status-info {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.status-label {
font-size: 12px;
color: #666;
}
.status-bill {
font-size: 12px;
color: #409eff;
font-weight: 500;
}
.status-tag {
margin-left: auto;
}
/* 右侧动态列表样式 */
.dynamics-list {
display: flex;
flex-direction: column;
gap: 16px;
}
.dynamics-item {
position: relative;
padding-left: 16px;
}
.dynamics-item:not(:last-child)::before {
content: '';
position: absolute;
left: 6px;
top: 20px;
bottom: -16px;
width: 1px;
background: #e4e7ed;
}
.dynamics-content {
background: white;
position: relative;
}
.dynamics-header {
display: flex;
align-items: flex-start;
gap: 8px;
margin-bottom: 8px;
position: relative;
}
.dynamics-dot {
width: 8px;
height: 8px;
background: #409eff;
border-radius: 50%;
flex-shrink: 0;
margin-top: 6px;
position: absolute;
left: -12px;
z-index: 1;
}
.dynamics-title {
font-size: 14px;
font-weight: 600;
color: #409eff;
margin: 0;
flex: 1;
line-height: 1.4;
}
.dynamics-date {
font-size: 12px;
color: #999;
flex-shrink: 0;
}
.dynamics-description {
font-size: 13px;
color: #666;
line-height: 1.5;
margin: 0 0 8px 0;
max-width: 320px;
}
.dynamics-image {
width: 80px;
height: 60px;
border-radius: 4px;
overflow: hidden;
float: right;
margin-left: 12px;
margin-top: -40px;
}
.dynamics-image img {
width: 100%;
height: 100%;
object-fit: cover;
}
/* 弹窗样式 */
.policy-detail-dialog :deep(.el-dialog) {
border-radius: 8px;
}
.policy-detail-dialog :deep(.el-dialog__header) {
padding: 20px 24px 16px;
border-bottom: 1px solid #e4e7ed;
}
.policy-detail-dialog :deep(.el-dialog__title) {
font-size: 18px;
font-weight: 600;
color: #333;
}
.policy-detail-dialog :deep(.el-dialog__body) {
padding: 24px;
}
.policy-detail-content {
display: flex;
flex-direction: column;
gap: 20px;
position: relative;
}
.policy-detail-title {
font-size: 16px;
font-weight: 600;
color: #333;
margin: 0;
line-height: 1.5;
padding-right: 140px;
}
.policy-detail-tags {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.policy-detail-body {
margin: 16px 0;
}
.policy-description {
font-size: 14px;
color: #666;
line-height: 1.8;
margin: 0;
text-align: justify;
padding-right: 140px;
}
.related-bill-section {
background: #f8f9fa;
padding: 16px;
border-radius: 6px;
border-left: 3px solid #409eff;
margin-right: 140px;
}
.bill-info {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.bill-label {
font-size: 14px;
color: #666;
}
.bill-name {
font-size: 14px;
color: #409eff;
font-weight: 500;
}
.bill-status {
margin-left: auto;
}
/* 右侧信息区域 */
.policy-side-info {
position: absolute;
top: 0;
right: 0;
width: 120px;
}
.think-tank-info {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.think-tank-cover {
width: 120px;
height: 160px;
border-radius: 6px;
overflow: hidden;
margin-bottom: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.think-tank-cover img {
width: 100%;
height: 100%;
object-fit: cover;
}
.think-tank-details {
width: 100%;
}
.think-tank-title {
font-size: 12px;
font-weight: 600;
color: #333;
margin: 0 0 4px 0;
}
.publish-date {
font-size: 11px;
color: #999;
margin: 0 0 8px 0;
}
.report-title {
font-size: 11px;
color: #666;
line-height: 1.4;
margin: 0 0 12px 0;
display: -webkit-box;
-webkit-line-clamp: 3;
line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.download-btn {
font-size: 10px;
padding: 4px 8px;
height: auto;
display: flex;
align-items: center;
gap: 4px;
}
.download-btn .el-icon {
font-size: 12px;
}
/* 响应式调整 */
@media (max-width: 768px) {
.policy-tracking :deep(.el-row) {
flex-direction: column;
}
.policy-tracking :deep(.el-col) {
width: 100% !important;
margin-bottom: 20px;
}
.policy-detail-title,
.policy-description {
padding-right: 0;
}
.related-bill-section {
margin-right: 0;
}
.policy-side-info {
position: static;
width: 100%;
margin-top: 20px;
}
.think-tank-info {
flex-direction: row;
text-align: left;
gap: 16px;
}
.think-tank-cover {
width: 80px;
height: 100px;
margin-bottom: 0;
}
.think-tank-details {
flex: 1;
}
}
</style>
\ No newline at end of file
<template>
<div class="page-container">
<!-- Header 占满宽度 -->
<header class="report-header">
<div class="header-container">
<div class="header-content">
<div class="title-area">
<div class="source-info">
<!-- <img src="/placeholder.svg?height=40&width=40" alt="智库logo" class="source-logo"> -->
<span class="source-name">{{ reportSummary.thinkTankName }}</span>
</div>
<h1 class="main-title">{{ reportSummary.name }}</h1>
<h2 class="sub-title">{{ reportSummary.ename }}</h2>
<div class="tags-area">
<el-tag type="primary" size="small" v-for="tag in reportSummary.tags" :key="tag">{{ tag }}</el-tag>
</div>
</div>
<div class="meta-info">
<div class="publish-date">{{ reportSummary.times }}</div>
</div>
</div>
</div>
<!-- Tab切换区域 -->
<div class="header-tabs">
<div class="tabs-container">
<el-tabs v-model="activeTab" class="header-tab-nav">
<el-tab-pane label="内容摘要" name="summary">
<template #label>
<span class="tab-label">
<el-icon><Document /></el-icon>
内容摘要
</span>
</template>
</el-tab-pane>
<el-tab-pane label="政策追踪" name="policy">
<template #label>
<span class="tab-label">
<el-icon><Search /></el-icon>
政策追踪
</span>
</template>
</el-tab-pane>
<el-tab-pane label="影响分析" name="analysis">
<template #label>
<span class="tab-label">
<el-icon><TrendCharts /></el-icon>
影响分析
</span>
</template>
</el-tab-pane>
</el-tabs>
<div class="action-buttons">
<el-button type="plain" size="default">
<el-icon><Link /></el-icon>
查看官网
</el-button>
<el-button type="plain" size="default">
<el-icon><Download /></el-icon>
下载原文
</el-button>
<el-button type="primary" size="default">
<el-icon><DataAnalysis /></el-icon>
分析报告
</el-button>
</div>
</div>
</div>
</header>
<!-- Main Content 最大宽度1200px并居中 -->
<main class="main-content">
<div class="content-container">
<!-- 根据activeTab显示不同的组件 -->
<Overview v-if="activeTab === 'summary'" :reportSummary="reportSummary" :content="content" />
<Policy v-else-if="activeTab === 'policy'" :policy="policy" />
<Effect v-else-if="activeTab === 'analysis'" />
</div>
</main>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import {
Document,
Search,
TrendCharts,
Link,
Download,
DataAnalysis
} from '@element-plus/icons-vue'
import {
getThinkTankReportSummary,
getThinkTankReportContent,
getThinkTankReportPolicy
} from '@/api'
import { useRoute } from 'vue-router'
// 引入组件
import Overview from './Overview.vue'
import Policy from './Policy.vue'
import Effect from './Effect.vue'
const activeTab = ref('summary')
const route = useRoute()
const reportSummary = ref({})
const content = ref({})
const policy = ref([])
const getReportSummary = async () => {
const { data } = await getThinkTankReportSummary({ id: route.params.id })
console.log('getReportSummary', data)
reportSummary.value = data
}
const getContent = async () => {
const { data } = await getThinkTankReportContent({ id: route.params.id })
console.log('getContent', data)
content.value = data
}
const getPolicy = async () => {
const { data } = await getThinkTankReportPolicy({ id: route.params.id })
console.log('getPolicy', data)
policy.value = data
}
onMounted(() => {
getReportSummary()
getContent()
getPolicy()
})
</script>
<style scoped>
.page-container {
background-color: #f5f7fa;
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif;
min-height: 100vh;
width: 100%;
}
/* Header Styles - 占满宽度 */
.report-header {
background-color: #fff;
width: 100%;
margin-bottom: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
.header-container {
max-width: 1200px;
margin: 0 auto;
padding: 24px 24px 0;
}
.header-content {
display: flex;
justify-content: space-between;
align-items: flex-start;
}
.title-area {
flex: 1;
}
.source-info {
display: flex;
align-items: center;
margin-bottom: 15px;
}
.source-logo {
width: 40px;
height: 40px;
border-radius: 8px;
margin-right: 10px;
}
.source-name {
font-size: 14px;
color: #666;
}
.main-title {
font-size: 24px;
font-weight: 600;
color: #333;
margin: 0 0 8px 0;
line-height: 1.4;
}
.sub-title {
font-size: 16px;
color: #666;
font-weight: normal;
margin: 0 0 15px 0;
line-height: 1.4;
}
.tags-area {
display: flex;
gap: 8px;
}
.meta-info {
text-align: right;
color: #666;
font-size: 14px;
}
.publish-date {
color: #8B5CF6;
font-weight: 500;
}
/* Header Tabs区域 */
.header-tabs {
background-color: #fff;
width: 100%;
margin-top: 20px;
}
.tabs-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #e4e7ed;
}
.header-tab-nav {
flex: 1;
margin: 0;
}
.header-tab-nav :deep(.el-tabs__header) {
margin: 0;
border-bottom: none;
}
.header-tab-nav :deep(.el-tabs__nav-wrap) {
padding: 0;
}
.header-tab-nav :deep(.el-tabs__nav-wrap::after) {
display: none;
}
.header-tab-nav :deep(.el-tabs__item) {
font-size: 16px;
font-weight: 500;
color: #606266;
padding: 16px 24px;
border-bottom: 3px solid transparent;
transition: all 0.3s ease;
}
.header-tab-nav :deep(.el-tabs__item:hover) {
color: #409eff;
}
.header-tab-nav :deep(.el-tabs__item.is-active) {
color: #409eff;
border-bottom-color: #409eff;
font-weight: 600;
}
.header-tab-nav :deep(.el-tabs__active-bar) {
display: none;
}
.tab-label {
display: flex;
align-items: center;
gap: 5px;
}
.action-buttons {
display: flex;
align-items: center;
}
.action-buttons .el-button {
display: flex;
align-items: center;
gap: 4px;
}
/* Main Content Styles - 最大宽度1200px并居中 */
.main-content {
width: 100%;
display: flex;
justify-content: center;
padding: 0 24px;
}
.content-container {
max-width: 1200px;
width: 100%;
border-radius: 8px;
}
/* 响应式设计 */
@media (max-width: 1240px) {
.header-container {
padding: 24px 20px 0;
}
.tabs-container {
padding: 0 20px;
}
}
@media (max-width: 1040px) {
.content-container {
margin: 0 20px;
}
.main-content {
padding: 0;
}
}
@media (max-width: 768px) {
.header-container {
padding: 16px 16px 0;
}
.header-content {
flex-direction: column;
gap: 16px;
}
.tabs-container {
flex-direction: column;
gap: 16px;
align-items: stretch;
padding: 0 16px;
}
.header-tab-nav :deep(.el-tabs__item) {
padding: 12px 16px;
font-size: 14px;
}
.action-buttons {
justify-content: center;
}
.content-container {
margin: 0 16px;
padding: 16px;
}
}
@media (max-width: 480px) {
.header-container {
padding: 12px 12px 0;
}
.tabs-container {
padding: 0 12px;
}
.header-tab-nav :deep(.el-tabs__item) {
padding: 10px 12px;
font-size: 13px;
}
.content-container {
margin: 0 12px;
padding: 12px;
}
.main-title {
font-size: 20px;
}
.sub-title {
font-size: 14px;
}
.action-buttons {
flex-wrap: wrap;
gap: 8px;
}
.action-buttons .el-button {
font-size: 12px;
}
}
</style>
\ No newline at end of file
<template>
<div class="desc-tab">
<!-- 上半部分:基本信息和概况 -->
<div class="top-section">
<!-- 左侧:基本信息卡片 -->
<div class="basic-info-card">
<!-- 基本信息 cardtitle -->
<CardTitle title="基本信息" />
<div class="tank-image">
<img src="https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=400" alt="智库建筑" />
</div>
<div class="info-content">
<div class="info-row">
<span class="label">国家:</span>
<span class="value">{{ thinkTankInfo.country }}</span>
</div>
<div class="info-row">
<span class="label">成立时间:</span>
<span class="value">{{ thinkTankInfo.foundingDate }}</span>
</div>
<div class="info-row">
<span class="label">总部位置:</span>
<span class="value">{{ thinkTankInfo.position }}</span>
</div>
<div class="info-row">
<span class="label">机构性质:</span>
<span class="value">{{ thinkTankInfo.nature }}</span>
</div>
<div class="info-row">
<span class="label">员工数量:</span>
<span class="value">{{ thinkTankInfo.memnum }}</span>
</div>
<div class="info-row">
<span class="label">年度预算:</span>
<span class="value">{{ thinkTankInfo.budget }}</span>
</div>
</div>
<div class="additional-info">
<CardTitle title="全球分支机构" />
<div class="branch-list">
<div class="branch-item" v-for="(item, key) in branchInfo" :key="key">
<span class="location">{{ key }}</span>
<span class="desc">{{ item .join('、')}}</span>
</div>
</div>
</div>
</div>
<!-- 右侧:经费概况和研究领域 -->
<div class="right-section">
<!-- 经费概况 -->
<div class="funding-overview">
<div class="section-header">
<CardTitle title="经费来源" />
<el-icon class="expand-icon"><MoreFilled /></el-icon>
</div>
<div class="funding-content">
<!-- 左侧总计信息 -->
<div class="funding-left">
<!-- 总计 -->
<div class="funding-total">
<div class="total-label">总计</div>
<div class="total-amount">{{ fundTotal.totalJe }}美元</div>
</div>
<!-- 主要分类 -->
<div class="funding-categories">
<div class="category-group">
<div class="category-header">
<div class="category-title">政府部门</div>
<div class="category-amount">{{ fundTotal.zfJe }}美元</div>
</div>
</div>
<div class="category-group">
<div class="category-header">
<div class="category-title">其他机构</div>
<div class="category-amount">{{ fundTotal.otherJe }}美元</div>
</div>
</div>
</div>
</div>
<!-- 右侧ECharts环形饼图 -->
<div class="funding-right">
<div ref="fundingChart" class="funding-chart"></div>
</div>
</div>
</div>
<div class="timeline-section">
<div class="section-header">
<CardTitle title="研究领域概览" />
<el-icon class="expand-icon"><MoreFilled /></el-icon>
</div>
<div class="timeline-container">
<div class="timeline-periods">
<div class="period-item active" v-for="value in researchAreas" :key="value.id">
<div class="period-title">{{ value.time }}</div>
<div class="period-desc">{{ value.describe }}</div>
</div>
</div>
<div class="timeline-line">
<div class="timeline-progress"></div>
<div class="timeline-dots">
<div class="dot active" v-for="value in researchAreas" :key="value.id"></div>
</div>
</div>
</div>
</div>
<!-- 核心研究人员 -->
<div class="core-researchers-section">
<div class="section-header">
<CardTitle title="核心研究人员" />
<el-icon class="more-icon">
<MoreFilled />
</el-icon>
</div>
<div class="researchers-grid">
<div class="researchers-column">
<div
v-for="researcher in coreResearchers"
:key="researcher.id"
class="researcher-item"
>
<div class="researcher-avatar">
<el-image :src="$withFallbackImage(researcher.avatar, researcher.name) " :alt="researcher.name" />
</div>
<div class="researcher-info">
<h4 class="researcher-name">{{ researcher.name }}</h4>
<p class="researcher-position">{{ researcher.describe }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, nextTick } from 'vue'
import { MoreFilled } from '@element-plus/icons-vue'
import * as echarts from 'echarts'
import {
getThinkTankBasicInfo,
getThinkTankBranchInfo,
getThinkTankFundsSource,
getThinkTankFundsTotal,
getThinkTankResearchArea,
getThinkTankPersonList
} from '@/api'
import { useRoute } from 'vue-router'
// 组件状态
const activeTimelinePeriod = ref(0)
const fundingChart = ref(null)
const route = useRoute()
// 经费数据
const fundingData = ref([])
// 初始化ECharts图表
const initFundingChart = () => {
if (!fundingChart.value) return
const chart = echarts.init(fundingChart.value)
const option = {
tooltip: {
trigger: 'item',
formatter: '{b}: {c}万 ({d}%)'
},
series: [
{
name: '经费来源',
type: 'pie',
radius: ['50%', '70%'], // 环形图
center: ['50%', '50%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 2,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: true,
position: 'outside',
formatter: (params) => {
return `{amount|${params.value}万} {percent|${params.percent}%}\n{name|${params.name}}`
},
rich: {
amount: {
fontSize: 12,
fontWeight: 'bold',
color: '#1f2937'
},
percent: {
fontSize: 11,
color: '#6b7280'
},
name: {
fontSize: 11,
color: '#4b5563',
lineHeight: 16
}
},
lineHeight: 14
},
labelLine: {
show: true,
length: 20,
length2: 15,
smooth: 0.2,
lineStyle: {
color: '#d1d5db',
width: 1
}
},
data: fundingData.value.map(item => ({
value: item.value,
name: item.name,
}))
}
]
}
chart.setOption(option)
// 响应式处理
const handleResize = () => {
chart.resize()
}
window.addEventListener('resize', handleResize)
// 组件销毁时清理
return () => {
window.removeEventListener('resize', handleResize)
chart.dispose()
}
}
// 时间线数据
const timelinePeriods = ref([
{
title: '1940s-1950s',
description: '军事战略研究与国家安全研究,包括核战略、数学大战略分析'
},
{
title: '1960s-1970s',
description: '扩展至社会科学领域,包括教育政策、医疗卫生、城市问题研究'
},
{
title: '1980s-1990s',
description: '增加国际发展研究,关注苏联解体后的地缘政治格局'
},
{
title: '2000s-2010s',
description: '重点关注反恐战略,网络安全、能源政策和气候变化'
},
{
title: '2020s-现在',
description: '聚焦人工智能、大数据分析、全球竞争与合作关系'
}
])
// 旧的经费数据(已被上面的ECharts数据替代)
// const fundingData = ref({
// total: '4.358亿美元',
// government: '3.271亿美元',
// other: '1.087亿美元'
// })
// 研究领域数据
const researchAreas = ref([])
const thinkTankInfo = ref({})
const getThinkTankInfo = async () => {
const { data } = await getThinkTankBasicInfo({ id: route.params.id })
console.log(data)
thinkTankInfo.value = data
}
const branchInfo = ref({})
const getBranchInfo = async () => {
const { data } = await getThinkTankBranchInfo({ id: route.params.id })
// 以 area 为分组,将city 以逗号分隔
let branchInfoObj = {}
data.forEach(item => {
if (!branchInfoObj[item.area]) {
branchInfoObj[item.area] = []
}
branchInfoObj[item.area].push(item.city)
})
branchInfo.value = branchInfoObj
}
const getFundsSource = async () => {
const { data } = await getThinkTankFundsSource({ id: route.params.id })
console.log('getFundsSource', data)
fundingData.value = data.map(item => ({
value: item.amount,
name: item.institution,
// color: item.percent
}))
initFundingChart()
}
const fundTotal = ref({
totalJe: 0,
zfJe: 0,
otherJe: 0
})
const getFundTotal = async () => {
const { data } = await getThinkTankFundsTotal({ id: route.params.id })
console.log('getFundTotal', data)
fundTotal.value = data
}
const getResearchArea = async () => {
const { data } = await getThinkTankResearchArea({ id: route.params.id })
console.log('getResearchArea', data)
researchAreas.value = data
}
const getPersonList = async () => {
const { data } = await getThinkTankPersonList({ id: route.params.id })
console.log('getPersonList', data)
coreResearchers.value = data
}
// 初始化图表
onMounted(async () => {
getThinkTankInfo()
getBranchInfo()
getFundsSource()
getFundTotal()
getResearchArea()
getPersonList()
})
// 核心研究人员数据
const coreResearchers = ref([])
</script>
<style scoped>
.desc-tab {
min-height: 100vh;
}
/* 上半部分布局 */
.top-section {
display: flex;
gap: 20px;
align-items: flex-start;
}
/* 基本信息卡片 */
.basic-info-card {
min-width: 360px;
background: white;
border-radius: 12px;
padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
height: auto;
}
.tank-image {
margin-bottom: 20px;
margin-top: 10px;
}
.tank-image img {
width: 100%;
height: 180px;
object-fit: cover;
border-radius: 8px;
}
.info-content {
margin-bottom: 24px;
}
.info-row {
display: flex;
margin-bottom: 12px;
align-items: center;
}
.info-row .label {
font-weight: 500;
color: #374151;
min-width: 80px;
font-size: 14px;
}
.info-row .value {
color: #111827;
font-size: 14px;
}
.additional-info h4 {
font-size: 16px;
font-weight: 600;
color: #111827;
margin: 0 0 16px 0;
}
.branch-list {
display: flex;
flex-direction: column;
margin-top: 10px;
gap: 8px;
}
.branch-item {
margin-bottom: 8px;
font-size: 14px;
}
.branch-item .location {
font-weight: 500;
color: #374151;
}
.branch-item .desc {
color: #6b7280;
}
/* 右侧区域 */
.right-section {
display: flex;
flex-direction: column;
gap: 20px;
}
/* 通用卡片样式 */
.funding-overview,
.research-overview {
background: white;
border-radius: 12px;
padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.section-header h3 {
font-size: 18px;
font-weight: 600;
color: #111827;
margin: 0;
}
.expand-icon {
color: #9ca3af;
cursor: pointer;
}
/* 经费概况 */
.funding-content {
display: flex;
gap: 40px;
align-items: flex-start;
}
.funding-left {
flex: 0 0 280px;
min-width: 0;
}
.funding-total {
margin-bottom: 20px;
padding-bottom: 16px;
border-bottom: 1px solid #e5e7eb;
}
.total-label {
font-size: 14px;
color: #6b7280;
margin-bottom: 4px;
}
.total-amount {
font-size: 24px;
font-weight: 700;
color: #1f2937;
}
.funding-categories {
margin-bottom: 20px;
}
.category-group {
margin-bottom: 16px;
}
.category-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 0;
}
.category-title {
font-size: 16px;
font-weight: 600;
color: #374151;
}
.category-amount {
font-size: 16px;
font-weight: 600;
color: #dc2626;
}
.funding-right {
flex: 1;
position: relative;
min-height: 400px;
}
.funding-chart {
width: 100%;
height: 400px;
min-height: 400px;
}
/* 研究领域概览 */
.research-content {
display: flex;
align-items: center;
gap: 24px;
}
.research-chart {
flex-shrink: 0;
}
.research-list {
flex: 1;
}
.research-item {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 12px;
}
.research-item:last-child {
margin-bottom: 0;
}
.color-dot {
width: 12px;
height: 12px;
border-radius: 50%;
flex-shrink: 0;
}
.research-info {
display: flex;
align-items: center;
gap: 8px;
flex: 1;
}
.research-info .percentage {
font-weight: 600;
color: #111827;
min-width: 30px;
font-size: 14px;
}
.research-info .name {
color: #374151;
font-size: 14px;
}
/* 饼图样式 */
.pie-chart {
position: relative;
}
.pie-chart svg {
transform: rotate(-90deg);
}
/* 时间线部分 */
.timeline-section {
background: white;
border-radius: 12px;
padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
.timeline-container {
position: relative;
}
.timeline-periods {
display: flex;
justify-content: space-between;
margin-bottom: 40px;
}
.period-item {
flex: 1;
padding: 0 16px;
text-align: center;
}
.period-item.active .period-title {
color: #3b82f6;
font-weight: 600;
}
.period-title {
font-size: 16px;
font-weight: 500;
color: #374151;
margin-bottom: 8px;
}
.period-desc {
font-size: 13px;
color: #6b7280;
line-height: 1.4;
}
.timeline-line {
position: relative;
height: 4px;
background-color: #e5e7eb;
border-radius: 2px;
margin: 0 60px;
}
.timeline-progress {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 20%;
background: linear-gradient(90deg, #3b82f6 0%, #1d4ed8 100%);
border-radius: 2px;
}
.timeline-dots {
position: absolute;
top: 50%;
left: 0;
right: 0;
transform: translateY(-50%);
display: flex;
justify-content: space-between;
}
.dot {
width: 12px;
height: 12px;
border-radius: 50%;
background-color: #e5e7eb;
border: 2px solid white;
box-shadow: 0 0 0 2px #e5e7eb;
}
.dot.active {
background-color: #3b82f6;
box-shadow: 0 0 0 2px #3b82f6;
}
/* 核心研究人员样式 */
.core-researchers-section {
margin-top: 20px;
background: white;
border-radius: 12px;
padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
margin-bottom: 30px;
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
}
.section-title {
font-size: 18px;
font-weight: 600;
color: #111827;
margin: 0;
}
.more-icon {
color: #6b7280;
cursor: pointer;
font-size: 16px;
}
.more-icon:hover {
color: #374151;
}
.researchers-grid {
}
/* 每行两个div */
.researchers-column {
display: flex;
flex-wrap: wrap;
gap: 20px;
width: 100%;
}
.researcher-item {
width: 48%;
display: flex;
align-items: flex-start;
gap: 12px;
padding: 12px 0;
}
.researcher-avatar {
flex-shrink: 0;
}
.researcher-avatar .el-image {
width: 48px;
height: 48px;
border-radius: 50%;
object-fit: cover;
border: 2px solid #f3f4f6;
}
.researcher-info {
flex: 1;
min-width: 0;
}
.researcher-name {
font-size: 16px;
font-weight: 600;
color: #111827;
margin: 0 0 4px 0;
line-height: 1.3;
}
.researcher-position {
font-size: 13px;
color: #6b7280;
margin: 0;
line-height: 1.4;
word-wrap: break-word;
}
/* 响应式设计 */
@media (max-width: 1024px) {
.top-section {
flex-direction: column;
}
.funding-content,
.research-content {
flex-direction: column;
text-align: center;
}
.funding-left {
flex: none;
width: 100%;
}
.funding-right {
min-height: 300px;
}
.funding-chart {
height: 300px;
min-height: 300px;
}
.timeline-periods {
flex-direction: column;
gap: 20px;
}
.timeline-line {
display: none;
}
.researchers-grid {
grid-template-columns: 1fr;
gap: 20px;
}
}
@media (max-width: 768px) {
.desc-tab {
padding: 16px;
}
.basic-info-card,
.funding-overview,
.research-overview,
.timeline-section,
.core-researchers-section {
padding: 16px;
}
.researchers-grid {
gap: 16px;
}
.researchers-column {
gap: 16px;
}
.researcher-item {
gap: 10px;
padding: 8px 0;
}
.researcher-avatar .el-image {
width: 40px;
height: 40px;
}
.researcher-name {
font-size: 14px;
}
.researcher-position {
font-size: 12px;
}
}
</style>
\ No newline at end of file
<template>
<el-row :gutter="24">
<el-col :span="6">
<aside class="filter-sidebar">
<div class="filter-group">
<CardTitle title="报告类型" style="margin-bottom: 10px"/>
<el-checkbox-group v-model="selectedReportTypes">
<el-checkbox label="研究报告" />
<el-checkbox label="简报" />
<el-checkbox label="会议记录" />
<el-checkbox label="期刊文章" />
</el-checkbox-group>
</div>
<div class="filter-group">
<CardTitle title="研究类型" style="margin-bottom: 10px"/>
<el-checkbox-group v-model="selectedResearchTypes">
<el-checkbox label="人工智能" />
<el-checkbox label="半导体/芯片" />
<el-checkbox label="能源与气候" />
<el-checkbox label="国际关系" />
<el-checkbox label="经济决策" />
<el-checkbox label="国防与安全" />
</el-checkbox-group>
</div>
<div class="filter-group">
<CardTitle title="作者" style="margin-bottom: 10px"/>
<el-input v-model="authorName" placeholder="输入作者名称" />
</div>
</aside>
</el-col>
<el-col :span="18">
<div class="report-content">
<div class="content-toolbar">
<el-input
v-model="searchQuery"
placeholder="按报告标题检索"
:prefix-icon="Search"
style="width: 240px;"
/>
<div class="sort-options">
<el-select v-model="sourceType" placeholder="来源类型" style="width: 120px; margin-right: 10px;">
<el-option label="全部" value="all"></el-option>
<el-option label="原创" value="original"></el-option>
</el-select>
<el-select v-model="publishDateSort" placeholder="发布时间" style="width: 120px;">
<el-option label="最新" value="desc"></el-option>
<el-option label="最早" value="asc"></el-option>
</el-select>
</div>
</div>
<el-row :gutter="20">
<el-col :span="8" v-for="report in reportList" :key="report.id" class="card-col">
<el-card shadow="hover" class="report-card" :body-style="{ padding: '0px' }">
<el-image :src="$withFallbackImage(report.imageUrl, report.id) " fit="cover" class="card-image" lazy></el-image>
<div class="card-content">
<h4 class="card-title">{{ report.name }}</h4>
<div class="card-meta">
<span class="card-date">{{ report.times }}</span>
<span class="card-source">{{ props.thinkTankName }}</span>
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { Search } from '@element-plus/icons-vue';
import { getThinkTankReport } from '@/api';
import { useRoute } from 'vue-router';
const route = useRoute();
const props = defineProps({
thinkTankName: {
type: String,
required: true
}
});
// Filters State
const selectedReportTypes = ref(['研究报告', '简报']);
const selectedResearchTypes = ref(['人工智能']);
const authorName = ref('');
// Toolbar State
const searchQuery = ref('');
const sourceType = ref('all');
const publishDateSort = ref('desc');
// Mock Data for Report Cards
const reportList = ref([
{ id: 1, title: '中国对AI的转型产业政策', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://images.unsplash.com/photo-1611162617474-5b21e879e113?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600' },
{ id: 2, title: '中美对抗、竞争和合作将跨越人工智能通用领域的五个...', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://images.unsplash.com/photo-1574015974293-817f0e62f0f3?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600' },
{ id: 3, title: '中国、智慧城市和中东:地区和美国的选择', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://images.unsplash.com/photo-1593989931843-3f17374312b3?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600' },
{ id: 4, title: '中国对AI的转型产业政策', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://images.unsplash.com/photo-1695423635441-89d968a528f4?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600' },
{ id: 5, title: '中美经济竞争:复杂经济和地缘政治关系中的收益...', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://images.unsplash.com/photo-1616121213037-1439247c6178?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600' },
{ id: 6, title: '中国、智慧城市和中东:留给地区和美国的选择', date: '2025年6月26日', source: '兰德科技智库', imageUrl: 'https://images.unsplash.com/photo-1542372147-7a2846215392?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600' },
]);
onMounted(() => {
getThinkTankReport({ id: route.params.id }).then(res => {
reportList.value = res.data;
});
})
</script>
<style scoped>
.filter-sidebar .filter-group {
margin-bottom: 24px;
}
.filter-sidebar .filter-title {
font-size: 15px;
font-weight: 600;
color: #303133;
margin: 0 0 12px 0;
}
.filter-sidebar .el-checkbox-group {
display: flex;
flex-direction: column;
}
.filter-sidebar .el-checkbox {
margin-bottom: 10px;
}
.filter-sidebar .el-checkbox:last-child {
margin-bottom: 0;
}
/* Right Content Grid Styles */
.content-toolbar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.card-col {
margin-bottom: 20px;
}
.report-card {
cursor: pointer;
transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
border: 1px solid #e4e7ed;
}
.report-card:hover {
transform: translateY(-5px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
}
.card-image {
width: 100%;
height: 160px;
display: block;
}
.card-content {
padding: 16px;
}
.card-title {
font-size: 15px;
font-weight: 600;
color: #303133;
margin: 0 0 10px 0;
line-height: 1.4;
/* overflow: hidden; */
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
min-height: 42px;
}
.card-meta {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 12px;
color: #909399;
}
</style>
\ No newline at end of file
<template>
<div class="page-container">
<!-- Header 占满宽度 -->
<header class="think-tank-header">
<div class="header-container">
<div class="header-left">
<el-image :src="$withFallbackImage(summary.logo, summary.name) " :alt="summary.name" class="logo" />
<div class="info">
<h1 class="title"> {{ summary.name }} <span class="subtitle">{{ summary.ename }}</span></h1>
<p class="description">
{{ summary.describe }}
</p>
<div class="tags">
<el-tag effect="light" class="custom-tag" v-for="tag in summary.tags" :key="tag">{{ tag }}</el-tag>
</div>
</div>
</div>
<div class="header-right">
<el-button type="primary" :icon="Collection">查看报告合集</el-button>
</div>
</div>
<!-- Tab切换区域 -->
<div class="header-tabs">
<div class="tabs-container">
<el-tabs v-model="activeTab" class="header-tab-nav">
<el-tab-pane label="智库报告" name="reports"></el-tab-pane>
<el-tab-pane label="政策追踪" name="policy"></el-tab-pane>
<el-tab-pane label="智库百科" name="wiki"></el-tab-pane>
</el-tabs>
</div>
</div>
</header>
<!-- Main Content 最大宽度1000px并居中 -->
<main class="main-content">
<div class="content-container">
<!-- 根据activeTab切换组件 -->
<component :is="currentComponent" :thinkTankName="summary.name" />
</div>
</main>
</div>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue';
import { Collection } from '@element-plus/icons-vue';
import ReportTab from './ReportTab.vue';
import PolicyTab from '@/components/PolicyTab.vue';
import DescTab from './DescTab.vue';
import { getThinkTankSummary } from '@/api';
import { useRoute } from 'vue-router';
// --- Component State ---
const activeTab = ref('reports');
const route = useRoute();
// --- Component Map ---
const componentMap = {
reports: ReportTab,
policy: PolicyTab,
wiki: DescTab
};
const summary = ref({
name: '',
describe: '',
ename: '',
url: '',
tags: []
});
// --- Computed Properties ---
const currentComponent = computed(() => {
return componentMap[activeTab.value] || ReportTab;
});
onMounted(() => {
getThinkTankSummary({ id: route.params.id }).then(res => {
console.log(res.data);
summary.value = res.data;
});
});
</script>
<style scoped>
.page-container {
background-color: #f5f7fa;
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif;
min-height: 100vh;
width: 100%;
}
/* Header Styles - 占满宽度 */
.think-tank-header {
background-color: #fff;
width: 100%;
margin-bottom: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
.header-container {
max-width: 1200px;
margin: 0 auto;
padding: 24px 24px 0;
display: flex;
justify-content: space-between;
align-items: flex-start;
}
/* Header Tabs区域 */
.header-tabs {
background-color: #fff;
/* border-top: 1px solid #e4e7ed; */
width: 100%;
margin-top: 20px;
}
.tabs-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
.header-tab-nav {
margin: 0;
}
.header-tab-nav :deep(.el-tabs__header) {
margin: 0;
border-bottom: none;
}
.header-tab-nav :deep(.el-tabs__nav-wrap) {
padding: 0;
}
.header-tab-nav :deep(.el-tabs__nav-wrap::after) {
display: none;
}
.header-tab-nav :deep(.el-tabs__item) {
font-size: 16px;
font-weight: 500;
color: #606266;
padding: 16px 24px;
border-bottom: 3px solid transparent;
transition: all 0.3s ease;
}
.header-tab-nav :deep(.el-tabs__item:hover) {
color: #409eff;
}
.header-tab-nav :deep(.el-tabs__item.is-active) {
color: #409eff;
border-bottom-color: #409eff;
font-weight: 600;
}
.header-tab-nav :deep(.el-tabs__active-bar) {
display: none;
}
.header-left {
display: flex;
align-items: flex-start;
}
.logo {
width: 64px;
height: 64px;
border-radius: 8px;
margin-right: 20px;
flex-shrink: 0;
}
.info .title {
font-size: 20px;
font-weight: 600;
color: #303133;
margin: 0 0 8px 0;
}
.info .subtitle {
font-size: 14px;
color: #909399;
font-weight: normal;
margin-left: 8px;
}
.info .description {
font-size: 14px;
color: #606266;
line-height: 1.6;
margin: 0 0 12px 0;
max-width: 600px;
}
.custom-tag {
background-color: #ecf5ff;
border-color: #d9ecff;
color: #409eff;
margin-right: 8px;
}
/* Main Content Styles - 最大宽度1000px并居中 */
.main-content {
width: 100%;
display: flex;
justify-content: center;
padding: 0 24px;
}
.content-container {
max-width: 1200px;
width: 100%;
background-color: #fff;
padding: 24px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
/* 响应式设计 */
@media (max-width: 1240px) {
.header-container {
padding: 24px 20px 0;
}
.tabs-container {
padding: 0 20px;
}
}
@media (max-width: 1040px) {
.content-container {
margin: 0 20px;
}
.main-content {
padding: 0;
}
}
@media (max-width: 768px) {
.header-container {
flex-direction: column;
gap: 16px;
padding: 16px 16px 0;
}
.tabs-container {
padding: 0 16px;
}
.header-tab-nav :deep(.el-tabs__item) {
padding: 12px 16px;
font-size: 14px;
}
.header-left {
flex-direction: column;
align-items: flex-start;
}
.logo {
margin-right: 0;
margin-bottom: 12px;
}
.header-right {
align-self: flex-start;
}
.content-container {
margin: 0 16px;
padding: 16px;
}
.info .description {
max-width: none;
}
}
@media (max-width: 480px) {
.header-container {
padding: 12px 12px 0;
}
.tabs-container {
padding: 0 12px;
}
.header-tab-nav :deep(.el-tabs__item) {
padding: 10px 12px;
font-size: 13px;
}
.content-container {
margin: 0 12px;
padding: 12px;
}
.info .title {
font-size: 18px;
}
.info .subtitle {
display: block;
margin-left: 0;
margin-top: 4px;
}
}
</style>
\ No newline at end of file
<template>
<div>
<div class="echarts-wrap" ref="echartWord"></div>
</div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
import "echarts-wordcloud";
const props = defineProps({
// 词云数据
data: {
type: Array,
required: true,
// 示例:
// [
// { name: 'Vue', value: 1000 },
// { name: 'ECharts', value: 618 },
// // ...
// ]
},
// 词云形状,可以是 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon' 等
shape: {
type: String,
default: "circle",
},
});
const echartWord = ref(null);
let myChart = null;
const initChart = () => {
if (echartWord.value) {
myChart = echarts.init(echartWord.value);
const option = {
grid: {
left: 5,
top: 5,
right: 5,
bottom: 5,
},
series: [
{
type: "wordCloud",
shape: props.shape,
// 其他形状你可以使用形状路径
// shape: 'circle', // 示例
// 或者自定义路径
gridSize: 20, // 网格大小,影响词间距。
sizeRange: [15, 25], // 定义词云中文字大小的范围
rotationRange: [0, 0],
rotationStep: 0,
drawOutOfBound: false, // 是否超出画布
// 字体
textStyle: {
// normal: {
// color: function () {
// return 'rgb(' + [
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160)
// ].join(',') + ')';
// }
// },
color: function () {
let colors = [
"rgba(189, 33, 33, 1)",
"rgba(232, 151, 21, 1)",
"rgba(220, 190, 68, 1)",
"rgba(96, 58, 186, 1)",
"rgba(32, 121, 69, 1)",
"rgba(22, 119, 255, 1)",
];
return colors[parseInt(Math.random() * colors.length)];
},
emphasis: {
shadowBlur: 5,
shadowColor: "#333",
},
},
// 设置词云数据
data: props.data,
},
],
};
myChart.setOption(option);
window.addEventListener("resize", myChart.resize);
}
};
onMounted(() => {
initChart();
});
onBeforeUnmount(() => {
if (myChart) {
window.removeEventListener("resize", myChart.resize);
myChart.dispose();
}
});
</script>
<style lang="scss" scoped>
.echarts-wrap {
// width: 100%;
width: 576px;
height: 215px;
}
</style>
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"adcode":520000,"name":"贵州省","center":[106.713478,26.578343],"centroid":[106.880455,26.826368],"childrenNum":9,"level":"province","acroutes":[100000],"parent":{"adcode":100000}},"geometry":{"type":"MultiPolygon","coordinates":[[[[108.887124,27.121203],[108.904933,27.134947],[108.913688,27.157695],[108.92676,27.160912],[108.926041,27.175202],[108.929758,27.180072],[108.919145,27.193486],[108.925741,27.199596],[108.908651,27.204327],[108.914228,27.214662],[108.947088,27.228393],[108.951465,27.236062],[108.963458,27.235511],[108.968555,27.245521],[108.984625,27.256219],[108.987503,27.270635],[108.999556,27.267559],[109.01059,27.270497],[109.023901,27.282248],[109.040811,27.276235],[109.045608,27.288215],[109.053943,27.29487],[109.054123,27.306068],[109.044409,27.331076],[109.052084,27.336673],[109.05952,27.326855],[109.069234,27.322817],[109.080387,27.334884],[109.086384,27.33103],[109.103773,27.337086],[109.101075,27.34984],[109.106412,27.35562],[109.114387,27.35273],[109.118464,27.362225],[109.113847,27.367178],[109.124761,27.387908],[109.115886,27.400105],[109.127699,27.405057],[109.14197,27.417711],[109.138672,27.430318],[109.129258,27.42555],[109.125,27.415556],[109.115766,27.412576],[109.10917,27.41872],[109.112948,27.424633],[109.123321,27.418399],[109.123321,27.428622],[109.144009,27.448835],[109.154083,27.448789],[109.15942,27.442327],[109.156241,27.416519],[109.166975,27.417849],[109.189521,27.436552],[109.202114,27.450073],[109.213687,27.450485],[109.221902,27.438889],[109.243249,27.42963],[109.245528,27.418169],[109.286423,27.424633],[109.299915,27.423946],[109.30693,27.434397],[109.302973,27.475644],[109.312387,27.486182],[109.325879,27.494199],[109.379127,27.53579],[109.404971,27.550489],[109.433634,27.548383],[109.445986,27.562394],[109.459118,27.56015],[109.461937,27.565599],[109.451263,27.585925],[109.469132,27.620937],[109.470032,27.628762],[109.464455,27.651409],[109.45612,27.669432],[109.458219,27.674783],[109.470452,27.680272],[109.45684,27.69358],[109.429976,27.703549],[109.418223,27.714248],[109.414146,27.725037],[109.395317,27.7217],[109.392379,27.726363],[109.365935,27.722203],[109.377987,27.73802],[109.362997,27.745014],[109.364316,27.759777],[109.349864,27.771064],[109.338112,27.775908],[109.333015,27.782808],[109.34105,27.79021],[109.331216,27.791626],[109.342669,27.800764],[109.34021,27.821411],[109.345547,27.84073],[109.326838,27.858585],[109.337512,27.869543],[109.321861,27.867991],[109.317784,27.885521],[109.320602,27.895609],[109.311907,27.907796],[109.314846,27.91811],[109.313826,27.933306],[109.301774,27.958353],[109.30711,27.968024],[109.320182,27.970989],[109.321622,27.991786],[109.342249,28.00533],[109.365095,28.009114],[109.379187,28.033096],[109.370552,28.046087],[109.346986,28.060399],[109.334574,28.062222],[109.325219,28.04276],[109.311548,28.037973],[109.305911,28.029996],[109.298715,28.032503],[109.304952,28.076394],[109.312087,28.083503],[109.314366,28.103914],[109.325399,28.115212],[109.328098,28.126872],[109.338172,28.141765],[109.335833,28.158204],[109.341829,28.162165],[109.343208,28.173593],[109.34045,28.190391],[109.345787,28.206686],[109.359579,28.22043],[109.35676,28.23349],[109.367314,28.239041],[109.37349,28.25683],[109.388001,28.268111],[109.399694,28.269294],[109.376908,28.276935],[109.365875,28.274206],[109.359519,28.265882],[109.352203,28.268521],[109.363116,28.282984],[109.34099,28.293717],[109.314966,28.27639],[109.306391,28.274206],[109.294938,28.278527],[109.297576,28.292808],[109.285523,28.304131],[109.273051,28.309405],[109.27527,28.314043],[109.268554,28.338092],[109.285283,28.359046],[109.288342,28.374315],[109.277368,28.376542],[109.264656,28.39249],[109.264356,28.404393],[109.256861,28.436734],[109.261778,28.454398],[109.260818,28.464705],[109.266335,28.481775],[109.275929,28.484],[109.27437,28.494667],[109.236413,28.478416],[109.233595,28.474966],[109.215486,28.482138],[109.19174,28.47088],[109.185504,28.453127],[109.176569,28.446179],[109.180707,28.439458],[109.176749,28.431511],[109.165656,28.430375],[109.164936,28.414978],[109.154263,28.417612],[109.157141,28.403394],[109.153603,28.397306],[109.153123,28.381041],[109.144788,28.363818],[109.138612,28.358637],[109.151684,28.350547],[109.150785,28.344683],[109.137713,28.334229],[109.141251,28.320545],[109.126799,28.296946],[109.116246,28.28826],[109.119064,28.282257],[109.100415,28.263835],[109.087583,28.26097],[109.081527,28.24855],[109.085364,28.232808],[109.099816,28.214742],[109.101435,28.201407],[109.089982,28.196627],[109.082066,28.184337],[109.061439,28.200132],[109.041591,28.205366],[109.038233,28.217427],[109.02678,28.220066],[109.013828,28.199586],[109.014247,28.177873],[109.00981,28.167902],[109.001535,28.161391],[108.985765,28.161346],[108.979948,28.170771],[108.956622,28.182334],[108.929399,28.190574],[108.9273,28.196491],[108.933176,28.20787],[108.919505,28.217791],[108.912249,28.215561],[108.897258,28.21952],[108.864458,28.20614],[108.855163,28.199859],[108.836215,28.207369],[108.833277,28.217882],[108.824342,28.231033],[108.821764,28.245138],[108.805573,28.24209],[108.799757,28.226619],[108.773313,28.213468],[108.765338,28.192121],[108.758202,28.198357],[108.758682,28.220203],[108.749507,28.227575],[108.738834,28.227347],[108.737575,28.251416],[108.727621,28.259832],[108.725762,28.280301],[108.741052,28.2949],[108.763779,28.305631],[108.770075,28.314952],[108.76144,28.324591],[108.77793,28.347229],[108.77739,28.36659],[108.783087,28.380404],[108.762819,28.385811],[108.76174,28.395262],[108.779309,28.427423],[108.773913,28.437869],[108.746749,28.450221],[108.749088,28.461073],[108.743691,28.467656],[108.733917,28.468882],[108.725642,28.475828],[108.723363,28.491943],[108.709691,28.501066],[108.701416,28.482502],[108.688644,28.482502],[108.671135,28.475284],[108.658662,28.478053],[108.64523,28.46861],[108.641453,28.455715],[108.666817,28.44182],[108.669875,28.431465],[108.688344,28.422291],[108.696799,28.404575],[108.691702,28.394035],[108.674193,28.389355],[108.664719,28.382858],[108.656444,28.356365],[108.659082,28.35032],[108.673953,28.354547],[108.675752,28.343047],[108.667357,28.33441],[108.610811,28.325091],[108.602416,28.34082],[108.58011,28.343274],[108.576332,28.364318],[108.577531,28.390173],[108.587425,28.404939],[108.608832,28.407301],[108.609912,28.435689],[108.602836,28.438868],[108.597259,28.456805],[108.586766,28.463071],[108.587605,28.479324],[108.574953,28.497662],[108.581069,28.506967],[108.573214,28.528114],[108.576872,28.533831],[108.589344,28.538595],[108.610931,28.539412],[108.604635,28.59026],[108.618906,28.606538],[108.636056,28.621772],[108.632338,28.638953],[108.623284,28.641446],[108.609012,28.633604],[108.59618,28.640358],[108.585327,28.639633],[108.586106,28.648788],[108.575912,28.659711],[108.566498,28.662566],[108.561161,28.649151],[108.547789,28.647882],[108.538495,28.652731],[108.524643,28.647111],[108.517987,28.639995],[108.502756,28.637638],[108.501018,28.626668],[108.491303,28.630567],[108.471096,28.627801],[108.461381,28.634148],[108.439015,28.634012],[108.421685,28.643349],[108.390924,28.65178],[108.352128,28.676115],[108.343972,28.673396],[108.332519,28.679604],[108.343673,28.696458],[108.34763,28.709232],[108.34727,28.736271],[108.372515,28.760134],[108.375333,28.767513],[108.385287,28.772221],[108.389005,28.785847],[108.386487,28.801643],[108.382409,28.805806],[108.354226,28.814269],[108.355186,28.831644],[108.346431,28.856299],[108.355306,28.870818],[108.357464,28.893384],[108.350329,28.907084],[108.350568,28.93032],[108.346911,28.941484],[108.339895,28.947856],[108.322925,28.953957],[108.312551,28.99706],[108.308714,29.003384],[108.309793,29.018424],[108.29786,29.047144],[108.307155,29.077525],[108.301938,29.083077],[108.286587,29.089215],[108.270637,29.090885],[108.268658,29.077796],[108.260203,29.063758],[108.256965,29.041996],[108.242274,29.028359],[108.224645,29.031566],[108.230401,29.046963],[108.21505,29.056128],[108.204737,29.05676],[108.197721,29.070664],[108.171397,29.065383],[108.152448,29.053735],[108.13272,29.054096],[108.128763,29.065699],[108.109814,29.076081],[108.069398,29.086552],[108.035999,29.054051],[108.0345,29.046737],[108.024246,29.0387],[107.993904,29.033823],[107.949291,29.033733],[107.931122,29.035223],[107.908815,29.007359],[107.887648,29.008533],[107.883031,28.986534],[107.871998,28.983056],[107.86756,28.960464],[107.842016,28.964622],[107.828104,28.976143],[107.810415,28.984321],[107.821208,29.005733],[107.823547,29.03423],[107.815092,29.034772],[107.803459,29.042899],[107.78523,29.047234],[107.789847,29.082355],[107.799981,29.106183],[107.810655,29.139389],[107.795184,29.146471],[107.782352,29.161671],[107.775216,29.162843],[107.767901,29.17511],[107.760285,29.17768],[107.759386,29.192289],[107.751591,29.199638],[107.739418,29.189043],[107.724727,29.182189],[107.727245,29.175696],[107.718491,29.156123],[107.707577,29.154184],[107.698643,29.141239],[107.662604,29.147914],[107.659486,29.162888],[107.645874,29.160859],[107.628785,29.16582],[107.616912,29.162979],[107.606718,29.165459],[107.600602,29.159596],[107.601022,29.147824],[107.589269,29.150034],[107.585071,29.158333],[107.590168,29.165279],[107.581174,29.172539],[107.576256,29.18512],[107.575477,29.207302],[107.569301,29.219427],[107.55437,29.219472],[107.549573,29.210052],[107.532243,29.19549],[107.515333,29.194498],[107.48829,29.174704],[107.473059,29.171006],[107.462325,29.176868],[107.464004,29.195445],[107.441458,29.203966],[107.427067,29.190305],[107.4044,29.18787],[107.403261,29.172494],[107.412316,29.1614],[107.408238,29.150891],[107.408418,29.138352],[107.42149,29.13578],[107.427606,29.128291],[107.412675,29.095398],[107.392288,29.091246],[107.382034,29.097519],[107.369741,29.091607],[107.376097,29.074772],[107.377896,29.057979],[107.390729,29.059063],[107.395166,29.039648],[107.377297,29.026779],[107.364165,29.009617],[107.370461,28.993898],[107.396965,28.993356],[107.40446,28.981881],[107.40554,28.972258],[107.412975,28.960148],[107.42155,28.954545],[107.43876,28.955268],[107.441038,28.943789],[107.433603,28.933755],[107.42089,28.925212],[107.413815,28.911424],[107.415614,28.889811],[107.406139,28.89153],[107.391928,28.868466],[107.395406,28.860867],[107.383473,28.848564],[107.367283,28.84499],[107.359907,28.849966],[107.331964,28.84119],[107.345156,28.829608],[107.325368,28.809562],[107.304621,28.806757],[107.277157,28.799154],[107.261447,28.792727],[107.252392,28.780551],[107.253532,28.766789],[107.246636,28.761854],[107.219232,28.772719],[107.218753,28.788698],[107.213416,28.795035],[107.210598,28.814812],[107.216354,28.82816],[107.226368,28.836802],[107.195127,28.838068],[107.196866,28.847388],[107.20652,28.868014],[107.194048,28.876607],[107.198425,28.878416],[107.193568,28.888771],[107.184094,28.879953],[107.182654,28.887144],[107.167124,28.880586],[107.155851,28.882983],[107.145777,28.876878],[107.141939,28.887731],[107.096666,28.890083],[107.09025,28.875114],[107.072681,28.866612],[107.059789,28.868466],[107.063386,28.877059],[107.072321,28.87932],[107.066565,28.895373],[107.052533,28.891123],[107.045577,28.874933],[107.058709,28.868964],[107.038981,28.863717],[107.038861,28.877963],[107.032385,28.882305],[107.016075,28.882486],[107.019133,28.860687],[107.005162,28.859194],[107.002643,28.85449],[106.983395,28.851187],[106.989271,28.829563],[106.980816,28.813183],[106.981356,28.804268],[106.988672,28.790328],[106.987892,28.774666],[106.967804,28.774123],[106.951734,28.76697],[106.950235,28.777608],[106.94226,28.782135],[106.938422,28.792365],[106.923071,28.810015],[106.905382,28.796121],[106.897887,28.801145],[106.886373,28.794718],[106.874261,28.779736],[106.864607,28.774485],[106.862328,28.780596],[106.845358,28.781003],[106.838462,28.765974],[106.833366,28.768781],[106.824071,28.756149],[106.828329,28.737675],[106.852914,28.724451],[106.862568,28.707556],[106.853933,28.706333],[106.854713,28.697092],[106.862148,28.690976],[106.883195,28.692426],[106.880617,28.68051],[106.866945,28.649921],[106.869764,28.64906],[106.866346,28.624492],[106.829288,28.622724],[106.833246,28.613203],[106.827069,28.598558],[106.807701,28.589443],[106.800505,28.60214],[106.79343,28.606493],[106.79259,28.616241],[106.780358,28.624991],[106.775021,28.611979],[106.75907,28.611118],[106.758591,28.588128],[106.766626,28.580146],[106.780957,28.574885],[106.779878,28.563773],[106.765127,28.558193],[106.754333,28.558329],[106.737364,28.553294],[106.728189,28.541998],[106.723992,28.529883],[106.72603,28.518584],[106.744859,28.489855],[106.746658,28.466658],[106.732866,28.46357],[106.725251,28.454444],[106.716196,28.456396],[106.708521,28.450493],[106.69329,28.456532],[106.697668,28.476645],[106.688253,28.484681],[106.678359,28.481367],[106.66109,28.491898],[106.649756,28.479551],[106.631108,28.490264],[106.632727,28.503517],[106.61018,28.497935],[106.593391,28.510189],[106.584936,28.506876],[106.591532,28.499069],[106.591832,28.490355],[106.568026,28.484045],[106.562809,28.49739],[106.567906,28.505287],[106.560291,28.513366],[106.568685,28.523667],[106.584636,28.523258],[106.588893,28.531426],[106.615277,28.549665],[106.616836,28.56282],[106.607062,28.594296],[106.613059,28.608851],[106.626011,28.604317],[106.633566,28.607627],[106.636804,28.623223],[106.628589,28.634465],[106.618875,28.637276],[106.617676,28.644256],[106.641182,28.644165],[106.651376,28.649423],[106.6437,28.664333],[106.635245,28.658487],[106.62685,28.659257],[106.617676,28.667279],[106.614258,28.680283],[106.619175,28.689164],[106.606103,28.685041],[106.598068,28.691882],[106.587274,28.691519],[106.582357,28.702211],[106.576841,28.702392],[106.560291,28.720737],[106.559751,28.733871],[106.563888,28.746188],[106.56185,28.756059],[106.547998,28.769867],[106.534026,28.770909],[106.533787,28.77874],[106.523053,28.781139],[106.521134,28.794266],[106.508782,28.79585],[106.490613,28.80653],[106.476221,28.826757],[106.474482,28.833046],[106.46183,28.83101],[106.468426,28.826441],[106.453495,28.816939],[106.451396,28.808114],[106.459611,28.805716],[106.46279,28.797207],[106.451696,28.792817],[106.454515,28.7753],[106.46207,28.76122],[106.493851,28.739486],[106.498108,28.717476],[106.510341,28.715166],[106.515857,28.688122],[106.52827,28.677655],[106.520175,28.662112],[106.502785,28.661297],[106.506683,28.635598],[106.501046,28.628119],[106.501526,28.618553],[106.49499,28.615153],[106.49433,28.60019],[106.513339,28.577017],[106.524072,28.577833],[106.508782,28.564861],[106.498828,28.585861],[106.473823,28.598966],[106.467347,28.588536],[106.47892,28.575021],[106.487255,28.558828],[106.504704,28.544674],[106.501166,28.534511],[106.493371,28.538323],[106.483837,28.530609],[106.471604,28.532606],[106.467287,28.541589],[106.453075,28.54472],[106.454035,28.549755],[106.441622,28.559418],[106.434067,28.556696],[106.423213,28.562684],[106.41296,28.563138],[106.399108,28.571166],[106.385676,28.560824],[106.389814,28.553249],[106.373563,28.537642],[106.3786,28.532606],[106.373743,28.524983],[106.374523,28.510915],[106.380579,28.507375],[106.376142,28.493305],[106.3789,28.479732],[106.352876,28.480277],[106.349098,28.473785],[106.341363,28.480686],[106.330689,28.482138],[106.323674,28.494939],[106.306824,28.503245],[106.293992,28.526934],[106.292612,28.537324],[106.278041,28.538867],[106.277262,28.532878],[106.254835,28.539412],[106.236186,28.560144],[106.214779,28.573207],[106.205605,28.567991],[106.192593,28.577244],[106.184798,28.589443],[106.184857,28.600599],[106.173344,28.612523],[106.171246,28.628663],[106.165729,28.636233],[106.152057,28.636505],[106.144622,28.644754],[106.129331,28.640041],[106.115659,28.642533],[106.120756,28.632743],[106.103427,28.636097],[106.09821,28.654907],[106.083039,28.661387],[106.090295,28.669454],[106.080461,28.686309],[106.066429,28.692516],[106.066969,28.686173],[106.043163,28.693558],[106.030811,28.695053],[106.036087,28.706242],[106.022955,28.708145],[106.028892,28.719695],[106.017918,28.722639],[106.008924,28.738218],[105.99951,28.742928],[105.979242,28.74655],[105.967789,28.761628],[105.96563,28.736045],[105.954597,28.724632],[105.955916,28.713852],[105.942304,28.71041],[105.93337,28.702301],[105.935588,28.681914],[105.921916,28.679015],[105.903568,28.669227],[105.889476,28.670496],[105.891935,28.651326],[105.901049,28.648562],[105.895652,28.643712],[105.893733,28.623903],[105.890256,28.621409],[105.905906,28.611027],[105.893434,28.605722],[105.885039,28.595475],[105.876164,28.602911],[105.859494,28.597923],[105.8505,28.606312],[105.835988,28.59942],[105.798391,28.603183],[105.784959,28.611118],[105.778483,28.59883],[105.757676,28.59035],[105.757256,28.602231],[105.748801,28.615153],[105.737708,28.614201],[105.720678,28.590622],[105.713003,28.586586],[105.699931,28.5923],[105.693155,28.588582],[105.691835,28.56468],[105.683381,28.557876],[105.68464,28.534557],[105.671208,28.536281],[105.664492,28.523803],[105.650101,28.522986],[105.642245,28.517586],[105.623897,28.518131],[105.627974,28.507829],[105.619399,28.484],[105.614662,28.484227],[105.609325,28.472196],[105.619279,28.464024],[105.611964,28.45517],[105.612563,28.438913],[105.631872,28.432147],[105.643265,28.431511],[105.648302,28.407846],[105.642725,28.397715],[105.650281,28.389537],[105.652739,28.372407],[105.660175,28.365272],[105.654898,28.362364],[105.65178,28.34282],[105.639487,28.324227],[105.639967,28.311042],[105.649921,28.31909],[105.658196,28.310633],[105.670548,28.30986],[105.683021,28.295582],[105.688597,28.284349],[105.705087,28.279846],[105.711264,28.281711],[105.730032,28.272159],[105.738547,28.277299],[105.735249,28.291671],[105.740706,28.304858],[105.761333,28.30936],[105.786638,28.308814],[105.771287,28.319453],[105.771347,28.328819],[105.785679,28.336501],[105.792814,28.329455],[105.797672,28.312361],[105.808405,28.307223],[105.823396,28.306904],[105.83395,28.283348],[105.85002,28.254237],[105.863212,28.249187],[105.874185,28.254601],[105.875804,28.244865],[105.890555,28.236266],[105.881021,28.211829],[105.871007,28.201953],[105.860274,28.170042],[105.860993,28.158158],[105.868609,28.146729],[105.878563,28.139033],[105.876044,28.128239],[105.895173,28.119767],[105.903687,28.129195],[105.927193,28.135435],[105.936967,28.132247],[105.945242,28.143541],[105.963291,28.137894],[105.970787,28.131245],[105.976124,28.10806],[105.985358,28.108379],[105.986198,28.116032],[106.013241,28.119949],[106.020617,28.109153],[106.033869,28.106966],[106.036567,28.110702],[106.027213,28.131245],[106.037646,28.138349],[106.060912,28.142949],[106.071826,28.151237],[106.093593,28.162666],[106.112841,28.163577],[106.125074,28.167083],[106.145221,28.162848],[106.177302,28.148596],[106.191633,28.136755],[106.207104,28.134251],[106.211541,28.119083],[106.226232,28.115895],[106.231449,28.097992],[106.249918,28.09257],[106.254655,28.079493],[106.266708,28.066551],[106.265509,28.04987],[106.256754,28.048503],[106.243202,28.029084],[106.24626,28.011987],[106.268927,28.003323],[106.283018,28.007199],[106.294351,28.003643],[106.301847,27.989916],[106.315818,27.979518],[106.317377,27.967659],[106.325173,27.962595],[106.328111,27.952879],[106.314019,27.938507],[106.308023,27.936728],[106.309222,27.913592],[106.300348,27.908709],[106.304905,27.899352],[106.325772,27.897937],[106.333328,27.887987],[106.325892,27.879313],[106.338185,27.875341],[106.339984,27.865343],[106.334287,27.855115],[106.317078,27.838767],[106.319416,27.832007],[106.32997,27.82575],[106.344241,27.826846],[106.341843,27.820178],[106.321515,27.809398],[106.306944,27.808667],[106.268507,27.782168],[106.242423,27.767317],[106.23115,27.767317],[106.224673,27.760965],[106.206564,27.76293],[106.193492,27.754384],[106.179341,27.761925],[106.165249,27.763158],[106.143602,27.77376],[106.127532,27.77865],[106.105825,27.779929],[106.079321,27.77568],[106.063731,27.777142],[106.059054,27.770607],[106.062412,27.763341],[106.023015,27.746979],[106.004067,27.746842],[105.985418,27.749767],[105.968568,27.740763],[105.929952,27.728192],[105.921317,27.747025],[105.905187,27.745151],[105.891275,27.736283],[105.881921,27.73866],[105.868249,27.732535],[105.860454,27.716305],[105.842884,27.705332],[105.831191,27.70995],[105.813802,27.71123],[105.78418,27.719094],[105.76763,27.717951],[105.722837,27.705881],[105.719119,27.692162],[105.721038,27.684845],[105.702029,27.676887],[105.685479,27.678488],[105.677864,27.68329],[105.664372,27.683931],[105.655018,27.677162],[105.643085,27.659963],[105.628993,27.66097],[105.623837,27.666139],[105.622637,27.680821],[105.609985,27.691979],[105.602849,27.704692],[105.605308,27.715437],[105.580783,27.721472],[105.559975,27.719963],[105.549302,27.727186],[105.537489,27.753744],[105.522738,27.758131],[105.517761,27.764895],[105.492876,27.772755],[105.477105,27.774857],[105.458217,27.767866],[105.448623,27.775314],[105.440168,27.775223],[105.430573,27.76261],[105.421459,27.768368],[105.394415,27.761193],[105.393096,27.750499],[105.384761,27.757491],[105.373608,27.754978],[105.367791,27.748808],[105.35382,27.748853],[105.339968,27.729106],[105.327016,27.727049],[105.318681,27.714248],[105.301352,27.696049],[105.301352,27.682787],[105.308967,27.67085],[105.309866,27.654977],[105.30387,27.639788],[105.294995,27.6332],[105.30327,27.626336],[105.305129,27.613615],[105.290618,27.604325],[105.274967,27.589816],[105.257038,27.582904],[105.251761,27.573473],[105.244026,27.572603],[105.250502,27.565416],[105.240488,27.558731],[105.242767,27.551359],[105.232333,27.546322],[105.234732,27.540186],[105.246784,27.545223],[105.256978,27.540873],[105.253141,27.536202],[105.259917,27.514768],[105.249783,27.505011],[105.248463,27.495482],[105.235871,27.490534],[105.233652,27.475873],[105.238989,27.46987],[105.234132,27.453098],[105.226157,27.441135],[105.232813,27.436322],[105.225857,27.419407],[105.211886,27.399509],[105.194376,27.382818],[105.191078,27.371765],[105.184002,27.367499],[105.184722,27.392448],[105.17231,27.397308],[105.167273,27.408817],[105.157079,27.404828],[105.134892,27.416152],[105.12146,27.418536],[105.099334,27.411384],[105.089859,27.41794],[105.067133,27.41794],[105.057659,27.409367],[105.046925,27.407441],[105.045426,27.396162],[105.032294,27.400564],[105.012086,27.380249],[104.999854,27.372224],[104.970651,27.357638],[104.963995,27.357913],[104.943788,27.346675],[104.937072,27.33704],[104.913146,27.326809],[104.904991,27.307445],[104.894078,27.305518],[104.891919,27.299781],[104.878967,27.297303],[104.871231,27.290877],[104.850544,27.304324],[104.848865,27.32034],[104.85654,27.33259],[104.843888,27.343234],[104.835913,27.343509],[104.826079,27.352317],[104.808629,27.354565],[104.79022,27.330434],[104.789141,27.321074],[104.771032,27.317403],[104.767614,27.33025],[104.754362,27.34539],[104.735653,27.334655],[104.721382,27.342454],[104.694159,27.333508],[104.686183,27.334838],[104.680667,27.323964],[104.664357,27.316715],[104.656381,27.3219],[104.630777,27.317862],[104.612488,27.307216],[104.594799,27.3113],[104.588382,27.323001],[104.570213,27.331718],[104.545388,27.330067],[104.522302,27.354335],[104.522782,27.365069],[104.507671,27.387495],[104.517265,27.400334],[104.504433,27.397171],[104.490881,27.401893],[104.497058,27.414502],[104.467196,27.414273],[104.461319,27.420645],[104.447528,27.426375],[104.435955,27.425963],[104.428999,27.434351],[104.416586,27.435543],[104.409451,27.445306],[104.41017,27.45791],[104.402435,27.455114],[104.362259,27.467854],[104.345349,27.462813],[104.34427,27.452914],[104.332757,27.444023],[104.342651,27.436322],[104.342051,27.427246],[104.335156,27.427705],[104.322383,27.407854],[104.308831,27.407258],[104.295819,27.374654],[104.284066,27.367362],[104.27825,27.372315],[104.279389,27.361766],[104.270455,27.36094],[104.247848,27.336444],[104.249587,27.319743],[104.259901,27.308317],[104.251086,27.30024],[104.230459,27.291245],[104.223383,27.299093],[104.210851,27.297211],[104.219126,27.286792],[104.219186,27.279861],[104.208872,27.278117],[104.190463,27.28771],[104.189923,27.277934],[104.174153,27.263014],[104.149268,27.283901],[104.142432,27.296477],[104.131519,27.306619],[104.134217,27.322313],[104.118866,27.330113],[104.113829,27.338004],[104.083488,27.331535],[104.08037,27.338784],[104.0625,27.347684],[104.057823,27.35562],[104.039534,27.362638],[104.019926,27.377177],[104.019806,27.410972],[104.016448,27.412347],[104.015249,27.429263],[104.006134,27.430134],[103.992643,27.419728],[103.97981,27.417207],[103.975493,27.422845],[103.956484,27.425367],[103.956005,27.433114],[103.943952,27.434306],[103.932439,27.443931],[103.925363,27.413218],[103.91451,27.396666],[103.91331,27.388458],[103.904856,27.38456],[103.903297,27.347959],[103.885727,27.330709],[103.874034,27.330388],[103.872475,27.305105],[103.865579,27.303131],[103.865459,27.281743],[103.845491,27.287527],[103.841414,27.272746],[103.824924,27.264162],[103.802318,27.267284],[103.801358,27.25071],[103.789186,27.253051],[103.791284,27.244052],[103.78157,27.229955],[103.7646,27.212044],[103.749609,27.211309],[103.745832,27.198631],[103.737437,27.185631],[103.728202,27.179153],[103.719508,27.161234],[103.706615,27.157282],[103.711592,27.14253],[103.696182,27.126673],[103.674715,27.131086],[103.661463,27.122996],[103.65019,27.12557],[103.63352,27.120376],[103.624525,27.112193],[103.620448,27.096746],[103.641195,27.089987],[103.653308,27.092562],[103.659844,27.065799],[103.647791,27.065569],[103.628363,27.072651],[103.617929,27.079825],[103.608635,27.065661],[103.601439,27.062166],[103.607136,27.047309],[103.618229,27.034981],[103.623686,27.035349],[103.628123,27.016119],[103.613732,27.009355],[103.622486,27.006824],[103.638617,27.013266],[103.653907,27.022882],[103.655646,27.032037],[103.675614,27.051679],[103.705116,27.049103],[103.71477,27.035533],[103.730661,27.021088],[103.734499,27.004385],[103.744812,26.992651],[103.753447,26.973045],[103.754167,26.963148],[103.775094,26.950949],[103.777193,26.934973],[103.7652,26.916877],[103.763581,26.905547],[103.767659,26.891361],[103.779471,26.875746],[103.774015,26.866946],[103.761962,26.866071],[103.752308,26.860174],[103.730901,26.85575],[103.722206,26.851419],[103.724125,26.84165],[103.71531,26.830682],[103.707335,26.828977],[103.703078,26.815335],[103.705656,26.79473],[103.720407,26.771723],[103.718908,26.761624],[103.724724,26.754061],[103.725444,26.742808],[103.737197,26.728648],[103.749969,26.725926],[103.763761,26.737919],[103.769158,26.73386],[103.773355,26.716885],[103.767778,26.707889],[103.767778,26.697831],[103.759384,26.689433],[103.758484,26.665436],[103.761003,26.649004],[103.74847,26.625599],[103.769697,26.602789],[103.767898,26.581637],[103.79872,26.567318],[103.810952,26.55406],[103.81545,26.532807],[103.820786,26.528648],[103.843813,26.53082],[103.865639,26.512243],[103.887346,26.517604],[103.89742,26.514184],[103.917748,26.513445],[103.925483,26.516726],[103.955165,26.521578],[103.972435,26.516449],[104.000918,26.519684],[104.008713,26.511735],[104.042592,26.514323],[104.052546,26.507206],[104.072035,26.519129],[104.071015,26.541078],[104.064479,26.560389],[104.068557,26.573369],[104.07977,26.580344],[104.093861,26.59637],[104.097879,26.605052],[104.11323,26.623937],[104.121025,26.637787],[104.1296,26.643926],[104.140813,26.641849],[104.160601,26.646788],[104.174333,26.635248],[104.191602,26.63437],[104.205574,26.62583],[104.229859,26.619874],[104.238374,26.627076],[104.248928,26.626845],[104.256783,26.619227],[104.272793,26.621074],[104.274952,26.633724],[104.300616,26.630215],[104.312669,26.612763],[104.328859,26.619458],[104.353205,26.620751],[104.362979,26.631601],[104.365017,26.642726],[104.379888,26.648819],[104.381687,26.663451],[104.398177,26.68588],[104.398837,26.707704],[104.421263,26.712041],[104.423602,26.704936],[104.434156,26.697738],[104.441771,26.686987],[104.44273,26.672589],[104.457901,26.663636],[104.467855,26.644526],[104.459101,26.622044],[104.45952,26.603435],[104.463958,26.595123],[104.487523,26.579559],[104.501615,26.58935],[104.54299,26.584778],[104.556542,26.590412],[104.571413,26.578265],[104.572192,26.569305],[104.579688,26.568057],[104.581667,26.556693],[104.572132,26.540616],[104.570633,26.524628],[104.59234,26.522918],[104.615126,26.508962],[104.620883,26.497222],[104.638572,26.478132],[104.631856,26.461627],[104.632216,26.451825],[104.64211,26.439108],[104.664836,26.434946],[104.664836,26.419453],[104.668794,26.409878],[104.665376,26.396232],[104.680966,26.378743],[104.684025,26.369628],[104.679527,26.363474],[104.670533,26.364816],[104.65908,26.355792],[104.659499,26.335567],[104.645888,26.330244],[104.621962,26.328994],[104.613807,26.322699],[104.5918,26.317097],[104.581547,26.295013],[104.568534,26.281678],[104.555342,26.273527],[104.54203,26.253102],[104.549886,26.216134],[104.538673,26.207145],[104.539452,26.197043],[104.528659,26.175215],[104.519484,26.168077],[104.518884,26.132843],[104.5265,26.121715],[104.52668,26.100336],[104.516366,26.085215],[104.508451,26.082896],[104.499276,26.07051],[104.479368,26.077469],[104.466836,26.08721],[104.45994,26.085865],[104.455503,26.076958],[104.472772,26.053298],[104.468815,26.033623],[104.462399,26.029632],[104.470494,26.00949],[104.462159,25.996864],[104.462459,25.985955],[104.44399,25.959861],[104.441531,25.948902],[104.446568,25.942865],[104.438353,25.927724],[104.420244,25.918573],[104.414548,25.909886],[104.418445,25.892743],[104.430918,25.896739],[104.435715,25.89265],[104.437514,25.875737],[104.441891,25.869138],[104.429658,25.858031],[104.423602,25.842182],[104.430918,25.825773],[104.428099,25.818428],[104.416167,25.81164],[104.411489,25.796994],[104.402675,25.79811],[104.403814,25.786578],[104.397938,25.761556],[104.391102,25.760905],[104.385525,25.746066],[104.373113,25.731598],[104.365497,25.730388],[104.351945,25.73974],[104.353145,25.745508],[104.328859,25.760486],[104.324602,25.748951],[104.3276,25.737088],[104.322263,25.732668],[104.323463,25.703401],[104.316267,25.683901],[104.314948,25.666306],[104.308532,25.660534],[104.31171,25.647126],[104.324722,25.640701],[104.314468,25.631016],[104.331018,25.615602],[104.329759,25.603586],[104.335455,25.59809],[104.36046,25.599627],[104.369515,25.593619],[104.368495,25.577548],[104.381807,25.58598],[104.389123,25.595482],[104.412809,25.585374],[104.421743,25.584675],[104.428399,25.576057],[104.423182,25.563805],[104.434216,25.555465],[104.436134,25.520422],[104.431637,25.504248],[104.418685,25.499353],[104.430318,25.48672],[104.434695,25.47222],[104.446448,25.476463],[104.449686,25.495065],[104.483566,25.494785],[104.499396,25.507231],[104.507791,25.509655],[104.515646,25.521587],[104.524521,25.526807],[104.547787,25.516646],[104.54359,25.524896],[104.549406,25.529836],[104.557021,25.524103],[104.553304,25.515388],[104.556002,25.503828],[104.551145,25.485415],[104.551205,25.473852],[104.543649,25.464014],[104.545688,25.444941],[104.544249,25.419522],[104.538852,25.410145],[104.54329,25.400815],[104.560859,25.394797],[104.567755,25.402914],[104.593599,25.387845],[104.591261,25.384812],[104.616026,25.364606],[104.636114,25.365166],[104.645828,25.356813],[104.647327,25.343791],[104.645768,25.316389],[104.652843,25.304998],[104.640071,25.298928],[104.641031,25.294819],[104.662018,25.284826],[104.671192,25.293464],[104.70789,25.296219],[104.709569,25.28179],[104.729777,25.273664],[104.735893,25.267873],[104.75718,25.266378],[104.754182,25.275906],[104.766475,25.276513],[104.779967,25.270021],[104.788482,25.256757],[104.796637,25.253534],[104.805991,25.262829],[104.817384,25.261054],[104.827998,25.237091],[104.810128,25.231718],[104.80821,25.215786],[104.815825,25.198357],[104.808629,25.190318],[104.823021,25.171296],[104.818643,25.160171],[104.804732,25.161667],[104.787582,25.179242],[104.777328,25.186393],[104.767194,25.204431],[104.750644,25.215039],[104.74081,25.206581],[104.731936,25.204945],[104.72456,25.195693],[104.734634,25.182233],[104.732355,25.16779],[104.718864,25.152691],[104.718264,25.14091],[104.696377,25.123376],[104.693139,25.102894],[104.686303,25.095691],[104.686483,25.076233],[104.671013,25.066783],[104.647267,25.061684],[104.619564,25.060655],[104.635934,25.054713],[104.652064,25.058924],[104.673711,25.05855],[104.683785,25.054854],[104.700575,25.036325],[104.706871,25.010118],[104.712987,24.996216],[104.700695,24.994765],[104.685224,24.985497],[104.687023,24.974963],[104.663457,24.963118],[104.663937,24.951084],[104.651284,24.940314],[104.651404,24.934601],[104.638692,24.918255],[104.635394,24.903922],[104.618724,24.893944],[104.60829,24.892351],[104.596298,24.88448],[104.587003,24.872907],[104.570993,24.844088],[104.562358,24.839026],[104.539812,24.813855],[104.541431,24.804901],[104.537113,24.793274],[104.544969,24.777754],[104.540471,24.764905],[104.54239,24.755807],[104.528659,24.736811],[104.529438,24.731416],[104.55858,24.727804],[104.574351,24.714059],[104.594019,24.710306],[104.599776,24.696042],[104.628798,24.661174],[104.632995,24.659203],[104.666095,24.656903],[104.697936,24.649392],[104.703633,24.645825],[104.698956,24.632728],[104.70897,24.624183],[104.729477,24.61822],[104.743389,24.622258],[104.751304,24.647139],[104.764256,24.657043],[104.803173,24.665726],[104.810608,24.671687],[104.822961,24.670373],[104.841909,24.676192],[104.860438,24.701532],[104.866255,24.730666],[104.875729,24.73986],[104.899354,24.752946],[104.982524,24.770439],[105.017063,24.785303],[105.033373,24.787788],[105.034153,24.795431],[105.026777,24.81559],[105.037751,24.834058],[105.041708,24.853976],[105.036911,24.865644],[105.03883,24.873001],[105.070431,24.894974],[105.075168,24.916709],[105.100293,24.931182],[105.108988,24.939424],[105.125238,24.946214],[105.132494,24.961386],[105.145506,24.964663],[105.157259,24.958857],[105.178486,24.985403],[105.195995,24.994672],[105.212665,24.995374],[105.215244,24.981283],[105.231134,24.980909],[105.234792,24.9656],[105.251522,24.967426],[105.263994,24.956235],[105.257638,24.942094],[105.265493,24.930198],[105.280064,24.929449],[105.308847,24.923969],[105.333972,24.926358],[105.339009,24.933383],[105.365633,24.943498],[105.391837,24.941625],[105.428175,24.930713],[105.443166,24.921862],[105.448503,24.910714],[105.456598,24.877874],[105.470989,24.852664],[105.484481,24.8469],[105.492816,24.833355],[105.493236,24.816668],[105.497493,24.809355],[105.523337,24.801573],[105.544325,24.798525],[105.572867,24.797306],[105.590557,24.807573],[105.607646,24.803729],[105.614362,24.785585],[105.626115,24.777191],[105.650401,24.772174],[105.678284,24.775597],[105.705687,24.768469],[105.725055,24.755432],[105.737768,24.74244],[105.758935,24.734935],[105.766251,24.720345],[105.795213,24.704816],[105.805467,24.701532],[105.827593,24.702939],[105.856076,24.716874],[105.864111,24.729493],[105.880841,24.730431],[105.892294,24.722785],[105.904947,24.725224],[105.942004,24.724802],[105.946502,24.703972],[105.953038,24.688112],[105.961852,24.677553],[105.985838,24.661409],[105.990095,24.649252],[106.014321,24.63423],[106.023195,24.632352],[106.039265,24.655588],[106.046221,24.673142],[106.047061,24.684076],[106.065829,24.697262],[106.084118,24.705192],[106.09725,24.705942],[106.113561,24.714059],[106.119017,24.725131],[106.133588,24.729822],[106.138865,24.737092],[106.143243,24.756698],[106.149899,24.762842],[106.170226,24.758339],[106.188036,24.790789],[106.185217,24.801151],[106.19733,24.813433],[106.200328,24.839776],[106.206085,24.851071],[106.204046,24.861427],[106.19649,24.872064],[106.19751,24.885792],[106.192113,24.896989],[106.182339,24.903734],[106.167648,24.924719],[106.16429,24.93446],[106.149899,24.944435],[106.145341,24.954034],[106.153017,24.960964],[106.175383,24.95675],[106.183238,24.951693],[106.191633,24.953426],[106.19691,24.963118],[106.215379,24.981845],[106.228211,24.980207],[106.242183,24.972107],[106.253756,24.971218],[106.261491,24.977351],[106.278581,24.97927],[106.304965,24.974074],[106.316358,24.983109],[106.332488,24.988493],[106.353655,24.990225],[106.369906,24.998838],[106.388674,25.00539],[106.406064,25.005624],[106.41164,25.012177],[106.435746,25.017746],[106.44528,25.022333],[106.449957,25.033236],[106.463569,25.040302],[106.512499,25.051111],[106.522573,25.05986],[106.530968,25.072537],[106.551296,25.082829],[106.578939,25.083671],[106.590632,25.087787],[106.597108,25.104905],[106.614318,25.116362],[106.629309,25.121412],[106.640522,25.135066],[106.639023,25.157273],[106.645019,25.164846],[106.667506,25.170595],[106.691131,25.179242],[106.705523,25.176157],[106.722433,25.161854],[106.732147,25.162321],[106.764647,25.183121],[106.772382,25.181392],[106.787553,25.170875],[106.798107,25.170455],[106.836364,25.179476],[106.852734,25.186954],[106.888292,25.182186],[106.900225,25.194478],[106.900225,25.212702],[106.904123,25.231531],[106.912997,25.243024],[106.933265,25.250451],[106.955272,25.246247],[106.976079,25.232933],[106.995867,25.239613],[106.998326,25.244145],[106.987472,25.255776],[106.99137,25.263109],[107.013736,25.275346],[107.009959,25.290289],[107.013377,25.295519],[107.00744,25.308079],[107.014276,25.344818],[107.010918,25.354946],[106.986933,25.359753],[106.979497,25.37408],[106.979797,25.388125],[106.97416,25.40702],[106.967804,25.409492],[106.968884,25.425959],[106.963727,25.437339],[106.981896,25.448159],[106.996467,25.442702],[107.003842,25.462102],[107.0075,25.479447],[107.019073,25.497395],[107.039761,25.503316],[107.055651,25.503968],[107.070102,25.511752],[107.0746,25.52126],[107.064166,25.543303],[107.064526,25.559518],[107.093428,25.569815],[107.122331,25.564737],[107.160708,25.570281],[107.165984,25.574334],[107.185233,25.57834],[107.187272,25.590917],[107.199744,25.603819],[107.211197,25.609175],[107.228647,25.60489],[107.236022,25.585328],[107.230206,25.564783],[107.237641,25.551644],[107.263905,25.543164],[107.296106,25.520468],[107.307739,25.500239],[107.313495,25.504947],[107.328666,25.494552],[107.32219,25.493433],[107.321231,25.484575],[107.330165,25.473199],[107.332744,25.446713],[107.325308,25.442516],[107.325728,25.434727],[107.315114,25.42969],[107.308398,25.433141],[107.308998,25.409166],[107.314874,25.402634],[107.344377,25.403661],[107.353911,25.395496],[107.364644,25.394983],[107.367223,25.403894],[107.375798,25.412058],[107.386411,25.410612],[107.402422,25.393723],[107.42089,25.39307],[107.423829,25.383879],[107.413035,25.372773],[107.408538,25.36022],[107.409138,25.347152],[107.428686,25.313448],[107.432703,25.289122],[107.449073,25.287534],[107.47096,25.300795],[107.481574,25.300188],[107.490089,25.2767],[107.470001,25.232092],[107.474618,25.225972],[107.472279,25.21373],[107.479235,25.211207],[107.5046,25.210693],[107.50448,25.217608],[107.513115,25.21658],[107.518331,25.207609],[107.52151,25.221486],[107.541478,25.22457],[107.543336,25.234848],[107.55407,25.239567],[107.558927,25.246901],[107.583572,25.256056],[107.590828,25.24905],[107.599402,25.250965],[107.593766,25.262829],[107.605639,25.255215],[107.608937,25.266051],[107.614993,25.268107],[107.614393,25.27698],[107.631963,25.310133],[107.643416,25.314849],[107.659666,25.316296],[107.6689,25.307472],[107.658347,25.293371],[107.661885,25.258952],[107.66998,25.244425],[107.690547,25.228168],[107.696244,25.219851],[107.694625,25.197889],[107.700621,25.194151],[107.710395,25.20345],[107.742116,25.240221],[107.75297,25.240875],[107.762144,25.228962],[107.756388,25.199899],[107.759985,25.188636],[107.782712,25.170455],[107.789488,25.154748],[107.778814,25.134926],[107.762684,25.124499],[107.76898,25.117531],[107.778634,25.124779],[107.794465,25.116128],[107.806817,25.124826],[107.819529,25.129174],[107.841896,25.115941],[107.86786,25.129408],[107.872417,25.141611],[107.897662,25.144837],[107.898082,25.148905],[107.915411,25.156805],[107.928604,25.155824],[107.95049,25.174194],[107.969139,25.177886],[107.989107,25.18686],[108.001939,25.196534],[108.010754,25.195272],[108.053628,25.199572],[108.080612,25.193777],[108.114911,25.210226],[108.121747,25.231017],[108.13374,25.234381],[108.134759,25.259699],[108.143334,25.269788],[108.137038,25.278148],[108.135958,25.297854],[108.14951,25.310367],[108.152088,25.324419],[108.137817,25.336509],[108.136618,25.343138],[108.152148,25.353732],[108.155267,25.377953],[108.142794,25.390644],[108.153827,25.39475],[108.165101,25.391577],[108.18255,25.391577],[108.193284,25.405527],[108.185728,25.413364],[108.190585,25.418915],[108.170617,25.431835],[108.165041,25.427404],[108.157605,25.439018],[108.162462,25.444754],[108.192624,25.459071],[108.202998,25.451703],[108.221407,25.450071],[108.226264,25.437246],[108.225844,25.426985],[108.252048,25.430483],[108.252408,25.438458],[108.236098,25.449371],[108.240715,25.461915],[108.260923,25.473759],[108.28107,25.480006],[108.299239,25.501125],[108.305416,25.516227],[108.303257,25.520748],[108.316689,25.531514],[108.344692,25.537339],[108.352487,25.533098],[108.351828,25.524709],[108.359563,25.513477],[108.38139,25.500659],[108.392543,25.498561],[108.400338,25.491382],[108.415089,25.461682],[108.418987,25.443355],[108.433438,25.436406],[108.443153,25.449978],[108.4633,25.454315],[108.471815,25.458884],[108.488365,25.456366],[108.500358,25.447832],[108.507374,25.432955],[108.51385,25.42871],[108.511271,25.41439],[108.524224,25.418355],[108.544371,25.407999],[108.543952,25.403661],[108.564039,25.384345],[108.56248,25.37408],[108.585866,25.366007],[108.594381,25.347525],[108.589044,25.335342],[108.613869,25.309853],[108.625202,25.308126],[108.624903,25.324326],[108.63006,25.335903],[108.615368,25.365773],[108.623883,25.377299],[108.622264,25.389758],[108.613869,25.407253],[108.59588,25.407533],[108.587665,25.421387],[108.600318,25.432488],[108.598878,25.454828],[108.611531,25.479633],[108.621365,25.468024],[108.633178,25.464433],[108.628261,25.477955],[108.620405,25.476696],[108.618127,25.484342],[108.607453,25.492081],[108.621185,25.49278],[108.622204,25.502896],[108.631319,25.508396],[108.632878,25.518884],[108.654585,25.530069],[108.66304,25.526014],[108.667717,25.532213],[108.682468,25.521027],[108.690443,25.51893],[108.687325,25.535242],[108.658183,25.551831],[108.665918,25.562361],[108.659921,25.573449],[108.660941,25.584815],[108.672814,25.590172],[108.683787,25.586119],[108.690443,25.596274],[108.689723,25.604285],[108.682408,25.605868],[108.689004,25.623193],[108.703695,25.625521],[108.714489,25.623472],[108.723363,25.634508],[108.76198,25.637767],[108.765518,25.632087],[108.784046,25.628268],[108.786565,25.620818],[108.780269,25.601816],[108.79484,25.593992],[108.799157,25.576011],[108.786925,25.572144],[108.781288,25.554347],[108.789143,25.554673],[108.798078,25.546705],[108.800117,25.538038],[108.812709,25.52634],[108.826501,25.55006],[108.830338,25.546798],[108.855943,25.548383],[108.851566,25.554626],[108.867336,25.55854],[108.876211,25.553368],[108.890422,25.556257],[108.888923,25.544841],[108.897498,25.54088],[108.913088,25.543769],[108.931737,25.556397],[108.937913,25.553601],[108.952425,25.55635],[108.972453,25.542511],[108.972872,25.531793],[108.989662,25.533704],[109.011069,25.519256],[109.025101,25.512498],[109.044169,25.527972],[109.055502,25.525548],[109.066836,25.538737],[109.077329,25.53622],[109.088542,25.549501],[109.07559,25.553089],[109.067795,25.561848],[109.052204,25.566833],[109.046328,25.5748],[109.04243,25.608896],[109.046628,25.618862],[109.031217,25.629526],[109.041891,25.638978],[109.04297,25.656949],[109.049506,25.66058],[109.057481,25.679805],[109.07523,25.693861],[109.071932,25.708194],[109.079128,25.720711],[109.054303,25.732203],[109.055862,25.738111],[109.04285,25.737693],[109.036914,25.724526],[109.030557,25.722712],[109.003214,25.736344],[109.001355,25.724526],[108.983906,25.720571],[108.974551,25.700422],[108.958181,25.691347],[108.948407,25.676686],[108.929399,25.68418],[108.919565,25.677757],[108.900316,25.682365],[108.895099,25.703401],[108.896239,25.71415],[108.912129,25.718338],[108.911409,25.724759],[108.929758,25.732575],[108.940252,25.740112],[108.953864,25.730761],[108.963578,25.732529],[108.95956,25.740112],[108.964238,25.745089],[108.979588,25.745322],[108.989722,25.762998],[109.000036,25.760579],[108.989602,25.778951],[108.997697,25.784392],[109.011789,25.779509],[109.016766,25.790902],[109.031337,25.793925],[109.048187,25.790577],[109.077869,25.776765],[109.080567,25.78867],[109.087643,25.795831],[109.098257,25.795134],[109.094779,25.802295],[109.117985,25.809408],[109.135134,25.805456],[109.143589,25.795273],[109.143829,25.77723],[109.132316,25.762952],[109.148266,25.741833],[109.155342,25.744717],[109.15924,25.759044],[109.182805,25.763277],[109.19108,25.774533],[109.177948,25.782067],[109.182266,25.788903],[109.166136,25.796296],[109.17543,25.804898],[109.193059,25.800109],[109.206671,25.788112],[109.204992,25.773928],[109.209429,25.747508],[109.206971,25.740251],[109.217285,25.736762],[109.234194,25.736344],[109.247686,25.728248],[109.254762,25.728574],[109.256381,25.71978],[109.280486,25.713964],[109.296677,25.714197],[109.313886,25.72206],[109.314906,25.73318],[109.34009,25.731738],[109.34147,25.746904],[109.338411,25.755277],[109.327858,25.761417],[109.334154,25.772021],[109.329117,25.784206],[109.336313,25.7896],[109.339731,25.802527],[109.337092,25.811175],[109.339311,25.833769],[109.349025,25.838836],[109.358979,25.836047],[109.369053,25.842647],[109.37373,25.853291],[109.388661,25.870765],[109.391359,25.891256],[109.396756,25.900316],[109.413246,25.905612],[109.425719,25.91639],[109.434353,25.932322],[109.432015,25.947787],[109.426018,25.955171],[109.40683,25.961068],[109.408509,25.96729],[109.454381,25.991386],[109.468413,26.000531],[109.482624,26.029632],[109.479146,26.047776],[109.466254,26.048658],[109.453842,26.05404],[109.447545,26.071763],[109.450963,26.075984],[109.449704,26.10182],[109.459838,26.093471],[109.474409,26.099037],[109.504091,26.096857],[109.512726,26.115501],[109.514105,26.128253],[109.504991,26.134142],[109.495217,26.15264],[109.494437,26.144991],[109.480106,26.145593],[109.467513,26.162329],[109.471771,26.169931],[109.459298,26.194077],[109.470452,26.196348],[109.468293,26.203207],[109.452402,26.209647],[109.43963,26.238835],[109.453422,26.264543],[109.458339,26.283437],[109.476868,26.299227],[109.466134,26.314135],[109.460138,26.31381],[109.443528,26.302005],[109.442628,26.289874],[109.429796,26.286679],[109.421041,26.288716],[109.401493,26.283715],[109.391179,26.277093],[109.37325,26.278205],[109.354362,26.265284],[109.339791,26.26408],[109.334754,26.276676],[109.32336,26.282465],[109.32492,26.290337],[109.306451,26.290707],[109.297636,26.297236],[109.285883,26.295847],[109.27449,26.315431],[109.271432,26.327744],[109.277308,26.34001],[109.292599,26.345333],[109.299015,26.368194],[109.313586,26.397388],[109.319583,26.41862],[109.326838,26.427963],[109.361018,26.44831],[109.37355,26.449466],[109.380986,26.461766],[109.362457,26.46625],[109.364076,26.475913],[109.385483,26.493525],[109.381705,26.518482],[109.404312,26.529665],[109.408749,26.537058],[109.403952,26.560204],[109.395197,26.566441],[109.399035,26.570967],[109.385483,26.571014],[109.39022,26.582238],[109.387162,26.588057],[109.391299,26.600526],[109.384703,26.604728],[109.378707,26.622459],[109.364376,26.633447],[109.355141,26.65902],[109.334094,26.646234],[109.304232,26.663128],[109.287022,26.689664],[109.283724,26.698569],[109.292959,26.701291],[109.298416,26.696539],[109.319103,26.701752],[109.335593,26.699999],[109.355021,26.693217],[109.364975,26.69617],[109.37301,26.705028],[109.385963,26.712133],[109.381285,26.727449],[109.40707,26.719837],[109.413966,26.722236],[109.417743,26.739764],[109.437711,26.755214],[109.453962,26.761209],[109.486702,26.760149],[109.476568,26.829899],[109.466914,26.831927],[109.452642,26.861832],[109.436452,26.861141],[109.444847,26.871738],[109.438551,26.877404],[109.436452,26.892605],[109.446586,26.899652],[109.458219,26.901863],[109.471771,26.911166],[109.484243,26.913561],[109.493238,26.921113],[109.514105,26.930783],[109.526698,26.925902],[109.533653,26.938611],[109.555,26.946898],[109.546725,26.984597],[109.536831,26.974656],[109.527597,26.977187],[109.529276,26.991823],[109.540609,26.994124],[109.541329,27.012898],[109.525798,27.026563],[109.525019,27.037282],[109.517943,27.043216],[109.518842,27.060004],[109.510447,27.067914],[109.518483,27.072559],[109.505051,27.072743],[109.498455,27.079365],[109.48982,27.078629],[109.486762,27.067409],[109.496176,27.062488],[109.487062,27.053933],[109.468293,27.064787],[109.454561,27.069478],[109.481425,27.071272],[109.482444,27.081113],[109.466014,27.080515],[109.459598,27.084101],[109.467393,27.094861],[109.457919,27.096516],[109.459598,27.108286],[109.469372,27.115457],[109.47267,27.134901],[109.457559,27.133338],[109.448325,27.12056],[109.440889,27.118169],[109.427937,27.12603],[109.415285,27.153881],[109.400234,27.152411],[109.400834,27.159579],[109.392799,27.156087],[109.393158,27.143863],[109.384583,27.143909],[109.378167,27.155444],[109.37397,27.147815],[109.358739,27.15287],[109.333674,27.148734],[109.335053,27.139083],[109.298955,27.135268],[109.280546,27.127133],[109.264236,27.131867],[109.2574,27.150618],[109.248106,27.153422],[109.238932,27.149148],[109.223041,27.12249],[109.195937,27.091275],[109.185504,27.082308],[109.17525,27.087228],[109.163557,27.065799],[109.154263,27.071961],[109.141071,27.073571],[109.130517,27.065063],[109.101135,27.068926],[109.10917,27.092516],[109.118944,27.105205],[109.131057,27.110125],[109.133995,27.117756],[109.122962,27.123364],[109.111389,27.12318],[109.097237,27.116101],[109.080387,27.116514],[109.066955,27.104516],[109.061978,27.1104],[109.053703,27.098309],[109.035834,27.098079],[109.032536,27.10378],[109.018805,27.095826],[109.016106,27.086768],[109.007531,27.080239],[108.989602,27.074077],[108.964238,27.054485],[108.940432,27.044734],[108.94313,27.037374],[108.950986,27.036913],[108.951945,27.018741],[108.936774,27.011794],[108.921363,27.009769],[108.921004,27.029783],[108.914947,27.025965],[108.918485,27.019063],[108.900616,27.016947],[108.885025,27.002913],[108.872853,26.999876],[108.878429,27.006364],[108.87735,27.016257],[108.868535,27.031025],[108.854744,27.031991],[108.84395,27.047953],[108.845629,27.058026],[108.840952,27.06304],[108.831178,27.057888],[108.803834,27.078859],[108.792261,27.083274],[108.807492,27.098585],[108.82728,27.089343],[108.845869,27.098493],[108.854324,27.09601],[108.859961,27.11486],[108.873512,27.11394],[108.878789,27.106309],[108.887484,27.112515],[108.887124,27.121203]]],[[[105.081944,24.915632],[105.08926,24.915211],[105.100173,24.924765],[105.098734,24.929121],[105.081944,24.915632]]],[[[109.476568,26.829899],[109.486702,26.760149],[109.502352,26.757705],[109.504631,26.744607],[109.52214,26.749219],[109.516923,26.757705],[109.517523,26.77993],[109.507689,26.801183],[109.497495,26.815289],[109.497315,26.823078],[109.513146,26.840268],[109.510387,26.865518],[109.513805,26.874271],[109.490839,26.883623],[109.486822,26.895323],[109.474169,26.894309],[109.47291,26.884774],[109.45672,26.873212],[109.452642,26.861832],[109.466914,26.831927],[109.482085,26.837042],[109.476568,26.829899]]],[[[109.577367,26.751617],[109.570411,26.747928],[109.558059,26.754661],[109.561537,26.742209],[109.553921,26.73529],[109.534193,26.744561],[109.528437,26.741471],[109.546306,26.731047],[109.547265,26.7179],[109.553381,26.722974],[109.568252,26.726203],[109.578146,26.733307],[109.579046,26.740825],[109.596435,26.760702],[109.577127,26.77057],[109.580365,26.755676],[109.577367,26.751617]]]]}}]}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
<template>
<div>
<div class="echarts-wrap" ref="echartWord"></div>
</div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
import "echarts-wordcloud";
const props = defineProps({
// 词云数据
data: {
type: Array,
required: true,
// 示例:
// [
// { name: 'Vue', value: 1000 },
// { name: 'ECharts', value: 618 },
// // ...
// ]
},
// 词云形状,可以是 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon' 等
shape: {
type: String,
default: "circle",
},
});
const echartWord = ref(null);
let myChart = null;
const initChart = () => {
if (echartWord.value) {
myChart = echarts.init(echartWord.value);
const option = {
grid: {
left: 5,
top: 5,
right: 5,
bottom: 5,
},
series: [
{
type: "wordCloud",
shape: props.shape,
// 其他形状你可以使用形状路径
// shape: 'circle', // 示例
// 或者自定义路径
gridSize: 20, // 网格大小,影响词间距。
sizeRange: [15, 25], // 定义词云中文字大小的范围
rotationRange: [0, 0],
rotationStep: 0,
drawOutOfBound: false, // 是否超出画布
// 字体
textStyle: {
// normal: {
// color: function () {
// return 'rgb(' + [
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160)
// ].join(',') + ')';
// }
// },
color: function () {
let colors = [
"rgba(189, 33, 33, 1)",
"rgba(232, 151, 21, 1)",
"rgba(220, 190, 68, 1)",
"rgba(96, 58, 186, 1)",
"rgba(32, 121, 69, 1)",
"rgba(22, 119, 255, 1)",
];
return colors[parseInt(Math.random() * colors.length)];
},
emphasis: {
shadowBlur: 5,
shadowColor: "#333",
},
},
// 设置词云数据
data: props.data,
},
],
};
myChart.setOption(option);
window.addEventListener("resize", myChart.resize);
}
};
onMounted(() => {
initChart();
});
onBeforeUnmount(() => {
if (myChart) {
window.removeEventListener("resize", myChart.resize);
myChart.dispose();
}
});
</script>
<style lang="scss" scoped>
.echarts-wrap {
// width: 100%;
width: 576px;
height: 215px;
}
</style>
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"adcode":520000,"name":"贵州省","center":[106.713478,26.578343],"centroid":[106.880455,26.826368],"childrenNum":9,"level":"province","acroutes":[100000],"parent":{"adcode":100000}},"geometry":{"type":"MultiPolygon","coordinates":[[[[108.887124,27.121203],[108.904933,27.134947],[108.913688,27.157695],[108.92676,27.160912],[108.926041,27.175202],[108.929758,27.180072],[108.919145,27.193486],[108.925741,27.199596],[108.908651,27.204327],[108.914228,27.214662],[108.947088,27.228393],[108.951465,27.236062],[108.963458,27.235511],[108.968555,27.245521],[108.984625,27.256219],[108.987503,27.270635],[108.999556,27.267559],[109.01059,27.270497],[109.023901,27.282248],[109.040811,27.276235],[109.045608,27.288215],[109.053943,27.29487],[109.054123,27.306068],[109.044409,27.331076],[109.052084,27.336673],[109.05952,27.326855],[109.069234,27.322817],[109.080387,27.334884],[109.086384,27.33103],[109.103773,27.337086],[109.101075,27.34984],[109.106412,27.35562],[109.114387,27.35273],[109.118464,27.362225],[109.113847,27.367178],[109.124761,27.387908],[109.115886,27.400105],[109.127699,27.405057],[109.14197,27.417711],[109.138672,27.430318],[109.129258,27.42555],[109.125,27.415556],[109.115766,27.412576],[109.10917,27.41872],[109.112948,27.424633],[109.123321,27.418399],[109.123321,27.428622],[109.144009,27.448835],[109.154083,27.448789],[109.15942,27.442327],[109.156241,27.416519],[109.166975,27.417849],[109.189521,27.436552],[109.202114,27.450073],[109.213687,27.450485],[109.221902,27.438889],[109.243249,27.42963],[109.245528,27.418169],[109.286423,27.424633],[109.299915,27.423946],[109.30693,27.434397],[109.302973,27.475644],[109.312387,27.486182],[109.325879,27.494199],[109.379127,27.53579],[109.404971,27.550489],[109.433634,27.548383],[109.445986,27.562394],[109.459118,27.56015],[109.461937,27.565599],[109.451263,27.585925],[109.469132,27.620937],[109.470032,27.628762],[109.464455,27.651409],[109.45612,27.669432],[109.458219,27.674783],[109.470452,27.680272],[109.45684,27.69358],[109.429976,27.703549],[109.418223,27.714248],[109.414146,27.725037],[109.395317,27.7217],[109.392379,27.726363],[109.365935,27.722203],[109.377987,27.73802],[109.362997,27.745014],[109.364316,27.759777],[109.349864,27.771064],[109.338112,27.775908],[109.333015,27.782808],[109.34105,27.79021],[109.331216,27.791626],[109.342669,27.800764],[109.34021,27.821411],[109.345547,27.84073],[109.326838,27.858585],[109.337512,27.869543],[109.321861,27.867991],[109.317784,27.885521],[109.320602,27.895609],[109.311907,27.907796],[109.314846,27.91811],[109.313826,27.933306],[109.301774,27.958353],[109.30711,27.968024],[109.320182,27.970989],[109.321622,27.991786],[109.342249,28.00533],[109.365095,28.009114],[109.379187,28.033096],[109.370552,28.046087],[109.346986,28.060399],[109.334574,28.062222],[109.325219,28.04276],[109.311548,28.037973],[109.305911,28.029996],[109.298715,28.032503],[109.304952,28.076394],[109.312087,28.083503],[109.314366,28.103914],[109.325399,28.115212],[109.328098,28.126872],[109.338172,28.141765],[109.335833,28.158204],[109.341829,28.162165],[109.343208,28.173593],[109.34045,28.190391],[109.345787,28.206686],[109.359579,28.22043],[109.35676,28.23349],[109.367314,28.239041],[109.37349,28.25683],[109.388001,28.268111],[109.399694,28.269294],[109.376908,28.276935],[109.365875,28.274206],[109.359519,28.265882],[109.352203,28.268521],[109.363116,28.282984],[109.34099,28.293717],[109.314966,28.27639],[109.306391,28.274206],[109.294938,28.278527],[109.297576,28.292808],[109.285523,28.304131],[109.273051,28.309405],[109.27527,28.314043],[109.268554,28.338092],[109.285283,28.359046],[109.288342,28.374315],[109.277368,28.376542],[109.264656,28.39249],[109.264356,28.404393],[109.256861,28.436734],[109.261778,28.454398],[109.260818,28.464705],[109.266335,28.481775],[109.275929,28.484],[109.27437,28.494667],[109.236413,28.478416],[109.233595,28.474966],[109.215486,28.482138],[109.19174,28.47088],[109.185504,28.453127],[109.176569,28.446179],[109.180707,28.439458],[109.176749,28.431511],[109.165656,28.430375],[109.164936,28.414978],[109.154263,28.417612],[109.157141,28.403394],[109.153603,28.397306],[109.153123,28.381041],[109.144788,28.363818],[109.138612,28.358637],[109.151684,28.350547],[109.150785,28.344683],[109.137713,28.334229],[109.141251,28.320545],[109.126799,28.296946],[109.116246,28.28826],[109.119064,28.282257],[109.100415,28.263835],[109.087583,28.26097],[109.081527,28.24855],[109.085364,28.232808],[109.099816,28.214742],[109.101435,28.201407],[109.089982,28.196627],[109.082066,28.184337],[109.061439,28.200132],[109.041591,28.205366],[109.038233,28.217427],[109.02678,28.220066],[109.013828,28.199586],[109.014247,28.177873],[109.00981,28.167902],[109.001535,28.161391],[108.985765,28.161346],[108.979948,28.170771],[108.956622,28.182334],[108.929399,28.190574],[108.9273,28.196491],[108.933176,28.20787],[108.919505,28.217791],[108.912249,28.215561],[108.897258,28.21952],[108.864458,28.20614],[108.855163,28.199859],[108.836215,28.207369],[108.833277,28.217882],[108.824342,28.231033],[108.821764,28.245138],[108.805573,28.24209],[108.799757,28.226619],[108.773313,28.213468],[108.765338,28.192121],[108.758202,28.198357],[108.758682,28.220203],[108.749507,28.227575],[108.738834,28.227347],[108.737575,28.251416],[108.727621,28.259832],[108.725762,28.280301],[108.741052,28.2949],[108.763779,28.305631],[108.770075,28.314952],[108.76144,28.324591],[108.77793,28.347229],[108.77739,28.36659],[108.783087,28.380404],[108.762819,28.385811],[108.76174,28.395262],[108.779309,28.427423],[108.773913,28.437869],[108.746749,28.450221],[108.749088,28.461073],[108.743691,28.467656],[108.733917,28.468882],[108.725642,28.475828],[108.723363,28.491943],[108.709691,28.501066],[108.701416,28.482502],[108.688644,28.482502],[108.671135,28.475284],[108.658662,28.478053],[108.64523,28.46861],[108.641453,28.455715],[108.666817,28.44182],[108.669875,28.431465],[108.688344,28.422291],[108.696799,28.404575],[108.691702,28.394035],[108.674193,28.389355],[108.664719,28.382858],[108.656444,28.356365],[108.659082,28.35032],[108.673953,28.354547],[108.675752,28.343047],[108.667357,28.33441],[108.610811,28.325091],[108.602416,28.34082],[108.58011,28.343274],[108.576332,28.364318],[108.577531,28.390173],[108.587425,28.404939],[108.608832,28.407301],[108.609912,28.435689],[108.602836,28.438868],[108.597259,28.456805],[108.586766,28.463071],[108.587605,28.479324],[108.574953,28.497662],[108.581069,28.506967],[108.573214,28.528114],[108.576872,28.533831],[108.589344,28.538595],[108.610931,28.539412],[108.604635,28.59026],[108.618906,28.606538],[108.636056,28.621772],[108.632338,28.638953],[108.623284,28.641446],[108.609012,28.633604],[108.59618,28.640358],[108.585327,28.639633],[108.586106,28.648788],[108.575912,28.659711],[108.566498,28.662566],[108.561161,28.649151],[108.547789,28.647882],[108.538495,28.652731],[108.524643,28.647111],[108.517987,28.639995],[108.502756,28.637638],[108.501018,28.626668],[108.491303,28.630567],[108.471096,28.627801],[108.461381,28.634148],[108.439015,28.634012],[108.421685,28.643349],[108.390924,28.65178],[108.352128,28.676115],[108.343972,28.673396],[108.332519,28.679604],[108.343673,28.696458],[108.34763,28.709232],[108.34727,28.736271],[108.372515,28.760134],[108.375333,28.767513],[108.385287,28.772221],[108.389005,28.785847],[108.386487,28.801643],[108.382409,28.805806],[108.354226,28.814269],[108.355186,28.831644],[108.346431,28.856299],[108.355306,28.870818],[108.357464,28.893384],[108.350329,28.907084],[108.350568,28.93032],[108.346911,28.941484],[108.339895,28.947856],[108.322925,28.953957],[108.312551,28.99706],[108.308714,29.003384],[108.309793,29.018424],[108.29786,29.047144],[108.307155,29.077525],[108.301938,29.083077],[108.286587,29.089215],[108.270637,29.090885],[108.268658,29.077796],[108.260203,29.063758],[108.256965,29.041996],[108.242274,29.028359],[108.224645,29.031566],[108.230401,29.046963],[108.21505,29.056128],[108.204737,29.05676],[108.197721,29.070664],[108.171397,29.065383],[108.152448,29.053735],[108.13272,29.054096],[108.128763,29.065699],[108.109814,29.076081],[108.069398,29.086552],[108.035999,29.054051],[108.0345,29.046737],[108.024246,29.0387],[107.993904,29.033823],[107.949291,29.033733],[107.931122,29.035223],[107.908815,29.007359],[107.887648,29.008533],[107.883031,28.986534],[107.871998,28.983056],[107.86756,28.960464],[107.842016,28.964622],[107.828104,28.976143],[107.810415,28.984321],[107.821208,29.005733],[107.823547,29.03423],[107.815092,29.034772],[107.803459,29.042899],[107.78523,29.047234],[107.789847,29.082355],[107.799981,29.106183],[107.810655,29.139389],[107.795184,29.146471],[107.782352,29.161671],[107.775216,29.162843],[107.767901,29.17511],[107.760285,29.17768],[107.759386,29.192289],[107.751591,29.199638],[107.739418,29.189043],[107.724727,29.182189],[107.727245,29.175696],[107.718491,29.156123],[107.707577,29.154184],[107.698643,29.141239],[107.662604,29.147914],[107.659486,29.162888],[107.645874,29.160859],[107.628785,29.16582],[107.616912,29.162979],[107.606718,29.165459],[107.600602,29.159596],[107.601022,29.147824],[107.589269,29.150034],[107.585071,29.158333],[107.590168,29.165279],[107.581174,29.172539],[107.576256,29.18512],[107.575477,29.207302],[107.569301,29.219427],[107.55437,29.219472],[107.549573,29.210052],[107.532243,29.19549],[107.515333,29.194498],[107.48829,29.174704],[107.473059,29.171006],[107.462325,29.176868],[107.464004,29.195445],[107.441458,29.203966],[107.427067,29.190305],[107.4044,29.18787],[107.403261,29.172494],[107.412316,29.1614],[107.408238,29.150891],[107.408418,29.138352],[107.42149,29.13578],[107.427606,29.128291],[107.412675,29.095398],[107.392288,29.091246],[107.382034,29.097519],[107.369741,29.091607],[107.376097,29.074772],[107.377896,29.057979],[107.390729,29.059063],[107.395166,29.039648],[107.377297,29.026779],[107.364165,29.009617],[107.370461,28.993898],[107.396965,28.993356],[107.40446,28.981881],[107.40554,28.972258],[107.412975,28.960148],[107.42155,28.954545],[107.43876,28.955268],[107.441038,28.943789],[107.433603,28.933755],[107.42089,28.925212],[107.413815,28.911424],[107.415614,28.889811],[107.406139,28.89153],[107.391928,28.868466],[107.395406,28.860867],[107.383473,28.848564],[107.367283,28.84499],[107.359907,28.849966],[107.331964,28.84119],[107.345156,28.829608],[107.325368,28.809562],[107.304621,28.806757],[107.277157,28.799154],[107.261447,28.792727],[107.252392,28.780551],[107.253532,28.766789],[107.246636,28.761854],[107.219232,28.772719],[107.218753,28.788698],[107.213416,28.795035],[107.210598,28.814812],[107.216354,28.82816],[107.226368,28.836802],[107.195127,28.838068],[107.196866,28.847388],[107.20652,28.868014],[107.194048,28.876607],[107.198425,28.878416],[107.193568,28.888771],[107.184094,28.879953],[107.182654,28.887144],[107.167124,28.880586],[107.155851,28.882983],[107.145777,28.876878],[107.141939,28.887731],[107.096666,28.890083],[107.09025,28.875114],[107.072681,28.866612],[107.059789,28.868466],[107.063386,28.877059],[107.072321,28.87932],[107.066565,28.895373],[107.052533,28.891123],[107.045577,28.874933],[107.058709,28.868964],[107.038981,28.863717],[107.038861,28.877963],[107.032385,28.882305],[107.016075,28.882486],[107.019133,28.860687],[107.005162,28.859194],[107.002643,28.85449],[106.983395,28.851187],[106.989271,28.829563],[106.980816,28.813183],[106.981356,28.804268],[106.988672,28.790328],[106.987892,28.774666],[106.967804,28.774123],[106.951734,28.76697],[106.950235,28.777608],[106.94226,28.782135],[106.938422,28.792365],[106.923071,28.810015],[106.905382,28.796121],[106.897887,28.801145],[106.886373,28.794718],[106.874261,28.779736],[106.864607,28.774485],[106.862328,28.780596],[106.845358,28.781003],[106.838462,28.765974],[106.833366,28.768781],[106.824071,28.756149],[106.828329,28.737675],[106.852914,28.724451],[106.862568,28.707556],[106.853933,28.706333],[106.854713,28.697092],[106.862148,28.690976],[106.883195,28.692426],[106.880617,28.68051],[106.866945,28.649921],[106.869764,28.64906],[106.866346,28.624492],[106.829288,28.622724],[106.833246,28.613203],[106.827069,28.598558],[106.807701,28.589443],[106.800505,28.60214],[106.79343,28.606493],[106.79259,28.616241],[106.780358,28.624991],[106.775021,28.611979],[106.75907,28.611118],[106.758591,28.588128],[106.766626,28.580146],[106.780957,28.574885],[106.779878,28.563773],[106.765127,28.558193],[106.754333,28.558329],[106.737364,28.553294],[106.728189,28.541998],[106.723992,28.529883],[106.72603,28.518584],[106.744859,28.489855],[106.746658,28.466658],[106.732866,28.46357],[106.725251,28.454444],[106.716196,28.456396],[106.708521,28.450493],[106.69329,28.456532],[106.697668,28.476645],[106.688253,28.484681],[106.678359,28.481367],[106.66109,28.491898],[106.649756,28.479551],[106.631108,28.490264],[106.632727,28.503517],[106.61018,28.497935],[106.593391,28.510189],[106.584936,28.506876],[106.591532,28.499069],[106.591832,28.490355],[106.568026,28.484045],[106.562809,28.49739],[106.567906,28.505287],[106.560291,28.513366],[106.568685,28.523667],[106.584636,28.523258],[106.588893,28.531426],[106.615277,28.549665],[106.616836,28.56282],[106.607062,28.594296],[106.613059,28.608851],[106.626011,28.604317],[106.633566,28.607627],[106.636804,28.623223],[106.628589,28.634465],[106.618875,28.637276],[106.617676,28.644256],[106.641182,28.644165],[106.651376,28.649423],[106.6437,28.664333],[106.635245,28.658487],[106.62685,28.659257],[106.617676,28.667279],[106.614258,28.680283],[106.619175,28.689164],[106.606103,28.685041],[106.598068,28.691882],[106.587274,28.691519],[106.582357,28.702211],[106.576841,28.702392],[106.560291,28.720737],[106.559751,28.733871],[106.563888,28.746188],[106.56185,28.756059],[106.547998,28.769867],[106.534026,28.770909],[106.533787,28.77874],[106.523053,28.781139],[106.521134,28.794266],[106.508782,28.79585],[106.490613,28.80653],[106.476221,28.826757],[106.474482,28.833046],[106.46183,28.83101],[106.468426,28.826441],[106.453495,28.816939],[106.451396,28.808114],[106.459611,28.805716],[106.46279,28.797207],[106.451696,28.792817],[106.454515,28.7753],[106.46207,28.76122],[106.493851,28.739486],[106.498108,28.717476],[106.510341,28.715166],[106.515857,28.688122],[106.52827,28.677655],[106.520175,28.662112],[106.502785,28.661297],[106.506683,28.635598],[106.501046,28.628119],[106.501526,28.618553],[106.49499,28.615153],[106.49433,28.60019],[106.513339,28.577017],[106.524072,28.577833],[106.508782,28.564861],[106.498828,28.585861],[106.473823,28.598966],[106.467347,28.588536],[106.47892,28.575021],[106.487255,28.558828],[106.504704,28.544674],[106.501166,28.534511],[106.493371,28.538323],[106.483837,28.530609],[106.471604,28.532606],[106.467287,28.541589],[106.453075,28.54472],[106.454035,28.549755],[106.441622,28.559418],[106.434067,28.556696],[106.423213,28.562684],[106.41296,28.563138],[106.399108,28.571166],[106.385676,28.560824],[106.389814,28.553249],[106.373563,28.537642],[106.3786,28.532606],[106.373743,28.524983],[106.374523,28.510915],[106.380579,28.507375],[106.376142,28.493305],[106.3789,28.479732],[106.352876,28.480277],[106.349098,28.473785],[106.341363,28.480686],[106.330689,28.482138],[106.323674,28.494939],[106.306824,28.503245],[106.293992,28.526934],[106.292612,28.537324],[106.278041,28.538867],[106.277262,28.532878],[106.254835,28.539412],[106.236186,28.560144],[106.214779,28.573207],[106.205605,28.567991],[106.192593,28.577244],[106.184798,28.589443],[106.184857,28.600599],[106.173344,28.612523],[106.171246,28.628663],[106.165729,28.636233],[106.152057,28.636505],[106.144622,28.644754],[106.129331,28.640041],[106.115659,28.642533],[106.120756,28.632743],[106.103427,28.636097],[106.09821,28.654907],[106.083039,28.661387],[106.090295,28.669454],[106.080461,28.686309],[106.066429,28.692516],[106.066969,28.686173],[106.043163,28.693558],[106.030811,28.695053],[106.036087,28.706242],[106.022955,28.708145],[106.028892,28.719695],[106.017918,28.722639],[106.008924,28.738218],[105.99951,28.742928],[105.979242,28.74655],[105.967789,28.761628],[105.96563,28.736045],[105.954597,28.724632],[105.955916,28.713852],[105.942304,28.71041],[105.93337,28.702301],[105.935588,28.681914],[105.921916,28.679015],[105.903568,28.669227],[105.889476,28.670496],[105.891935,28.651326],[105.901049,28.648562],[105.895652,28.643712],[105.893733,28.623903],[105.890256,28.621409],[105.905906,28.611027],[105.893434,28.605722],[105.885039,28.595475],[105.876164,28.602911],[105.859494,28.597923],[105.8505,28.606312],[105.835988,28.59942],[105.798391,28.603183],[105.784959,28.611118],[105.778483,28.59883],[105.757676,28.59035],[105.757256,28.602231],[105.748801,28.615153],[105.737708,28.614201],[105.720678,28.590622],[105.713003,28.586586],[105.699931,28.5923],[105.693155,28.588582],[105.691835,28.56468],[105.683381,28.557876],[105.68464,28.534557],[105.671208,28.536281],[105.664492,28.523803],[105.650101,28.522986],[105.642245,28.517586],[105.623897,28.518131],[105.627974,28.507829],[105.619399,28.484],[105.614662,28.484227],[105.609325,28.472196],[105.619279,28.464024],[105.611964,28.45517],[105.612563,28.438913],[105.631872,28.432147],[105.643265,28.431511],[105.648302,28.407846],[105.642725,28.397715],[105.650281,28.389537],[105.652739,28.372407],[105.660175,28.365272],[105.654898,28.362364],[105.65178,28.34282],[105.639487,28.324227],[105.639967,28.311042],[105.649921,28.31909],[105.658196,28.310633],[105.670548,28.30986],[105.683021,28.295582],[105.688597,28.284349],[105.705087,28.279846],[105.711264,28.281711],[105.730032,28.272159],[105.738547,28.277299],[105.735249,28.291671],[105.740706,28.304858],[105.761333,28.30936],[105.786638,28.308814],[105.771287,28.319453],[105.771347,28.328819],[105.785679,28.336501],[105.792814,28.329455],[105.797672,28.312361],[105.808405,28.307223],[105.823396,28.306904],[105.83395,28.283348],[105.85002,28.254237],[105.863212,28.249187],[105.874185,28.254601],[105.875804,28.244865],[105.890555,28.236266],[105.881021,28.211829],[105.871007,28.201953],[105.860274,28.170042],[105.860993,28.158158],[105.868609,28.146729],[105.878563,28.139033],[105.876044,28.128239],[105.895173,28.119767],[105.903687,28.129195],[105.927193,28.135435],[105.936967,28.132247],[105.945242,28.143541],[105.963291,28.137894],[105.970787,28.131245],[105.976124,28.10806],[105.985358,28.108379],[105.986198,28.116032],[106.013241,28.119949],[106.020617,28.109153],[106.033869,28.106966],[106.036567,28.110702],[106.027213,28.131245],[106.037646,28.138349],[106.060912,28.142949],[106.071826,28.151237],[106.093593,28.162666],[106.112841,28.163577],[106.125074,28.167083],[106.145221,28.162848],[106.177302,28.148596],[106.191633,28.136755],[106.207104,28.134251],[106.211541,28.119083],[106.226232,28.115895],[106.231449,28.097992],[106.249918,28.09257],[106.254655,28.079493],[106.266708,28.066551],[106.265509,28.04987],[106.256754,28.048503],[106.243202,28.029084],[106.24626,28.011987],[106.268927,28.003323],[106.283018,28.007199],[106.294351,28.003643],[106.301847,27.989916],[106.315818,27.979518],[106.317377,27.967659],[106.325173,27.962595],[106.328111,27.952879],[106.314019,27.938507],[106.308023,27.936728],[106.309222,27.913592],[106.300348,27.908709],[106.304905,27.899352],[106.325772,27.897937],[106.333328,27.887987],[106.325892,27.879313],[106.338185,27.875341],[106.339984,27.865343],[106.334287,27.855115],[106.317078,27.838767],[106.319416,27.832007],[106.32997,27.82575],[106.344241,27.826846],[106.341843,27.820178],[106.321515,27.809398],[106.306944,27.808667],[106.268507,27.782168],[106.242423,27.767317],[106.23115,27.767317],[106.224673,27.760965],[106.206564,27.76293],[106.193492,27.754384],[106.179341,27.761925],[106.165249,27.763158],[106.143602,27.77376],[106.127532,27.77865],[106.105825,27.779929],[106.079321,27.77568],[106.063731,27.777142],[106.059054,27.770607],[106.062412,27.763341],[106.023015,27.746979],[106.004067,27.746842],[105.985418,27.749767],[105.968568,27.740763],[105.929952,27.728192],[105.921317,27.747025],[105.905187,27.745151],[105.891275,27.736283],[105.881921,27.73866],[105.868249,27.732535],[105.860454,27.716305],[105.842884,27.705332],[105.831191,27.70995],[105.813802,27.71123],[105.78418,27.719094],[105.76763,27.717951],[105.722837,27.705881],[105.719119,27.692162],[105.721038,27.684845],[105.702029,27.676887],[105.685479,27.678488],[105.677864,27.68329],[105.664372,27.683931],[105.655018,27.677162],[105.643085,27.659963],[105.628993,27.66097],[105.623837,27.666139],[105.622637,27.680821],[105.609985,27.691979],[105.602849,27.704692],[105.605308,27.715437],[105.580783,27.721472],[105.559975,27.719963],[105.549302,27.727186],[105.537489,27.753744],[105.522738,27.758131],[105.517761,27.764895],[105.492876,27.772755],[105.477105,27.774857],[105.458217,27.767866],[105.448623,27.775314],[105.440168,27.775223],[105.430573,27.76261],[105.421459,27.768368],[105.394415,27.761193],[105.393096,27.750499],[105.384761,27.757491],[105.373608,27.754978],[105.367791,27.748808],[105.35382,27.748853],[105.339968,27.729106],[105.327016,27.727049],[105.318681,27.714248],[105.301352,27.696049],[105.301352,27.682787],[105.308967,27.67085],[105.309866,27.654977],[105.30387,27.639788],[105.294995,27.6332],[105.30327,27.626336],[105.305129,27.613615],[105.290618,27.604325],[105.274967,27.589816],[105.257038,27.582904],[105.251761,27.573473],[105.244026,27.572603],[105.250502,27.565416],[105.240488,27.558731],[105.242767,27.551359],[105.232333,27.546322],[105.234732,27.540186],[105.246784,27.545223],[105.256978,27.540873],[105.253141,27.536202],[105.259917,27.514768],[105.249783,27.505011],[105.248463,27.495482],[105.235871,27.490534],[105.233652,27.475873],[105.238989,27.46987],[105.234132,27.453098],[105.226157,27.441135],[105.232813,27.436322],[105.225857,27.419407],[105.211886,27.399509],[105.194376,27.382818],[105.191078,27.371765],[105.184002,27.367499],[105.184722,27.392448],[105.17231,27.397308],[105.167273,27.408817],[105.157079,27.404828],[105.134892,27.416152],[105.12146,27.418536],[105.099334,27.411384],[105.089859,27.41794],[105.067133,27.41794],[105.057659,27.409367],[105.046925,27.407441],[105.045426,27.396162],[105.032294,27.400564],[105.012086,27.380249],[104.999854,27.372224],[104.970651,27.357638],[104.963995,27.357913],[104.943788,27.346675],[104.937072,27.33704],[104.913146,27.326809],[104.904991,27.307445],[104.894078,27.305518],[104.891919,27.299781],[104.878967,27.297303],[104.871231,27.290877],[104.850544,27.304324],[104.848865,27.32034],[104.85654,27.33259],[104.843888,27.343234],[104.835913,27.343509],[104.826079,27.352317],[104.808629,27.354565],[104.79022,27.330434],[104.789141,27.321074],[104.771032,27.317403],[104.767614,27.33025],[104.754362,27.34539],[104.735653,27.334655],[104.721382,27.342454],[104.694159,27.333508],[104.686183,27.334838],[104.680667,27.323964],[104.664357,27.316715],[104.656381,27.3219],[104.630777,27.317862],[104.612488,27.307216],[104.594799,27.3113],[104.588382,27.323001],[104.570213,27.331718],[104.545388,27.330067],[104.522302,27.354335],[104.522782,27.365069],[104.507671,27.387495],[104.517265,27.400334],[104.504433,27.397171],[104.490881,27.401893],[104.497058,27.414502],[104.467196,27.414273],[104.461319,27.420645],[104.447528,27.426375],[104.435955,27.425963],[104.428999,27.434351],[104.416586,27.435543],[104.409451,27.445306],[104.41017,27.45791],[104.402435,27.455114],[104.362259,27.467854],[104.345349,27.462813],[104.34427,27.452914],[104.332757,27.444023],[104.342651,27.436322],[104.342051,27.427246],[104.335156,27.427705],[104.322383,27.407854],[104.308831,27.407258],[104.295819,27.374654],[104.284066,27.367362],[104.27825,27.372315],[104.279389,27.361766],[104.270455,27.36094],[104.247848,27.336444],[104.249587,27.319743],[104.259901,27.308317],[104.251086,27.30024],[104.230459,27.291245],[104.223383,27.299093],[104.210851,27.297211],[104.219126,27.286792],[104.219186,27.279861],[104.208872,27.278117],[104.190463,27.28771],[104.189923,27.277934],[104.174153,27.263014],[104.149268,27.283901],[104.142432,27.296477],[104.131519,27.306619],[104.134217,27.322313],[104.118866,27.330113],[104.113829,27.338004],[104.083488,27.331535],[104.08037,27.338784],[104.0625,27.347684],[104.057823,27.35562],[104.039534,27.362638],[104.019926,27.377177],[104.019806,27.410972],[104.016448,27.412347],[104.015249,27.429263],[104.006134,27.430134],[103.992643,27.419728],[103.97981,27.417207],[103.975493,27.422845],[103.956484,27.425367],[103.956005,27.433114],[103.943952,27.434306],[103.932439,27.443931],[103.925363,27.413218],[103.91451,27.396666],[103.91331,27.388458],[103.904856,27.38456],[103.903297,27.347959],[103.885727,27.330709],[103.874034,27.330388],[103.872475,27.305105],[103.865579,27.303131],[103.865459,27.281743],[103.845491,27.287527],[103.841414,27.272746],[103.824924,27.264162],[103.802318,27.267284],[103.801358,27.25071],[103.789186,27.253051],[103.791284,27.244052],[103.78157,27.229955],[103.7646,27.212044],[103.749609,27.211309],[103.745832,27.198631],[103.737437,27.185631],[103.728202,27.179153],[103.719508,27.161234],[103.706615,27.157282],[103.711592,27.14253],[103.696182,27.126673],[103.674715,27.131086],[103.661463,27.122996],[103.65019,27.12557],[103.63352,27.120376],[103.624525,27.112193],[103.620448,27.096746],[103.641195,27.089987],[103.653308,27.092562],[103.659844,27.065799],[103.647791,27.065569],[103.628363,27.072651],[103.617929,27.079825],[103.608635,27.065661],[103.601439,27.062166],[103.607136,27.047309],[103.618229,27.034981],[103.623686,27.035349],[103.628123,27.016119],[103.613732,27.009355],[103.622486,27.006824],[103.638617,27.013266],[103.653907,27.022882],[103.655646,27.032037],[103.675614,27.051679],[103.705116,27.049103],[103.71477,27.035533],[103.730661,27.021088],[103.734499,27.004385],[103.744812,26.992651],[103.753447,26.973045],[103.754167,26.963148],[103.775094,26.950949],[103.777193,26.934973],[103.7652,26.916877],[103.763581,26.905547],[103.767659,26.891361],[103.779471,26.875746],[103.774015,26.866946],[103.761962,26.866071],[103.752308,26.860174],[103.730901,26.85575],[103.722206,26.851419],[103.724125,26.84165],[103.71531,26.830682],[103.707335,26.828977],[103.703078,26.815335],[103.705656,26.79473],[103.720407,26.771723],[103.718908,26.761624],[103.724724,26.754061],[103.725444,26.742808],[103.737197,26.728648],[103.749969,26.725926],[103.763761,26.737919],[103.769158,26.73386],[103.773355,26.716885],[103.767778,26.707889],[103.767778,26.697831],[103.759384,26.689433],[103.758484,26.665436],[103.761003,26.649004],[103.74847,26.625599],[103.769697,26.602789],[103.767898,26.581637],[103.79872,26.567318],[103.810952,26.55406],[103.81545,26.532807],[103.820786,26.528648],[103.843813,26.53082],[103.865639,26.512243],[103.887346,26.517604],[103.89742,26.514184],[103.917748,26.513445],[103.925483,26.516726],[103.955165,26.521578],[103.972435,26.516449],[104.000918,26.519684],[104.008713,26.511735],[104.042592,26.514323],[104.052546,26.507206],[104.072035,26.519129],[104.071015,26.541078],[104.064479,26.560389],[104.068557,26.573369],[104.07977,26.580344],[104.093861,26.59637],[104.097879,26.605052],[104.11323,26.623937],[104.121025,26.637787],[104.1296,26.643926],[104.140813,26.641849],[104.160601,26.646788],[104.174333,26.635248],[104.191602,26.63437],[104.205574,26.62583],[104.229859,26.619874],[104.238374,26.627076],[104.248928,26.626845],[104.256783,26.619227],[104.272793,26.621074],[104.274952,26.633724],[104.300616,26.630215],[104.312669,26.612763],[104.328859,26.619458],[104.353205,26.620751],[104.362979,26.631601],[104.365017,26.642726],[104.379888,26.648819],[104.381687,26.663451],[104.398177,26.68588],[104.398837,26.707704],[104.421263,26.712041],[104.423602,26.704936],[104.434156,26.697738],[104.441771,26.686987],[104.44273,26.672589],[104.457901,26.663636],[104.467855,26.644526],[104.459101,26.622044],[104.45952,26.603435],[104.463958,26.595123],[104.487523,26.579559],[104.501615,26.58935],[104.54299,26.584778],[104.556542,26.590412],[104.571413,26.578265],[104.572192,26.569305],[104.579688,26.568057],[104.581667,26.556693],[104.572132,26.540616],[104.570633,26.524628],[104.59234,26.522918],[104.615126,26.508962],[104.620883,26.497222],[104.638572,26.478132],[104.631856,26.461627],[104.632216,26.451825],[104.64211,26.439108],[104.664836,26.434946],[104.664836,26.419453],[104.668794,26.409878],[104.665376,26.396232],[104.680966,26.378743],[104.684025,26.369628],[104.679527,26.363474],[104.670533,26.364816],[104.65908,26.355792],[104.659499,26.335567],[104.645888,26.330244],[104.621962,26.328994],[104.613807,26.322699],[104.5918,26.317097],[104.581547,26.295013],[104.568534,26.281678],[104.555342,26.273527],[104.54203,26.253102],[104.549886,26.216134],[104.538673,26.207145],[104.539452,26.197043],[104.528659,26.175215],[104.519484,26.168077],[104.518884,26.132843],[104.5265,26.121715],[104.52668,26.100336],[104.516366,26.085215],[104.508451,26.082896],[104.499276,26.07051],[104.479368,26.077469],[104.466836,26.08721],[104.45994,26.085865],[104.455503,26.076958],[104.472772,26.053298],[104.468815,26.033623],[104.462399,26.029632],[104.470494,26.00949],[104.462159,25.996864],[104.462459,25.985955],[104.44399,25.959861],[104.441531,25.948902],[104.446568,25.942865],[104.438353,25.927724],[104.420244,25.918573],[104.414548,25.909886],[104.418445,25.892743],[104.430918,25.896739],[104.435715,25.89265],[104.437514,25.875737],[104.441891,25.869138],[104.429658,25.858031],[104.423602,25.842182],[104.430918,25.825773],[104.428099,25.818428],[104.416167,25.81164],[104.411489,25.796994],[104.402675,25.79811],[104.403814,25.786578],[104.397938,25.761556],[104.391102,25.760905],[104.385525,25.746066],[104.373113,25.731598],[104.365497,25.730388],[104.351945,25.73974],[104.353145,25.745508],[104.328859,25.760486],[104.324602,25.748951],[104.3276,25.737088],[104.322263,25.732668],[104.323463,25.703401],[104.316267,25.683901],[104.314948,25.666306],[104.308532,25.660534],[104.31171,25.647126],[104.324722,25.640701],[104.314468,25.631016],[104.331018,25.615602],[104.329759,25.603586],[104.335455,25.59809],[104.36046,25.599627],[104.369515,25.593619],[104.368495,25.577548],[104.381807,25.58598],[104.389123,25.595482],[104.412809,25.585374],[104.421743,25.584675],[104.428399,25.576057],[104.423182,25.563805],[104.434216,25.555465],[104.436134,25.520422],[104.431637,25.504248],[104.418685,25.499353],[104.430318,25.48672],[104.434695,25.47222],[104.446448,25.476463],[104.449686,25.495065],[104.483566,25.494785],[104.499396,25.507231],[104.507791,25.509655],[104.515646,25.521587],[104.524521,25.526807],[104.547787,25.516646],[104.54359,25.524896],[104.549406,25.529836],[104.557021,25.524103],[104.553304,25.515388],[104.556002,25.503828],[104.551145,25.485415],[104.551205,25.473852],[104.543649,25.464014],[104.545688,25.444941],[104.544249,25.419522],[104.538852,25.410145],[104.54329,25.400815],[104.560859,25.394797],[104.567755,25.402914],[104.593599,25.387845],[104.591261,25.384812],[104.616026,25.364606],[104.636114,25.365166],[104.645828,25.356813],[104.647327,25.343791],[104.645768,25.316389],[104.652843,25.304998],[104.640071,25.298928],[104.641031,25.294819],[104.662018,25.284826],[104.671192,25.293464],[104.70789,25.296219],[104.709569,25.28179],[104.729777,25.273664],[104.735893,25.267873],[104.75718,25.266378],[104.754182,25.275906],[104.766475,25.276513],[104.779967,25.270021],[104.788482,25.256757],[104.796637,25.253534],[104.805991,25.262829],[104.817384,25.261054],[104.827998,25.237091],[104.810128,25.231718],[104.80821,25.215786],[104.815825,25.198357],[104.808629,25.190318],[104.823021,25.171296],[104.818643,25.160171],[104.804732,25.161667],[104.787582,25.179242],[104.777328,25.186393],[104.767194,25.204431],[104.750644,25.215039],[104.74081,25.206581],[104.731936,25.204945],[104.72456,25.195693],[104.734634,25.182233],[104.732355,25.16779],[104.718864,25.152691],[104.718264,25.14091],[104.696377,25.123376],[104.693139,25.102894],[104.686303,25.095691],[104.686483,25.076233],[104.671013,25.066783],[104.647267,25.061684],[104.619564,25.060655],[104.635934,25.054713],[104.652064,25.058924],[104.673711,25.05855],[104.683785,25.054854],[104.700575,25.036325],[104.706871,25.010118],[104.712987,24.996216],[104.700695,24.994765],[104.685224,24.985497],[104.687023,24.974963],[104.663457,24.963118],[104.663937,24.951084],[104.651284,24.940314],[104.651404,24.934601],[104.638692,24.918255],[104.635394,24.903922],[104.618724,24.893944],[104.60829,24.892351],[104.596298,24.88448],[104.587003,24.872907],[104.570993,24.844088],[104.562358,24.839026],[104.539812,24.813855],[104.541431,24.804901],[104.537113,24.793274],[104.544969,24.777754],[104.540471,24.764905],[104.54239,24.755807],[104.528659,24.736811],[104.529438,24.731416],[104.55858,24.727804],[104.574351,24.714059],[104.594019,24.710306],[104.599776,24.696042],[104.628798,24.661174],[104.632995,24.659203],[104.666095,24.656903],[104.697936,24.649392],[104.703633,24.645825],[104.698956,24.632728],[104.70897,24.624183],[104.729477,24.61822],[104.743389,24.622258],[104.751304,24.647139],[104.764256,24.657043],[104.803173,24.665726],[104.810608,24.671687],[104.822961,24.670373],[104.841909,24.676192],[104.860438,24.701532],[104.866255,24.730666],[104.875729,24.73986],[104.899354,24.752946],[104.982524,24.770439],[105.017063,24.785303],[105.033373,24.787788],[105.034153,24.795431],[105.026777,24.81559],[105.037751,24.834058],[105.041708,24.853976],[105.036911,24.865644],[105.03883,24.873001],[105.070431,24.894974],[105.075168,24.916709],[105.100293,24.931182],[105.108988,24.939424],[105.125238,24.946214],[105.132494,24.961386],[105.145506,24.964663],[105.157259,24.958857],[105.178486,24.985403],[105.195995,24.994672],[105.212665,24.995374],[105.215244,24.981283],[105.231134,24.980909],[105.234792,24.9656],[105.251522,24.967426],[105.263994,24.956235],[105.257638,24.942094],[105.265493,24.930198],[105.280064,24.929449],[105.308847,24.923969],[105.333972,24.926358],[105.339009,24.933383],[105.365633,24.943498],[105.391837,24.941625],[105.428175,24.930713],[105.443166,24.921862],[105.448503,24.910714],[105.456598,24.877874],[105.470989,24.852664],[105.484481,24.8469],[105.492816,24.833355],[105.493236,24.816668],[105.497493,24.809355],[105.523337,24.801573],[105.544325,24.798525],[105.572867,24.797306],[105.590557,24.807573],[105.607646,24.803729],[105.614362,24.785585],[105.626115,24.777191],[105.650401,24.772174],[105.678284,24.775597],[105.705687,24.768469],[105.725055,24.755432],[105.737768,24.74244],[105.758935,24.734935],[105.766251,24.720345],[105.795213,24.704816],[105.805467,24.701532],[105.827593,24.702939],[105.856076,24.716874],[105.864111,24.729493],[105.880841,24.730431],[105.892294,24.722785],[105.904947,24.725224],[105.942004,24.724802],[105.946502,24.703972],[105.953038,24.688112],[105.961852,24.677553],[105.985838,24.661409],[105.990095,24.649252],[106.014321,24.63423],[106.023195,24.632352],[106.039265,24.655588],[106.046221,24.673142],[106.047061,24.684076],[106.065829,24.697262],[106.084118,24.705192],[106.09725,24.705942],[106.113561,24.714059],[106.119017,24.725131],[106.133588,24.729822],[106.138865,24.737092],[106.143243,24.756698],[106.149899,24.762842],[106.170226,24.758339],[106.188036,24.790789],[106.185217,24.801151],[106.19733,24.813433],[106.200328,24.839776],[106.206085,24.851071],[106.204046,24.861427],[106.19649,24.872064],[106.19751,24.885792],[106.192113,24.896989],[106.182339,24.903734],[106.167648,24.924719],[106.16429,24.93446],[106.149899,24.944435],[106.145341,24.954034],[106.153017,24.960964],[106.175383,24.95675],[106.183238,24.951693],[106.191633,24.953426],[106.19691,24.963118],[106.215379,24.981845],[106.228211,24.980207],[106.242183,24.972107],[106.253756,24.971218],[106.261491,24.977351],[106.278581,24.97927],[106.304965,24.974074],[106.316358,24.983109],[106.332488,24.988493],[106.353655,24.990225],[106.369906,24.998838],[106.388674,25.00539],[106.406064,25.005624],[106.41164,25.012177],[106.435746,25.017746],[106.44528,25.022333],[106.449957,25.033236],[106.463569,25.040302],[106.512499,25.051111],[106.522573,25.05986],[106.530968,25.072537],[106.551296,25.082829],[106.578939,25.083671],[106.590632,25.087787],[106.597108,25.104905],[106.614318,25.116362],[106.629309,25.121412],[106.640522,25.135066],[106.639023,25.157273],[106.645019,25.164846],[106.667506,25.170595],[106.691131,25.179242],[106.705523,25.176157],[106.722433,25.161854],[106.732147,25.162321],[106.764647,25.183121],[106.772382,25.181392],[106.787553,25.170875],[106.798107,25.170455],[106.836364,25.179476],[106.852734,25.186954],[106.888292,25.182186],[106.900225,25.194478],[106.900225,25.212702],[106.904123,25.231531],[106.912997,25.243024],[106.933265,25.250451],[106.955272,25.246247],[106.976079,25.232933],[106.995867,25.239613],[106.998326,25.244145],[106.987472,25.255776],[106.99137,25.263109],[107.013736,25.275346],[107.009959,25.290289],[107.013377,25.295519],[107.00744,25.308079],[107.014276,25.344818],[107.010918,25.354946],[106.986933,25.359753],[106.979497,25.37408],[106.979797,25.388125],[106.97416,25.40702],[106.967804,25.409492],[106.968884,25.425959],[106.963727,25.437339],[106.981896,25.448159],[106.996467,25.442702],[107.003842,25.462102],[107.0075,25.479447],[107.019073,25.497395],[107.039761,25.503316],[107.055651,25.503968],[107.070102,25.511752],[107.0746,25.52126],[107.064166,25.543303],[107.064526,25.559518],[107.093428,25.569815],[107.122331,25.564737],[107.160708,25.570281],[107.165984,25.574334],[107.185233,25.57834],[107.187272,25.590917],[107.199744,25.603819],[107.211197,25.609175],[107.228647,25.60489],[107.236022,25.585328],[107.230206,25.564783],[107.237641,25.551644],[107.263905,25.543164],[107.296106,25.520468],[107.307739,25.500239],[107.313495,25.504947],[107.328666,25.494552],[107.32219,25.493433],[107.321231,25.484575],[107.330165,25.473199],[107.332744,25.446713],[107.325308,25.442516],[107.325728,25.434727],[107.315114,25.42969],[107.308398,25.433141],[107.308998,25.409166],[107.314874,25.402634],[107.344377,25.403661],[107.353911,25.395496],[107.364644,25.394983],[107.367223,25.403894],[107.375798,25.412058],[107.386411,25.410612],[107.402422,25.393723],[107.42089,25.39307],[107.423829,25.383879],[107.413035,25.372773],[107.408538,25.36022],[107.409138,25.347152],[107.428686,25.313448],[107.432703,25.289122],[107.449073,25.287534],[107.47096,25.300795],[107.481574,25.300188],[107.490089,25.2767],[107.470001,25.232092],[107.474618,25.225972],[107.472279,25.21373],[107.479235,25.211207],[107.5046,25.210693],[107.50448,25.217608],[107.513115,25.21658],[107.518331,25.207609],[107.52151,25.221486],[107.541478,25.22457],[107.543336,25.234848],[107.55407,25.239567],[107.558927,25.246901],[107.583572,25.256056],[107.590828,25.24905],[107.599402,25.250965],[107.593766,25.262829],[107.605639,25.255215],[107.608937,25.266051],[107.614993,25.268107],[107.614393,25.27698],[107.631963,25.310133],[107.643416,25.314849],[107.659666,25.316296],[107.6689,25.307472],[107.658347,25.293371],[107.661885,25.258952],[107.66998,25.244425],[107.690547,25.228168],[107.696244,25.219851],[107.694625,25.197889],[107.700621,25.194151],[107.710395,25.20345],[107.742116,25.240221],[107.75297,25.240875],[107.762144,25.228962],[107.756388,25.199899],[107.759985,25.188636],[107.782712,25.170455],[107.789488,25.154748],[107.778814,25.134926],[107.762684,25.124499],[107.76898,25.117531],[107.778634,25.124779],[107.794465,25.116128],[107.806817,25.124826],[107.819529,25.129174],[107.841896,25.115941],[107.86786,25.129408],[107.872417,25.141611],[107.897662,25.144837],[107.898082,25.148905],[107.915411,25.156805],[107.928604,25.155824],[107.95049,25.174194],[107.969139,25.177886],[107.989107,25.18686],[108.001939,25.196534],[108.010754,25.195272],[108.053628,25.199572],[108.080612,25.193777],[108.114911,25.210226],[108.121747,25.231017],[108.13374,25.234381],[108.134759,25.259699],[108.143334,25.269788],[108.137038,25.278148],[108.135958,25.297854],[108.14951,25.310367],[108.152088,25.324419],[108.137817,25.336509],[108.136618,25.343138],[108.152148,25.353732],[108.155267,25.377953],[108.142794,25.390644],[108.153827,25.39475],[108.165101,25.391577],[108.18255,25.391577],[108.193284,25.405527],[108.185728,25.413364],[108.190585,25.418915],[108.170617,25.431835],[108.165041,25.427404],[108.157605,25.439018],[108.162462,25.444754],[108.192624,25.459071],[108.202998,25.451703],[108.221407,25.450071],[108.226264,25.437246],[108.225844,25.426985],[108.252048,25.430483],[108.252408,25.438458],[108.236098,25.449371],[108.240715,25.461915],[108.260923,25.473759],[108.28107,25.480006],[108.299239,25.501125],[108.305416,25.516227],[108.303257,25.520748],[108.316689,25.531514],[108.344692,25.537339],[108.352487,25.533098],[108.351828,25.524709],[108.359563,25.513477],[108.38139,25.500659],[108.392543,25.498561],[108.400338,25.491382],[108.415089,25.461682],[108.418987,25.443355],[108.433438,25.436406],[108.443153,25.449978],[108.4633,25.454315],[108.471815,25.458884],[108.488365,25.456366],[108.500358,25.447832],[108.507374,25.432955],[108.51385,25.42871],[108.511271,25.41439],[108.524224,25.418355],[108.544371,25.407999],[108.543952,25.403661],[108.564039,25.384345],[108.56248,25.37408],[108.585866,25.366007],[108.594381,25.347525],[108.589044,25.335342],[108.613869,25.309853],[108.625202,25.308126],[108.624903,25.324326],[108.63006,25.335903],[108.615368,25.365773],[108.623883,25.377299],[108.622264,25.389758],[108.613869,25.407253],[108.59588,25.407533],[108.587665,25.421387],[108.600318,25.432488],[108.598878,25.454828],[108.611531,25.479633],[108.621365,25.468024],[108.633178,25.464433],[108.628261,25.477955],[108.620405,25.476696],[108.618127,25.484342],[108.607453,25.492081],[108.621185,25.49278],[108.622204,25.502896],[108.631319,25.508396],[108.632878,25.518884],[108.654585,25.530069],[108.66304,25.526014],[108.667717,25.532213],[108.682468,25.521027],[108.690443,25.51893],[108.687325,25.535242],[108.658183,25.551831],[108.665918,25.562361],[108.659921,25.573449],[108.660941,25.584815],[108.672814,25.590172],[108.683787,25.586119],[108.690443,25.596274],[108.689723,25.604285],[108.682408,25.605868],[108.689004,25.623193],[108.703695,25.625521],[108.714489,25.623472],[108.723363,25.634508],[108.76198,25.637767],[108.765518,25.632087],[108.784046,25.628268],[108.786565,25.620818],[108.780269,25.601816],[108.79484,25.593992],[108.799157,25.576011],[108.786925,25.572144],[108.781288,25.554347],[108.789143,25.554673],[108.798078,25.546705],[108.800117,25.538038],[108.812709,25.52634],[108.826501,25.55006],[108.830338,25.546798],[108.855943,25.548383],[108.851566,25.554626],[108.867336,25.55854],[108.876211,25.553368],[108.890422,25.556257],[108.888923,25.544841],[108.897498,25.54088],[108.913088,25.543769],[108.931737,25.556397],[108.937913,25.553601],[108.952425,25.55635],[108.972453,25.542511],[108.972872,25.531793],[108.989662,25.533704],[109.011069,25.519256],[109.025101,25.512498],[109.044169,25.527972],[109.055502,25.525548],[109.066836,25.538737],[109.077329,25.53622],[109.088542,25.549501],[109.07559,25.553089],[109.067795,25.561848],[109.052204,25.566833],[109.046328,25.5748],[109.04243,25.608896],[109.046628,25.618862],[109.031217,25.629526],[109.041891,25.638978],[109.04297,25.656949],[109.049506,25.66058],[109.057481,25.679805],[109.07523,25.693861],[109.071932,25.708194],[109.079128,25.720711],[109.054303,25.732203],[109.055862,25.738111],[109.04285,25.737693],[109.036914,25.724526],[109.030557,25.722712],[109.003214,25.736344],[109.001355,25.724526],[108.983906,25.720571],[108.974551,25.700422],[108.958181,25.691347],[108.948407,25.676686],[108.929399,25.68418],[108.919565,25.677757],[108.900316,25.682365],[108.895099,25.703401],[108.896239,25.71415],[108.912129,25.718338],[108.911409,25.724759],[108.929758,25.732575],[108.940252,25.740112],[108.953864,25.730761],[108.963578,25.732529],[108.95956,25.740112],[108.964238,25.745089],[108.979588,25.745322],[108.989722,25.762998],[109.000036,25.760579],[108.989602,25.778951],[108.997697,25.784392],[109.011789,25.779509],[109.016766,25.790902],[109.031337,25.793925],[109.048187,25.790577],[109.077869,25.776765],[109.080567,25.78867],[109.087643,25.795831],[109.098257,25.795134],[109.094779,25.802295],[109.117985,25.809408],[109.135134,25.805456],[109.143589,25.795273],[109.143829,25.77723],[109.132316,25.762952],[109.148266,25.741833],[109.155342,25.744717],[109.15924,25.759044],[109.182805,25.763277],[109.19108,25.774533],[109.177948,25.782067],[109.182266,25.788903],[109.166136,25.796296],[109.17543,25.804898],[109.193059,25.800109],[109.206671,25.788112],[109.204992,25.773928],[109.209429,25.747508],[109.206971,25.740251],[109.217285,25.736762],[109.234194,25.736344],[109.247686,25.728248],[109.254762,25.728574],[109.256381,25.71978],[109.280486,25.713964],[109.296677,25.714197],[109.313886,25.72206],[109.314906,25.73318],[109.34009,25.731738],[109.34147,25.746904],[109.338411,25.755277],[109.327858,25.761417],[109.334154,25.772021],[109.329117,25.784206],[109.336313,25.7896],[109.339731,25.802527],[109.337092,25.811175],[109.339311,25.833769],[109.349025,25.838836],[109.358979,25.836047],[109.369053,25.842647],[109.37373,25.853291],[109.388661,25.870765],[109.391359,25.891256],[109.396756,25.900316],[109.413246,25.905612],[109.425719,25.91639],[109.434353,25.932322],[109.432015,25.947787],[109.426018,25.955171],[109.40683,25.961068],[109.408509,25.96729],[109.454381,25.991386],[109.468413,26.000531],[109.482624,26.029632],[109.479146,26.047776],[109.466254,26.048658],[109.453842,26.05404],[109.447545,26.071763],[109.450963,26.075984],[109.449704,26.10182],[109.459838,26.093471],[109.474409,26.099037],[109.504091,26.096857],[109.512726,26.115501],[109.514105,26.128253],[109.504991,26.134142],[109.495217,26.15264],[109.494437,26.144991],[109.480106,26.145593],[109.467513,26.162329],[109.471771,26.169931],[109.459298,26.194077],[109.470452,26.196348],[109.468293,26.203207],[109.452402,26.209647],[109.43963,26.238835],[109.453422,26.264543],[109.458339,26.283437],[109.476868,26.299227],[109.466134,26.314135],[109.460138,26.31381],[109.443528,26.302005],[109.442628,26.289874],[109.429796,26.286679],[109.421041,26.288716],[109.401493,26.283715],[109.391179,26.277093],[109.37325,26.278205],[109.354362,26.265284],[109.339791,26.26408],[109.334754,26.276676],[109.32336,26.282465],[109.32492,26.290337],[109.306451,26.290707],[109.297636,26.297236],[109.285883,26.295847],[109.27449,26.315431],[109.271432,26.327744],[109.277308,26.34001],[109.292599,26.345333],[109.299015,26.368194],[109.313586,26.397388],[109.319583,26.41862],[109.326838,26.427963],[109.361018,26.44831],[109.37355,26.449466],[109.380986,26.461766],[109.362457,26.46625],[109.364076,26.475913],[109.385483,26.493525],[109.381705,26.518482],[109.404312,26.529665],[109.408749,26.537058],[109.403952,26.560204],[109.395197,26.566441],[109.399035,26.570967],[109.385483,26.571014],[109.39022,26.582238],[109.387162,26.588057],[109.391299,26.600526],[109.384703,26.604728],[109.378707,26.622459],[109.364376,26.633447],[109.355141,26.65902],[109.334094,26.646234],[109.304232,26.663128],[109.287022,26.689664],[109.283724,26.698569],[109.292959,26.701291],[109.298416,26.696539],[109.319103,26.701752],[109.335593,26.699999],[109.355021,26.693217],[109.364975,26.69617],[109.37301,26.705028],[109.385963,26.712133],[109.381285,26.727449],[109.40707,26.719837],[109.413966,26.722236],[109.417743,26.739764],[109.437711,26.755214],[109.453962,26.761209],[109.486702,26.760149],[109.476568,26.829899],[109.466914,26.831927],[109.452642,26.861832],[109.436452,26.861141],[109.444847,26.871738],[109.438551,26.877404],[109.436452,26.892605],[109.446586,26.899652],[109.458219,26.901863],[109.471771,26.911166],[109.484243,26.913561],[109.493238,26.921113],[109.514105,26.930783],[109.526698,26.925902],[109.533653,26.938611],[109.555,26.946898],[109.546725,26.984597],[109.536831,26.974656],[109.527597,26.977187],[109.529276,26.991823],[109.540609,26.994124],[109.541329,27.012898],[109.525798,27.026563],[109.525019,27.037282],[109.517943,27.043216],[109.518842,27.060004],[109.510447,27.067914],[109.518483,27.072559],[109.505051,27.072743],[109.498455,27.079365],[109.48982,27.078629],[109.486762,27.067409],[109.496176,27.062488],[109.487062,27.053933],[109.468293,27.064787],[109.454561,27.069478],[109.481425,27.071272],[109.482444,27.081113],[109.466014,27.080515],[109.459598,27.084101],[109.467393,27.094861],[109.457919,27.096516],[109.459598,27.108286],[109.469372,27.115457],[109.47267,27.134901],[109.457559,27.133338],[109.448325,27.12056],[109.440889,27.118169],[109.427937,27.12603],[109.415285,27.153881],[109.400234,27.152411],[109.400834,27.159579],[109.392799,27.156087],[109.393158,27.143863],[109.384583,27.143909],[109.378167,27.155444],[109.37397,27.147815],[109.358739,27.15287],[109.333674,27.148734],[109.335053,27.139083],[109.298955,27.135268],[109.280546,27.127133],[109.264236,27.131867],[109.2574,27.150618],[109.248106,27.153422],[109.238932,27.149148],[109.223041,27.12249],[109.195937,27.091275],[109.185504,27.082308],[109.17525,27.087228],[109.163557,27.065799],[109.154263,27.071961],[109.141071,27.073571],[109.130517,27.065063],[109.101135,27.068926],[109.10917,27.092516],[109.118944,27.105205],[109.131057,27.110125],[109.133995,27.117756],[109.122962,27.123364],[109.111389,27.12318],[109.097237,27.116101],[109.080387,27.116514],[109.066955,27.104516],[109.061978,27.1104],[109.053703,27.098309],[109.035834,27.098079],[109.032536,27.10378],[109.018805,27.095826],[109.016106,27.086768],[109.007531,27.080239],[108.989602,27.074077],[108.964238,27.054485],[108.940432,27.044734],[108.94313,27.037374],[108.950986,27.036913],[108.951945,27.018741],[108.936774,27.011794],[108.921363,27.009769],[108.921004,27.029783],[108.914947,27.025965],[108.918485,27.019063],[108.900616,27.016947],[108.885025,27.002913],[108.872853,26.999876],[108.878429,27.006364],[108.87735,27.016257],[108.868535,27.031025],[108.854744,27.031991],[108.84395,27.047953],[108.845629,27.058026],[108.840952,27.06304],[108.831178,27.057888],[108.803834,27.078859],[108.792261,27.083274],[108.807492,27.098585],[108.82728,27.089343],[108.845869,27.098493],[108.854324,27.09601],[108.859961,27.11486],[108.873512,27.11394],[108.878789,27.106309],[108.887484,27.112515],[108.887124,27.121203]]],[[[105.081944,24.915632],[105.08926,24.915211],[105.100173,24.924765],[105.098734,24.929121],[105.081944,24.915632]]],[[[109.476568,26.829899],[109.486702,26.760149],[109.502352,26.757705],[109.504631,26.744607],[109.52214,26.749219],[109.516923,26.757705],[109.517523,26.77993],[109.507689,26.801183],[109.497495,26.815289],[109.497315,26.823078],[109.513146,26.840268],[109.510387,26.865518],[109.513805,26.874271],[109.490839,26.883623],[109.486822,26.895323],[109.474169,26.894309],[109.47291,26.884774],[109.45672,26.873212],[109.452642,26.861832],[109.466914,26.831927],[109.482085,26.837042],[109.476568,26.829899]]],[[[109.577367,26.751617],[109.570411,26.747928],[109.558059,26.754661],[109.561537,26.742209],[109.553921,26.73529],[109.534193,26.744561],[109.528437,26.741471],[109.546306,26.731047],[109.547265,26.7179],[109.553381,26.722974],[109.568252,26.726203],[109.578146,26.733307],[109.579046,26.740825],[109.596435,26.760702],[109.577127,26.77057],[109.580365,26.755676],[109.577367,26.751617]]]]}}]}
\ No newline at end of file
No preview for this file type
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论