HomePage.vue 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292
  1. <template>
  2. <div class="home container">
  3. <!-- <div class="affix-container" >
  4. <el-affix :offset="200" >
  5. <div style="padding: 10px;font-size: 14px;height:300px;cursor: pointer;display: flex;justify-content: center;align-items: center;">
  6. <el-steps direction="vertical" :active="activeIndex">
  7. <el-step title="顶部" @click="goAnchor('top')" :icon="Edit"/>
  8. <el-step title="基础能力" @click="goAnchor('jcnl')" :icon="Edit"/>
  9. <el-step title="统建应用" @click="goAnchor('tjyy')" :icon="Edit"/>
  10. <el-step title="应用支撑" @click="goAnchor('yyzc')" :icon="Edit"/>
  11. </el-steps>
  12. </div>
  13. </el-affix>
  14. </div> -->
  15. <div class="part1" id="top">
  16. <div style="margin-left: 10%;">
  17. <div class="super-title">青浦区“一张图”区级节点</div>
  18. <div class="title-sub">以二三维一体化引擎为核心</div>
  19. <div class="title-sub">构建政务时空数据治理与应用服务生态</div>
  20. <div class="title-sub">赋能城市精细化治理</div>
  21. <div class="count-title">调用总数</div>
  22. <div><digitalScrollersComp :val="totalCallNumber" /></div>
  23. <div class="count-title" style="margin: 20px 0px 20px 0px;">
  24. <span class="text1">昨日调用量</span>
  25. <span class="count"><NumberScroll :value="lastDayCall" :duration="2000" /></span>
  26. <span class="text1">次</span>
  27. </div>
  28. <!-- <div class="part1-1">
  29. <div class="part1-1-1">
  30. <span class="text">调用总数</span>
  31. <div class="number-container">
  32. <digitalScrollersComp :val="totalCallNumber" /> -->
  33. <!-- <span v-for="(num, index) in totalCall" :key="index">
  34. <span v-if="num.indexOf(',') > -1">
  35. <span class="separator">,</span>
  36. </span>
  37. <span v-else>
  38. <span class="number-item">
  39. <NumberScroll :value="num" :duration="2000" />
  40. </span>
  41. </span>
  42. </span> -->
  43. <!-- <span class="text">次</span> -->
  44. <!-- </div>
  45. </div>
  46. <div class="part1-1-2">
  47. <div class="call-count-container">
  48. <div class="line"></div>
  49. <div>
  50. <span class="text1">昨日调用量</span>
  51. <span class="count"><NumberScroll :value="lastDayCall" :duration="2000" /></span>
  52. <span class="text2">次</span>
  53. </div>
  54. <div class="line"></div>
  55. </div>
  56. </div>
  57. </div> -->
  58. </div>
  59. </div>
  60. <div class="darkblue-background">
  61. <div class="row">
  62. <div class="radius-container">
  63. <div>
  64. <div class="strong-data text-color"><NumberScroll :value="unitNum" :duration="2000" />个</div>
  65. <div class="font text-desc-color">授权委办数</div>
  66. </div>
  67. </div>
  68. <div class="radius-container">
  69. <div>
  70. <div class="strong-data text-color"><NumberScroll :value="appNum" :duration="2000" />个</div>
  71. <div class="font text-desc-color">授权应用数</div>
  72. </div>
  73. </div>
  74. <div class="radius-container">
  75. <div>
  76. <div class="strong-data text-color"><NumberScroll :value="userNum" :duration="2000" />个</div>
  77. <div class="font text-desc-color">授权用户数</div>
  78. </div>
  79. </div>
  80. </div>
  81. <div class="row" style="margin-top: 50px;margin-bottom: 50px;justify-content: space-between;">
  82. <div class="al-container">
  83. <div class="al-container-border">
  84. <div>
  85. <div class="strong-data text-color"><NumberScroll :value="329" :duration="2000" />个</div>
  86. <div class="font text-color">地图服务</div>
  87. </div>
  88. </div>
  89. </div>
  90. <div class="al-container">
  91. <div class="al-container-border">
  92. <div>
  93. <div class="strong-data text-color"><NumberScroll :value="54" :duration="2000" />个</div>
  94. <div class="font text-color">算法能力</div>
  95. </div>
  96. </div>
  97. </div>
  98. <div class="al-container">
  99. <div class="al-container-border">
  100. <div>
  101. <div class="strong-data text-color"><NumberScroll :value="105" :duration="2000" />个</div>
  102. <div class="font text-color">支撑组件</div>
  103. </div>
  104. </div>
  105. </div>
  106. </div>
  107. <div class="second-title ">
  108. 服务调用趋势(近30天)
  109. </div>
  110. <div id="echart1"></div>
  111. <div class="second-title ">
  112. 平台核心运行清单
  113. </div>
  114. <!--四组统计-->
  115. <div class="row">
  116. <div class="lighter-container" style="flex: 2;">
  117. <div class="third-title ">
  118. <el-icon color="#0071e3" size="30px">
  119. <Stopwatch></Stopwatch>
  120. </el-icon>
  121. <div>基础统计</div>
  122. </div>
  123. <div class="grid-2x2">
  124. <div class="lighter-container middle-container">
  125. <div class="strong-data white"><NumberScroll :value="weekCall" :duration="2000" /></div>
  126. <div class="title-sub white">近一周总调用</div>
  127. </div>
  128. <div class="lighter-container middle-container">
  129. <div class="strong-data white"><NumberScroll :value="monthCall" :duration="2000" /></div>
  130. <div class="title-sub white">近一月总调用</div>
  131. </div>
  132. <div class="lighter-container middle-container">
  133. <div class="strong-data white"><NumberScroll :value="seasonCall" :duration="2000" /></div>
  134. <div class="title-sub white">近三月总调用</div>
  135. </div>
  136. <div class="lighter-container middle-container">
  137. <div class="strong-data white"><NumberScroll :value="yearCall" :duration="2000" /></div>
  138. <div class="title-sub white">近一年总调用</div>
  139. </div>
  140. </div>
  141. </div>
  142. <div class="lighter-container" style="flex: 3;">
  143. <div class="between-row">
  144. <div class="third-title">
  145. <el-icon color="#0071e3" size="30px">
  146. <Histogram />
  147. </el-icon>
  148. <div>委办调用情况</div>
  149. </div>
  150. <span>
  151. <el-button v-show="this.chartMluLevel != 'unit'" text size="large" circle @click="chartMluBack()">
  152. <el-icon color="#0071e3" size="30px">
  153. <Back />
  154. </el-icon>
  155. </el-button>
  156. <el-date-picker v-model="chartMluTimeRange" :clearable="false" type="daterange" range-separator="到" start-placeholder="开始日期"
  157. end-placeholder="结束日期" @change="chartMluFocus()" />
  158. </span>
  159. </div>
  160. <div id="echartMultiLevelUse"></div>
  161. </div>
  162. </div>
  163. <div class="row">
  164. <div class="lighter-container" style="flex: 3;">
  165. <div class="third-title ">
  166. <!-- <el-icon color="#0071e3" size="30px">
  167. <List></List>
  168. </el-icon> -->
  169. <div>热点资源 Top10</div>
  170. </div>
  171. <div class="row">
  172. <div class="top-list" style="flex-grow: 1;">
  173. <div v-for="index in 5" :key="index" class="list-item">
  174. <template v-if="resourceTop[index - 1] != null">
  175. <el-avatar size="small" class="circle-number blue">
  176. {{ index }}
  177. </el-avatar>
  178. <div class="font" style="flex-grow: 100;">{{ resourceTop[index - 1].name }}</div>
  179. <div class="font number-color">{{ resourceTop[index - 1].value }}</div>
  180. </template>
  181. </div>
  182. </div>
  183. <div style="flex-grow: 0.2;"> </div>
  184. <div class="top-list" style="flex-grow: 0.5;">
  185. <div v-for="index in 5" :key="index" class="list-item">
  186. <template v-if="resourceTop[index + 4] != null">
  187. <el-avatar size="small" class="circle-number blue">
  188. {{ index + 5 }}
  189. </el-avatar>
  190. <div class="font" style="flex-grow: 100;">{{ resourceTop[index + 4].name }}</div>
  191. <div class="font number-color">{{ resourceTop[index + 4].value }}</div>
  192. </template>
  193. </div>
  194. </div>
  195. </div>
  196. </div>
  197. <div class="lighter-container" style="flex: 2;">
  198. <div class="third-title ">
  199. <!-- <el-icon color="#0071e3" size="30px">
  200. <School />
  201. </el-icon> -->
  202. <div>委办调用 Top5</div>
  203. </div>
  204. <div class="top-list">
  205. <div v-for="index in 5" :key="index" class="list-item">
  206. <template v-if="userTop[index - 1] != null">
  207. <el-avatar size="small" class="circle-number blue">
  208. {{ index }}
  209. </el-avatar>
  210. <div class="font" style="flex-grow: 100;">{{ userTop[index - 1].name }}</div>
  211. <div class="font number-color">{{ userTop[index - 1].value }}</div>
  212. </template>
  213. </div>
  214. </div>
  215. </div>
  216. </div>
  217. <!-- <div class="title " style="margin-top:90px ;" id="yyal">应用案例</div>
  218. <div class="title-sub ">技术创新与政务需求深度融合,打造高效、安全、可扩展的时空数据安全平台</div>
  219. <div class="row" style="margin-top: 90px;justify-content: space-between;">
  220. <div class="al-container">
  221. <div class="al-container-border">
  222. <div>
  223. <div class="strong-data text-color"><NumberScroll :value="3212560" :duration="2000" />次</div>
  224. <div class="font text-color">地名地址</div>
  225. </div>
  226. </div>
  227. </div>
  228. <div class="al-container">
  229. <div class="al-container-border">
  230. <div>
  231. <div class="strong-data text-color"><NumberScroll :value="2362106" :duration="2000" />次</div>
  232. <div class="font text-color">坐标转换</div>
  233. </div>
  234. </div>
  235. </div>
  236. <div class="al-container">
  237. <div class="al-container-border">
  238. <div>
  239. <div class="strong-data text-color"><NumberScroll :value="8625997" :duration="2000" />次</div>
  240. <div class="font text-color">地图服务</div>
  241. </div>
  242. </div>
  243. </div>
  244. </div> -->
  245. <!-- <div v-for="useCaseItem in examplelist" :key="useCaseItem.title" :id="useCaseItem.title === '基础能力' ? 'jcnl' : useCaseItem.title === '统建应用' ? 'tjyy' : useCaseItem.title === '应用支撑' ? 'yyzc' : ''">
  246. <div class="title " style="margin-top:90px;margin-bottom: 20px;">{{useCaseItem.title}}</div>
  247. <div class="warp-container">
  248. <div class="warp-page-card" v-for="item in useCaseItem.data" :key="item.title" @click="handleTabsOpenPage(item)">
  249. <div class="warp-page-img" :style="`background-image: url(${item.picture});`"></div>
  250. <div class="warp-page-text">
  251. <div class="warp-page-text-title">{{ item.title }}</div>
  252. <div class="warp-page-text-desc">{{ item.text }}</div>
  253. </div>
  254. </div>
  255. </div>
  256. </div>
  257. <div style="height: 90px;width: 100%;"></div> -->
  258. <!-- <el-tabs v-model="activeUseCase" class="usecase-tabs" @tab-click="handleClick" stretch="true">
  259. <el-tab-pane label="dataProcass" name="dataProcass">
  260. <template #label>
  261. <div class="tab-lab">
  262. <el-icon :color="activeUseCase == 'dataProcass' ? '#0071e3' : '#fff'" size="30px">
  263. <Expand />
  264. </el-icon>
  265. <div :class="activeUseCase == 'dataProcass' ? 'blue' : ''">平台应用</div>
  266. </div>
  267. </template>
  268. </el-tab-pane>
  269. <el-tab-pane label="useInService" name="useInService">
  270. <template #label>
  271. <div class="tab-lab">
  272. <el-icon :color="activeUseCase == 'useInService' ? '#0071e3' : '#fff'" size="30px">
  273. <Location />
  274. </el-icon>
  275. <div :class="activeUseCase == 'useInService' ? 'blue' : ''">业务应用</div>
  276. </div>
  277. </template></el-tab-pane>
  278. <el-tab-pane label="decisionHelping" name="decisionHelping">
  279. <template #label>
  280. <div class="tab-lab">
  281. <el-icon :color="activeUseCase == 'decisionHelping' ? '#0071e3' : '#fff'" size="30px">
  282. <Guide />
  283. </el-icon>
  284. <div :class="activeUseCase == 'decisionHelping' ? 'blue' : ''">特色场景</div>
  285. </div>
  286. </template></el-tab-pane>
  287. </el-tabs>
  288. <div class="warp-row">
  289. <div v-for="useCaseItem in useCase[activeUseCase]" :key="useCaseItem.title" class="use-case"
  290. :style="`background-image: url(${useCaseItem.picture});cursor: pointer;`" @click="handleTabsOpenPage(useCaseItem)">
  291. <div class="use-case-empty"></div>
  292. <div class="use-case-text">
  293. <el-tag v-for="item in useCaseItem.tags" style="margin-right: 5px;" :key="item" color="#e2e4f4" size="lager" effect="dark" round>
  294. <span class="blue">
  295. {{ item }}
  296. </span>
  297. </el-tag>
  298. <span class="third-title">
  299. <span style="padding: 10px 0px;">
  300. {{ useCaseItem.title }}
  301. </span>
  302. </span>
  303. <p class="font grey" style="padding-top: 0px !important;">
  304. {{ useCaseItem.text }}
  305. </p>
  306. </div>
  307. </div>
  308. </div>
  309. -->
  310. <!-- <div class="title " style="margin-top:90px ;" id="hxgn">实践与探索·六大核心功能</div>
  311. <div class="title-sub ">聚焦政务场景痛点,打造从数据治理到应用落地的全链路创新解决方案</div>
  312. <div class="row" style="margin-top: 36px;">
  313. <div class="lightblue-container six-router">
  314. <div class="lightblue-container-boder">
  315. <div class="img-container">
  316. <img
  317. :src="require('@/assets/images/common/gn/1.png')"
  318. mode="scaleToFill"
  319. class="row-warp-page-img"
  320. />
  321. </div>
  322. <div class="font lightgrey">
  323. <p class="lightgrey-title">时空数据管理</p>
  324. <p class="lightgrey-desc">覆盖数据质量检查、加工、管理、服务发布全流程,支持矢量/栅格数据标准化处理,实现多格式转换与瓦片定制,保障数据规范可用。</p>
  325. </div>
  326. </div>
  327. </div>
  328. <div class="lightblue-container six-router">
  329. <div class="lightblue-container-boder">
  330. <div class="img-container">
  331. <img
  332. :src="require('@/assets/images/common/gn/2.png')"
  333. mode="scaleToFill"
  334. class="row-warp-page-img"
  335. />
  336. </div>
  337. <div class="font lightgrey">
  338. <p class="lightgrey-title">二三维一体化引擎</p>
  339. <p class="lightgrey-desc">嵌入式SDK支撑地图交互、空间分析、数据可视化,涵盖热力图/聚合图/迁徙图等多维呈现,实现精准定位与场景切换。</p>
  340. </div>
  341. </div>
  342. </div>
  343. <div class="lightblue-container six-router">
  344. <div class="lightblue-container-boder">
  345. <div class="img-container">
  346. <img
  347. :src="require('@/assets/images/common/gn/3.png')"
  348. mode="scaleToFill"
  349. class="row-warp-page-img"
  350. style="transform: rotate(150deg);"
  351. />
  352. </div>
  353. <div class="font lightgrey">
  354. <p class="lightgrey-title">时空门户</p>
  355. <p class="lightgrey-desc">整合平台访问统计、功能演示、服务导航,提供视频教程与业务场景展示,快速上手平台核心能力,支撑政务场景应用。</p>
  356. </div>
  357. </div>
  358. </div>
  359. </div>
  360. <div class="row" style="margin-bottom: 50px;">
  361. <div class="lightblue-container six-router" style="width: 47%;">
  362. <div class="lightblue-container-boder">
  363. <div class="img-container">
  364. <img
  365. :src="require('@/assets/images/common/gn/4.png')"
  366. mode="scaleToFill"
  367. class="row-warp-page-img"
  368. />
  369. </div>
  370. <div class="font lightgrey">
  371. <p class="lightgrey-title">微功能</p>
  372. <p class="lightgrey-desc">支持拓扑计算、空间量算、几何运算与数据转换,批量处理海量时空数据,适配规划、管理多场景计算需求。</p>
  373. </div>
  374. </div>
  375. </div>
  376. <div class="lightblue-container six-router" style="width: 47%;">
  377. <div class="lightblue-container-boder">
  378. <div class="img-container">
  379. <img
  380. :src="require('@/assets/images/common/gn/5.png')"
  381. mode="scaleToFill"
  382. class="row-warp-page-img"
  383. />
  384. </div>
  385. <div class="font lightgrey">
  386. <p class="lightgrey-title">应用管理</p>
  387. <p class="lightgrey-desc">统一接入各类时空业务应用,管控访问权限与应用信息,实现“接入-访问-管理”全流程闭环,支撑区级特色应用建设。</p>
  388. </div>
  389. </div>
  390. </div>
  391. <div class="lightblue-container six-router">
  392. <div class="lightblue-container-boder">
  393. <div class="img-container">
  394. <img
  395. :src="require('@/assets/images/common/gn/6.png')"
  396. mode="scaleToFill"
  397. class="row-warp-page-img"
  398. />
  399. </div>
  400. <div class="font lightgrey">
  401. <p class="lightgrey-title">运行管理</p>
  402. <p class="lightgrey-desc">实时监控平台运行数据,负责数据全生命周期管理与权限管控,建立四级管理架构,保障系统合规安全运行。</p>
  403. </div>
  404. </div>
  405. </div>
  406. </div> -->
  407. </div>
  408. <!-- <div class="dark-background">
  409. <div class="row">
  410. <img :src="require('@/assets/images/common/home-bg2.png')" />
  411. <div class="col">
  412. <div>
  413. <div class="super-title">多源数据统一治理</div>
  414. <div class="super-title">打破格式与基准壁垒</div>
  415. <p class="grey font">支持矢量、栅格等多格式数据转换,同一坐标/投影基准,通过重复项、逻辑/语义一致性检查,让分散数据规范入库</p>
  416. </div>
  417. </div>
  418. </div>
  419. </div>
  420. <div class="darkblue-background col">
  421. <div class="">
  422. <div class="super-title">强大空间计算能力,秒级响应复杂分析</div>
  423. <p class="font middle">内置拓扑计算、空间量算、几何运算等核心功能,支持非空间数据转空间数据,快速解决区域关联、资源覆盖等分析需求</p>
  424. </div>
  425. </div>
  426. <div class="image-background" :style="`background-Image:url('${require('@/assets/images/common/home-bg3.png')}');`">
  427. </div>
  428. <div class="bluedark-background dense-col">
  429. <div>
  430. <div class="super-title">二三维一体化可视化</div>
  431. <div class="super-title">场景适配更灵活</div>
  432. </div>
  433. <div>
  434. <div class="font middle">
  435. GIS通用计算功能,实用便捷超乎想象!
  436. </div>
  437. <div class="font middle">
  438. 测距、剖面分析及点线面绘制轻松实现,坐标转换精准高效,路径规划快速准确,地名搜索智能推荐
  439. </div>
  440. </div>
  441. </div>
  442. <div class="darkblue-background image-background col"
  443. :style="`background-Image:url('${require('@/assets/images/common/home-bg4.png')}');`">
  444. <div class="row" style="margin-top: auto;">
  445. </div>
  446. </div> -->
  447. <!-- <div class="blue-background col">
  448. <div class="warp-row">
  449. <div class="block-page-router">
  450. <div class="title">
  451. 时空数据治理标准化实践
  452. </div>
  453. <p class="font grey">
  454. 构建“检查-加工-发布”全流程数据治理体系,实现矢量/栅格数据标准化处理、多格式转换与瓦片定制,解决区级时空数据格式不统一、质量参差不齐的通电,为全场景应用构牢数据基础
  455. </p>
  456. <div class="row" style="margin-top: auto;">
  457. <div class="font" style="margin-left: auto;" @click="goto('/sksjgl')">
  458. 了解更多→
  459. </div>
  460. </div>
  461. </div>
  462. <div class="block-page-router">
  463. <div class="title">
  464. 二三维一体化引擎创新应用
  465. </div>
  466. <p class="font grey">
  467. 自研嵌入式 GIS SDK,融合二维地图交互、三维场景渲染能力,创新落地热力图 / 聚合图 / 迁徙图等多维可视化形式,实现区级地理信息 “全景式” 呈现与精准定位。
  468. </p>
  469. <div class="row" style="margin-top: auto;">
  470. <div class="font" style="margin-left: auto;" @click="goto('/skmh/scene')">
  471. 了解更多→
  472. </div>
  473. </div>
  474. </div>
  475. <div class="block-page-router">
  476. <div class="title">
  477. 政务时空门户一体化探索
  478. </div>
  479. <p class="font grey">
  480. 整合平台访问统计、功能演示、视频教程等能力,打造适配青浦区政务场景的时空门户总入口,打通 “一网通办”“一网统管” 数据链路,降低政务人员使用门槛。
  481. </p>
  482. <div class="row" style="margin-top: auto;">
  483. <div class="font" style="margin-left: auto;" @click="goto('/skmh')">
  484. 了解更多→
  485. </div>
  486. </div>
  487. </div>
  488. <div class="block-page-router">
  489. <div class="title">
  490. 空间计算微功能场景化落地
  491. </div>
  492. <p class="font grey">
  493. 聚焦区级规划、管理等实际需求,落地拓扑计算、空间量算、几何运算等轻量化微功能,支持海量时空数据批量处理,让专业空间分析能力下沉至街镇级应用场景。
  494. </p>
  495. <div class="row" style="margin-top: auto;">
  496. <div class="font" style="margin-left: auto;" @click="goto('/wgn')">
  497. 了解更多→
  498. </div>
  499. </div>
  500. </div>
  501. <div class="block-page-router">
  502. <div class="title">
  503. 政务应用标准化接入管理
  504. </div>
  505. <p class="font grey">
  506. 建立区级时空业务应用 “接入 - 授权 - 管控” 全闭环体系,统一规范应用接入流程与权限管理,适配青浦区特色政务应用的快速接入与安全运行。
  507. </p>
  508. <div class="row" style="margin-top: auto;">
  509. <div class="font" style="margin-left: auto;" @click="goto('/yygl')">
  510. 了解更多→
  511. </div>
  512. </div>
  513. </div>
  514. <div class="block-page-router">
  515. <div class="title">
  516. 四级架构运行管理体系构建
  517. </div>
  518. <p class="font grey">
  519. 创新构建 “区 — 街镇 — 综合网格 — 村居” 四级运行管理架构,实现平台数据全生命周期管控、运行状态实时监控,保障区级 “一张图” 系统合规、安全、稳定运行。
  520. </p>
  521. <div class="row" style="margin-top: auto;">
  522. <div class="font" style="margin-left: auto;" @click="goto('/yxgl')">
  523. 了解更多→
  524. </div>
  525. </div>
  526. </div>
  527. </div>
  528. </div> -->
  529. <!-- <div class="bluedark-background col">
  530. <div>
  531. <div class="super-title">多应用标准化接入</div>
  532. <div class="super-title">打破“烟囱式”壁垒</div>
  533. </div>
  534. <p class="font middle">
  535. 亮点说明:通过REST API、WebSocket等标准化接口,无缝接入GIS、遥感监测等各类时空应用,统一管理访问权限与运行状态
  536. </p>
  537. </div>
  538. <div class="dark-background image-background col"
  539. :style="`background-Image:url('${require('@/assets/images/common/home-bg5.png')}');`">
  540. <div class="row" style="margin-top: auto;">
  541. </div>
  542. </div> -->
  543. </div>
  544. <!-- <div class="darkblue-background col" style="height: auto;">
  545. <div class="super-title grey">
  546. <div>全链路运行监督</div>
  547. <div>据驱动优化决策</div>
  548. </div>
  549. <p class="font grey middle">实时统计服务调用、用户分布、应用活跃度等核心指标,全维度反馈系统运行状态,为资源调配与功能迭代提供数据支撑</p>
  550. <img :src="require('@/assets/images/common/home-bg6.png')" />
  551. </div> -->
  552. </template>
  553. <script>
  554. import { countAppUseByUnitName, countServiceUseByApp, countUnitUse, countUserData, topService, topUnit, totalCount, totalCountGroupByTime } from "@/api/count";
  555. import * as echarts from "echarts";
  556. import moment from "moment";
  557. let chart1 = null;
  558. let chartMultiLevelUse = null;
  559. import NumberScroll from '@/components/AppVue/numberScroll.vue'
  560. import digitalScrollersComp from '@/components/AppVue/digitalScrollersComp.vue'
  561. export default {
  562. name: "Home",
  563. components: {
  564. NumberScroll,
  565. digitalScrollersComp
  566. },
  567. data() {
  568. return {
  569. lastDayCall: "239566",
  570. totalCall: ["0", "0", "0", ",", "0", "0", "0"],
  571. totalCallNumber: "18,659,623",
  572. // sections: ['top', 'yyal', 'jcnl', 'tjyy', 'yyzc', 'hxgn'],
  573. sections: ['top', 'jcnl', 'tjyy', 'yyzc', 'hxgn'],
  574. affixOptions: [
  575. {
  576. title: '顶部',
  577. type: 'top',
  578. index:1,
  579. },
  580. // {
  581. // title: '应用案例',
  582. // type: 'yyal',
  583. // index:2,
  584. // },
  585. {
  586. title: '基础能力',
  587. type: 'jcnl',
  588. index:3,
  589. },
  590. {
  591. title: '统建应用',
  592. type: 'tjyy',
  593. index:4,
  594. },
  595. {
  596. title: '应用支撑',
  597. type: 'yyzc',
  598. index:5,
  599. },
  600. {
  601. title: '六大核心',
  602. type: 'hxgn',
  603. index:6,
  604. },
  605. ],
  606. activeIndex:0,
  607. observer: null,
  608. serveNum: 0,
  609. userNum: 0,
  610. appNum: 0,
  611. weekCall: 0,
  612. monthCall: 0,
  613. seasonCall: 0,
  614. yearCall: 0,
  615. currentTab: "data-governance", // 初始选中项
  616. tabs: [
  617. { key: "data-governance", icon: "", title: "平台应用" },
  618. { key: "business-app", icon: "", title: "业务应用" },
  619. { key: "comprehensive-decision", icon: "", title: "特色场景" }
  620. ],
  621. resourceTop: [
  622. ],
  623. userTop: [
  624. ],
  625. examplelist:systemConfig.examplelist,
  626. useCase: {
  627. dataProcass: [{
  628. tags: ["盈浦街道", "夏阳街道"],
  629. title: "一张图资源预览",
  630. text: "一张图资源聚焦于资源预览的高效性与便捷性核心需求,打造轻量化、高适配的单图资源快速预览解决方案,覆盖各类图片素材场景的预览诉求,旨在解决传统资源查看中加载繁琐、信息获取不直观、筛选效率低等问题。",
  631. picture: require('@/assets/images/common/u301.png'),
  632. url:"http://10.235.245.174:2024"
  633. }, {
  634. tags: ["盈浦街道", "夏阳街道"],
  635. title: "一张图开发者中心",
  636. text: "一张图开发者中心是面向开发者打造的图片资源预览能力开放与集成服务平台,作为一张图资源预览产品的技术开放枢纽,聚焦图片快速预览核心能力的高效输出,为企业开发者、第三方开发团队及个人开发者提供标准化、轻量化、高适配的图片预览技术解决方案。",
  637. picture: require("@/assets/images/common/u301.png"),
  638. url:"http://10.235.245.174:2103/home/default"
  639. }, {
  640. tags: ["盈浦街道、夏阳街道"],
  641. title: "一张图二三维引擎示例",
  642. text: "一张图二三维引擎示例是依托一张图技术体系打造的二三维一体化引擎能力演示与实践参考体系,聚焦图片资源在二三维可视化场景下的渲染、交互、融合应用,通过丰富的示例场景、可复用的代码模板、完整的能力演示。",
  643. picture: require("@/assets/images/common/u661.png"),
  644. url:"http://10.235.245.174:2102/"
  645. }, {
  646. tags: ["盈浦街道", "夏阳街道"],
  647. title: "青浦区香花桥农业信息平台",
  648. text: "青浦区香花桥农业信息平台是街道立足本地稻米、林果、花卉等特色农业产业基础,以科技赋能农业现代化、数字化转型为核心,联动上海市农业科学院等科研院所打造的综合性农业智慧服务平台,是香花桥街道推进乡村振兴、落实 “智慧农业 + 产业融合” 发展战略的核心载体。",
  649. picture: require("@/assets/images/common/u302.png"),
  650. url:"http://10.235.245.174:2030"
  651. },
  652. ],
  653. useInService: [{
  654. tags: ["盈浦街道", "夏阳街道"],
  655. title: "学区查询",
  656. text: "学区查询是面向家长、教育管理部门、学校打造的义务教育阶段学区信息精准查询与管理服务体系,是破解传统学区查询 “信息滞后、流程繁琐、核实困难” 等问题的数字化便民举措,也是教育部门实现学区科学管理、教育资源均衡分配的重要数字化支撑,核心实现学区信息的权威发布、精准匹配与高效查询,保障入学相关主体的信息知情权与获取便利性。学区查询服务覆盖家长端、管理端、学校端三类核心使用场景:为家长提供孩子入学学区核实、学位状态确认、入学政策了解的便捷渠道,规避择校、购房中的学区信息误差风险;为教育管理部门提供学区划分优化、学位资源统计、招生趋势预判的数据支撑,助力学区动态调整与教育资源科学配置;为学校提供学区范围公示、招生咨询辅助的工具,提升招生工作的透明度与效率。",
  657. picture: require("@/assets/images/common/u301.png"),
  658. url:"http://121.43.55.7:2121/#/"
  659. }, {
  660. tags: ["盈浦街道、夏阳街道"],
  661. title: "青浦区全量信息视图",
  662. text: "青浦区全量信息视图是立足区域数字化转型与城市治理现代化需求打造的全域数据融合可视化智慧管理平台,作为青浦区 “一网通办”“一网统管” 建设的核心数字底座,深度整合全区跨部门、跨领域全量数据资源,构建起 “一屏观全域、一网管全城” 的智慧化管理体系,为区域政务服务、城市治理、产业发展、民生保障等全场景提供全景化数据支撑与科学决策依据。推动区域治理从 “分散碎片化” 向 “整体协同化”、从 “被动应对” 向 “主动防控” 转变,既提升了城市治理与政务服务的精细化、科学化水平,也为长三角生态绿色一体化发展示范区建设提供了坚实的数字支撑,助力打造更智慧、更宜居、更韧性的现代化青浦。",
  663. picture: require("@/assets/images/common/u661.png"),
  664. url:"http://10.235.245.84:9099/eleOverview/eleOverview?loginToken=21232f297a57a5a743894a0e4a801fc3"
  665. }, {
  666. tags: ["盈浦街道", "夏阳街道"],
  667. title: "青浦区统一地址管理平台",
  668. text: "青浦区统一地址管理平台是立足区域数字化转型战略、紧扣 “一网通办”“一网统管” 建设要求打造的全域地址标准化管理与数据融合支撑平台,作为青浦区空间地理信息数字化的核心基础设施,以破解地址管理 “多库并存、标准不一、关联困难” 等痛点为目标,通过地址资源的标准化整合、全生命周期管理与智能化应用,为城市治理、政务服务、产业发展、民生保障等全场景提供权威、精准、统一的地址数据支撑,夯实区域数字孪生城市与智慧治理的底座根基。青浦区统一地址管理平台通过地址标准化打破数据壁垒、以三维可视化提升治理精度、用场景化应用释放数据价值,为长三角生态绿色一体化发展示范区建设提供了高质量的地址数据底座与智慧治理解决方案。",
  669. picture: require("@/assets/images/common/u301.png"),
  670. url:"https://10.235.251.4:2008/geoAM/?accessToken=66e1605cb81047d4803368972c5a64e3#/"
  671. }, {
  672. tags: ["盈浦街道", "夏阳街道"],
  673. title: "科委产业地图",
  674. text: "科委产业地图是由科技主管部门主导打造的产业创新要素数字化整合与智能服务平台,作为区域科技创新与产业发展的 “数字仪表盘”,以破解产业 “底数不清、资源分散、匹配低效” 等痛点为核心,深度融合 GIS 地理信息、AI 大数据、可视化技术,整合产业链、创新链、人才链、服务链 “四链” 核心资源,构建全域产业发展全景画像,实现从 “静态展示” 到 “动态赋能” 的跨越,为政府产业决策、企业创新发展、要素精准对接提供一站式数字化支撑。它通过打破信息壁垒、强化智能赋能、促进要素集聚,推动产业发展从 “经验驱动” 向 “数据驱动” 转变,为培育先进产业集群、提升区域产业竞争力、加速创新势能向产业动能转化提供坚实支撑,助力打造创新协同、布局合理、发展高效的现代化产业生态",
  675. picture: require("@/assets/images/common/u302.png"),
  676. url:"http://10.235.245.174:2032/#/"
  677. },
  678. ],
  679. decisionHelping: [{
  680. tags: ["盈浦街道", "夏阳街道"],
  681. title: "青浦区小区画像专题",
  682. text: "青浦区小区画像专题是立足区域 “幸福温暖家” 治理体系建设目标,依托区大数据资源平台与新版 “社区云” 基层治理底座打造的小区精细化数字刻画与智能赋能服务体系。作为青浦区全量信息视图在社区治理场景的深化应用,专题以破解小区管理 “底数不清、诉求分散、治理粗放” 等痛点为核心,通过整合多维度小区数据资源、构建标准化画像体系、赋能全场景治理应用,为基层治理、民生服务、城市更新等提供精准数据支撑,助力打造更具温度、更高效能的智慧社区生态。",
  683. picture: require("@/assets/images/common/u301.png"),
  684. url:"http://10.235.245.174:2026/community/"
  685. }, {
  686. tags: ["盈浦街道", "夏阳街道"],
  687. title: "公共快递资源",
  688. text: "公共快递资源项目是政府主导、多方协同,整合快递、电商、交通等资源,以集约化、智能化、共享化为核心,构建覆盖城乡的寄递公共服务网络,解决末端配送低效、成本高、覆盖不足等问题的基础设施与服务体系项目,核心目标是畅通 “农产品进城、工业品下乡” 双向流通,助力民生改善与区域经济发展。",
  689. picture: require("@/assets/images/common/u301.png"),
  690. url:"http://10.235.245.174:2029/"
  691. }, {
  692. tags: ["盈浦街道、夏阳街道"],
  693. title: "青浦区资环审计",
  694. text: "青浦区资源环境审计(简称 “青浦区资环审计”)是青浦区审计局围绕长三角生态绿色一体化发展等国家战略,以守护区域生态环境、规范资源利用、推动绿色发展为核心的审计监督工作,由资源环境审计科具体负责,在组织架构、审计重点、协作机制、实践成效等方面形成了鲜明特色。青浦区资环审计通过机制创新与精准监督,有效推动了区域生态保护与绿色发展,为长三角生态绿色一体化提供了坚实审计保障。",
  695. picture: require("@/assets/images/common/u661.png"),
  696. url:"http://10.235.245.174:2025/"
  697. }, {
  698. tags: ["盈浦街道", "夏阳街道"],
  699. title: "开店一件事",
  700. text: "开店一件事是一套从前期调研规划到后期运营优化的系统性实操工作,核心是以市场需求为导向,完成合法筹备、资源落地与可持续经营,最终实现盈利和长期发展,核心逻辑是 “精准定位 + 合规落地 + 高效运营”。分析行业趋势、周边竞品,明确目标客群的消费能力和需求,找到自身差异化竞争优势,避免盲目入局。",
  701. picture: require("@/assets/images/common/u302.png"),
  702. url:"https://aixq.shqp.gov.cn/kdyjs/"
  703. },
  704. ],
  705. },
  706. activeUseCase: "dataProcass",
  707. chartMluLevel: "unit",
  708. chartMluUnitName: null,
  709. chartMluAppName: null,
  710. chartMluTimeRange: null,
  711. };
  712. },
  713. async beforeMount() {
  714. await this.pullTotalCount()
  715. await this.pullLastDayCount()
  716. },
  717. mounted() {
  718. this.initChart1();
  719. this.initchartMultiLevelUse();
  720. const nowDate = new Date();
  721. nowDate.setHours(0, 0, 0, 0);
  722. this.chartMluTimeRange = [new Date(new Date(nowDate).setDate(nowDate.getDate() - 30)), new Date(new Date(nowDate).setDate(nowDate.getDate()))];
  723. // let end = new Date("2025/12/31")
  724. // let start = new Date("2025/12/01")
  725. // this.chartMluTimeRange = [start, end]
  726. this.chartMluFocusRoot()
  727. this.pullTopUnit()
  728. this.pullTopService()
  729. this.pullMultiTimeRangeCall()
  730. this.pullUserCount()
  731. window.addEventListener('scroll', this.handleScroll,true);
  732. },
  733. beforeUnmount() {
  734. window.removeEventListener('scroll', this.handleScroll,true);
  735. },
  736. methods: {
  737. goAnchor(id) {
  738. const anchor = document.getElementById(id);
  739. if (anchor) {
  740. anchor.scrollIntoView({ behavior: 'smooth' });
  741. }
  742. },
  743. handleScroll(e) {
  744. const scrollPosition = e.target.scrollTop;
  745. this.sections.forEach((section, index) => {
  746. const element = document.getElementById(section);
  747. if (element && scrollPosition >= element.offsetTop - 200) {
  748. this.activeIndex = index;
  749. }
  750. });
  751. },
  752. goto(src) {
  753. this.$router.push({
  754. path: src,
  755. });
  756. },
  757. handleTabsOpenPage(param){
  758. if(!param.url){
  759. return
  760. }
  761. window.open(param.url, "_blank");
  762. },
  763. // 处理调用总数数字
  764. handleTotalCallNumber(num) {
  765. // 667507060
  766. let str = num.toString();
  767. debugger
  768. this.totalCallNumber = str;
  769. let strArr = str.split("").reverse();
  770. this.totalCall = [];
  771. for (let i = 0; i < strArr.length; i++) {
  772. const num = strArr[i];
  773. this.totalCall.unshift(num);
  774. if (i % 3 == 2 && i != strArr.length - 1) {
  775. this.totalCall.unshift(",");
  776. }
  777. }
  778. let itemNumber = "";
  779. this.totalCall.forEach((item, index) => {
  780. itemNumber+=item
  781. })
  782. // this.totalCallNumber = itemNumber;
  783. this.totalCallNumber = "18,659,623";
  784. },
  785. async initChart1() {
  786. const nowDate = new Date();
  787. nowDate.setHours(0, 0, 0, 0);
  788. let end = new Date(nowDate.setDate(nowDate.getDate()))
  789. let start = new Date(nowDate.setDate(nowDate.getDate() - 30))
  790. // let end = new Date("2025/12/31")
  791. // let start = new Date("2025/12/01")
  792. // start = new Date(moment(start).format("YYYY-MM-DD 00:00:00"));
  793. // end = new Date(moment(end).format("YYYY-MM-DD 23:59:59"));
  794. let data = await totalCountGroupByTime(start, end)
  795. let dataMap = {}
  796. for (let i = 0; i < data.length; i++) {
  797. const e = data[i];
  798. dataMap[e.time] = e.count
  799. }
  800. let times = []
  801. let values = []
  802. for (let i = 0; i < 31; i++) {
  803. let date = new Date(start);
  804. date.setDate(start.getDate() + i)
  805. times.push(this.formatDateMMDD(date))
  806. values.push(dataMap[date.getTime()] ?? parseInt(Math.random() * (150000 - 50000) + 50000) )
  807. }
  808. // 基于准备好的dom,初始化echarts实例
  809. var myChart = echarts.init(document.getElementById("echart1"));
  810. let option = {
  811. tooltip: {
  812. trigger: "axis", // 坐标轴触发提示
  813. axisPointer: { type: "shadow" },
  814. backgroundColor: "rgba(0, 25, 50, 0.8)",
  815. borderColor: "#1E90FF",
  816. textStyle: {
  817. color: "#fff",
  818. },
  819. },
  820. xAxis: {
  821. type: "category",
  822. data: times,
  823. axisLine: { lineStyle: { color: "#fff" } }, // 坐标轴颜色
  824. axisTick: { show: false }, // 隐藏刻度
  825. splitLine: { show: false }, // 隐藏分割线
  826. },
  827. yAxis: {
  828. type: "value",
  829. axisLine: { lineStyle: { color: "#fff" } },
  830. splitLine: {
  831. lineStyle: {
  832. type: "dashed", // 虚线网格
  833. color: "#113761",
  834. },
  835. },
  836. },
  837. series: [
  838. {
  839. name: "调用总数",
  840. type: "line",
  841. data: values, // 模拟数据
  842. smooth: true,
  843. lineStyle: { color: "#42a5f5" }, // 蓝色线条
  844. itemStyle: {
  845. color: "#42a5f5",
  846. borderColor: "rgba(66, 165, 245, 0.5)",
  847. borderWidth: 12,
  848. }, // 节点颜色
  849. symbol: "circle", // 节点形状
  850. symbolSize: 6, // 节点大小
  851. showSymbol: false,
  852. lineStyle: {
  853. normal: {
  854. width: 1,
  855. },
  856. },
  857. areaStyle: {
  858. normal: {
  859. color: new echarts.graphic.LinearGradient(
  860. 0,
  861. 0,
  862. 0,
  863. 1,
  864. [
  865. {
  866. offset: 0,
  867. color: "#42a5f5",
  868. },
  869. {
  870. offset: 0.8,
  871. color: "rgba(15, 52, 96, 0.8)",
  872. },
  873. ],
  874. false
  875. ),
  876. shadowColor: "rgba(0, 0, 0, 0.1)",
  877. shadowBlur: 10,
  878. },
  879. }
  880. },
  881. ],
  882. };
  883. // 绘制图表
  884. myChart.setOption(option);
  885. chart1 = myChart
  886. },
  887. initchartMultiLevelUse() {
  888. var myChart = echarts.init(document.getElementById("echartMultiLevelUse"));
  889. let option = {
  890. tooltip: {
  891. trigger: 'axis',
  892. show: true,
  893. formatter: '{b}: {c}',
  894. backgroundColor: "rgba(0, 25, 50, 0.8)",
  895. borderColor: "#1E90FF",
  896. textStyle: {
  897. color: "#fff",
  898. },
  899. },
  900. title: {
  901. text: '所有委办',
  902. left: 'center',
  903. top: 20,
  904. textStyle: {
  905. color: '#fff',
  906. fontSize: 18,
  907. fontWeight: 'bold'
  908. },
  909. },
  910. axisPointer: {
  911. type: 'shadow'
  912. },
  913. grid: {
  914. left: '3%',
  915. right: '4%',
  916. bottom: '3%',
  917. containLabel: true
  918. },
  919. xAxis: [
  920. {
  921. type: 'value',
  922. // axisLine: { lineStyle: { color: "red" } },
  923. // splitLine: { show: false }, // 隐藏分割线
  924. splitLine: {
  925. lineStyle: {
  926. color: "rgba(255,255,255,0.12)",
  927. },
  928. },
  929. }
  930. ],
  931. yAxis: [
  932. {
  933. type: 'category',
  934. axisLine: { lineStyle: { color: "#fff" } },
  935. inverse: true,
  936. data: [""],
  937. splitLine: {
  938. lineStyle: {
  939. color:"red"
  940. },
  941. },
  942. }
  943. ],
  944. series: [
  945. {
  946. cursorSize: 20,
  947. name: 'Direct',
  948. type: 'bar',
  949. barWidth: '60%',
  950. data: [0]
  951. }
  952. ],
  953. dataZoom: [
  954. {
  955. type: 'inside', // 内置型,可以用鼠标滚轮缩放
  956. yAxisIndex: 0,
  957. zoomOnMouseWheel: false, // 滚轮缩放
  958. moveOnMouseWheel: false, // 滚轮移动
  959. zoomLock: false,
  960. minValueSpan: 12, // 最小显示数据数量
  961. maxValueSpan: 12 // 最大显示数据数量
  962. }
  963. ]
  964. };
  965. myChart.setOption(option);
  966. myChart.on("click", this.chartMluClick)
  967. chartMultiLevelUse = myChart
  968. },
  969. async chartMluFocus(level, farther) {
  970. if (level == null) {
  971. level = this.chartMluLevel
  972. }
  973. switch (level) {
  974. case "unit":
  975. default: {
  976. await this.chartMluFocusRoot();
  977. this.chartMluUpdateTitle("所有委办")
  978. break;
  979. }
  980. case "app": {
  981. let unit = farther ?? this.chartMluUnitName ?? ""
  982. await this.chartMluFocusApp(unit);
  983. this.chartMluUpdateTitle("委办:" + unit)
  984. break;
  985. }
  986. case "service": {
  987. let app = farther ?? this.chartMluAppName ?? ""
  988. await this.chartMluFocusService(app);
  989. this.chartMluUpdateTitle("应用:" + app)
  990. break;
  991. }
  992. }
  993. },
  994. chartMluClick(event) {
  995. switch (this.chartMluLevel) {
  996. case "unit": {
  997. this.chartMluLevel = "app";
  998. this.chartMluUnitName = event.name
  999. break;
  1000. }
  1001. case "app": {
  1002. this.chartMluLevel = "service";
  1003. this.chartMluAppName = event.name
  1004. break;
  1005. }
  1006. case "service":
  1007. default: {
  1008. // do nothing
  1009. }
  1010. }
  1011. this.chartMluFocus();
  1012. },
  1013. chartMluBack(level) {
  1014. //自动回退
  1015. if (level == null) {
  1016. switch (this.chartMluLevel) {
  1017. default:
  1018. case "unit": level = "unit"; break;
  1019. case "app": level = "unit"; break;
  1020. case "service": level = "app"; break;
  1021. }
  1022. }
  1023. this.chartMluLevel = level;
  1024. this.chartMluFocus()
  1025. },
  1026. async chartMluFocusRoot() {
  1027. let start = this.chartMluTimeRange[0], end = this.chartMluTimeRange[1];
  1028. start = new Date(moment(start).format("YYYY-MM-DD 00:00:00"));
  1029. end = new Date(moment(end).format("YYYY-MM-DD 23:59:59"));
  1030. const data = await countUnitUse(start, end);
  1031. const names = [];
  1032. const values = [];
  1033. for (let index = 0; index < data.length; index++) {
  1034. const e = data[index];
  1035. names.push(e.name);
  1036. values.push(e.count);
  1037. }
  1038. this.chartMluUpdateData(names, values)
  1039. },
  1040. async chartMluFocusApp(father) {
  1041. let start = this.chartMluTimeRange[0], end = this.chartMluTimeRange[1];
  1042. start = new Date(moment(start).format("YYYY-MM-DD 00:00:00"));
  1043. end = new Date(moment(end).format("YYYY-MM-DD 23:59:59"));
  1044. const data = await countAppUseByUnitName(start, end, father);
  1045. const names = [];
  1046. const values = [];
  1047. for (let index = 0; index < data.length; index++) {
  1048. const e = data[index];
  1049. names.push(e.name);
  1050. values.push(e.count);
  1051. }
  1052. this.chartMluUpdateData(names, values)
  1053. },
  1054. async chartMluFocusService(father) {
  1055. let start = this.chartMluTimeRange[0], end = this.chartMluTimeRange[1];
  1056. start = new Date(moment(start).format("YYYY-MM-DD 00:00:00"));
  1057. end = new Date(moment(end).format("YYYY-MM-DD 23:59:59"));
  1058. const data = await countServiceUseByApp(start, end, father);
  1059. const names = [];
  1060. const values = [];
  1061. for (let index = 0; index < data.length; index++) {
  1062. const e = data[index];
  1063. names.push(e.name);
  1064. values.push(e.count*10); //临时
  1065. }
  1066. this.chartMluUpdateData(names, values)
  1067. },
  1068. async pullTopUnit() {
  1069. let data = await topUnit(5)
  1070. for (let i = 0; i < data.length; i++) {
  1071. const e = data[i];
  1072. e.value = this.numberFormatter(e.count);
  1073. }
  1074. this.userTop = data
  1075. },
  1076. async pullTopService() {
  1077. let data = await topService(10)
  1078. data = [
  1079. {
  1080. "name": "一张图权限认证",
  1081. "count": 476215
  1082. },
  1083. {
  1084. "name": "航空影像2023",
  1085. "count": 454389
  1086. },
  1087. {
  1088. "name": "高级地名地址查询",
  1089. "count": 380490
  1090. },
  1091. {
  1092. "name": "政务地图常规色",
  1093. "count": 295380
  1094. },
  1095. {
  1096. "name": "政务地图暗色版",
  1097. "count": 258912
  1098. },
  1099. {
  1100. "name": "wgs84转上海2000投影坐标",
  1101. "count": 174874
  1102. },
  1103. {
  1104. "name": "青浦区街道行政区划边界位置分布",
  1105. "count": 128912
  1106. },
  1107. {
  1108. "name": "wgs84转上海2000投影坐标",
  1109. "count": 11048
  1110. },
  1111. {
  1112. "name": "青浦区行政边界位置分布",
  1113. "count": 10584
  1114. },
  1115. {
  1116. "name": "青浦区院落面栅格瓦片",
  1117. "count": 9962
  1118. }
  1119. ]
  1120. for (let i = 0; i < data.length; i++) {
  1121. const e = data[i];
  1122. e.value = this.numberFormatter(e.count);
  1123. }
  1124. this.resourceTop = data
  1125. },
  1126. async pullTotalCount() {
  1127. this.handleTotalCallNumber((await totalCount())[0].count)
  1128. },
  1129. async pullLastDayCount() {
  1130. const nowDate = new Date();
  1131. nowDate.setHours(0, 0, 0, 0);
  1132. let end = new Date(nowDate)
  1133. let start = new Date(nowDate.setDate(nowDate.getDate() - 1))
  1134. start = new Date(moment(start).format("YYYY-MM-DD 00:00:00"));
  1135. end = new Date(moment(end).format("YYYY-MM-DD 23:59:59"));
  1136. let data = (await totalCount(start, end))[0]
  1137. // this.lastDayCall = data == null ? 0 : data.count
  1138. this.lastDayCall = 239566;
  1139. },
  1140. async pullMultiTimeRangeCall() {
  1141. // this.weekCall = await this.pullTotalCountByDays(7)
  1142. // this.monthCall = await this.pullTotalCountByDays(30)
  1143. // this.seasonCall = await this.pullTotalCountByDays(91)
  1144. // this.yearCall = await this.pullTotalCountByDays(365)
  1145. this.weekCall = 1186695;
  1146. this.monthCall = 4328556;
  1147. this.seasonCall = 6635991;
  1148. this.yearCall = 16596630;
  1149. },
  1150. async pullTotalCountByDays(days) {
  1151. const nowDate = new Date();
  1152. nowDate.setHours(0, 0, 0, 0);
  1153. let end = new Date(nowDate)
  1154. let start = new Date(nowDate.setDate(nowDate.getDate() - days))
  1155. start = new Date(moment(start).format("YYYY-MM-DD 00:00:00"));
  1156. end = new Date(moment(end).format("YYYY-MM-DD 23:59:59"));
  1157. let data = (await totalCount(start, end))[0]
  1158. return data == null ? 0 : data.count
  1159. },
  1160. async pullUserCount() {
  1161. let data = await countUserData();
  1162. // this.appNum = data.application;
  1163. // this.unitNum = data.unit;
  1164. // this.userNum = data.username;
  1165. this.appNum = 37;
  1166. this.unitNum = 18;
  1167. this.userNum = 46;
  1168. },
  1169. chartMluUpdateData(names, values) {
  1170. chartMultiLevelUse.setOption({
  1171. yAxis: [
  1172. {
  1173. data: names,
  1174. }
  1175. ],
  1176. series: [
  1177. {
  1178. data: values
  1179. }
  1180. ]
  1181. })
  1182. this.chartMluCheckChangeToLog(values)
  1183. },
  1184. chartMluCheckChangeToLog(values) {
  1185. let toLog = false;
  1186. values.sort((a, b) => a - b);
  1187. let min = values[0];
  1188. let max = values[values.length - 1]
  1189. if (max / min > 3000) {
  1190. toLog = true
  1191. }
  1192. if (toLog) {
  1193. chartMultiLevelUse.setOption(
  1194. {
  1195. xAxis: [{
  1196. type: 'log',
  1197. logBase: 10,
  1198. min: 1,
  1199. axisLine: { lineStyle: { color: "#fff" } },
  1200. axisLabel: {
  1201. formatter: this.numberFormatter
  1202. },
  1203. }]
  1204. }
  1205. )
  1206. } else {
  1207. chartMultiLevelUse.setOption(
  1208. {
  1209. xAxis: [{
  1210. type: 'value',
  1211. min: 0,
  1212. axisLine: { lineStyle: { color: "#fff" } },
  1213. }]
  1214. }
  1215. )
  1216. }
  1217. },
  1218. chartMluUpdateTitle(newTitle) {
  1219. chartMultiLevelUse.setOption({
  1220. title: {
  1221. text: newTitle,
  1222. }
  1223. })
  1224. },
  1225. numberFormatter(num, decimals = 1) {
  1226. if (num >= 1000000000000) {
  1227. return parseFloat((num / 1000000000000).toFixed(decimals)).toString() + '亿万';
  1228. }
  1229. if (num >= 100000000) {
  1230. return parseFloat((num / 100000000).toFixed(decimals)).toString() + '亿';
  1231. }
  1232. if (num >= 10000) {
  1233. return parseFloat((num / 10000).toFixed(decimals)).toString() + '万';
  1234. }
  1235. return num.toString();
  1236. },
  1237. formatDateMMDD(date) {
  1238. // 月份从0开始,所以要 +1
  1239. const month = String(date.getMonth() + 1).padStart(2, '0');
  1240. const day = String(date.getDate()).padStart(2, '0');
  1241. return `${month}/${day}`;
  1242. }
  1243. }
  1244. }
  1245. </script>
  1246. <style lang="less" scoped>
  1247. .font,
  1248. .title,
  1249. .super-title,
  1250. .title-sub,
  1251. .second-title,
  1252. .third-title,
  1253. .strong-data {
  1254. color: #fff;
  1255. }
  1256. .icon {
  1257. color: #fff;
  1258. fill: currentColor;
  1259. }
  1260. .middle {
  1261. text-align: center;
  1262. // margin-top: 10px;
  1263. }
  1264. .darkblue-background,
  1265. .dark-background,
  1266. .bluedark-background,
  1267. .blue-background,
  1268. .image-background {
  1269. padding-top: 0px;
  1270. // padding-bottom: 40px;
  1271. padding-bottom: 100px;
  1272. margin-left: 0;
  1273. padding-left: 120px;
  1274. padding-right: 120px;
  1275. min-height: 600px;
  1276. }
  1277. .darkblue-background {
  1278. background: #00002a;
  1279. // background: linear-gradient(to bottom, #00002a, #060633, #0f3460, #0f3460);
  1280. // background: linear-gradient(to bottom,
  1281. // #01012f 0%,
  1282. // #0f3460 40%,
  1283. // #0f3460 100%);
  1284. .radius-container{
  1285. border-radius: 40px;
  1286. width: 380px;
  1287. height: 120px;
  1288. background: radial-gradient(50% 50% at 50% 50%, #0E5AF4 0%, #00002F 100%);
  1289. // background: -webkit-radial-gradient(center, #07a2fd, #010130, #010130);
  1290. display: flex;
  1291. justify-content: center;
  1292. align-items: center;
  1293. .text-color{
  1294. color: #fff;
  1295. }
  1296. .text-desc-color{
  1297. color: #ADE8FE;
  1298. }
  1299. }
  1300. .al-container{
  1301. width: 30%;
  1302. height: 200px;
  1303. background: linear-gradient(to bottom, #050532 0%, #000002 66%, #ffffff 100%);
  1304. font-size: 20px;
  1305. border: 2px solid transparent;
  1306. border-radius: 12px;
  1307. background-clip: padding-box, border-box;
  1308. background-origin: padding-box, border-box;
  1309. background-image: linear-gradient(128deg, #050532, #2220), linear-gradient(136deg, #ffffff, #00000000, #00000000, #00000000);
  1310. .al-container-border{
  1311. border: 1px solid #2c5179;
  1312. border-radius: 10px;
  1313. width: 100%;
  1314. height: 100%;
  1315. display: flex;
  1316. justify-content: center;
  1317. align-items: center;
  1318. text-align: center;
  1319. }
  1320. .text-color{
  1321. color: #fff;
  1322. padding: 10px;
  1323. }
  1324. transition: all 0.3s ease;
  1325. &:hover {
  1326. background-color: #060633;
  1327. transform: translateY(-5px);
  1328. box-shadow: 0 4px 12px #043e75;
  1329. }
  1330. }
  1331. }
  1332. .dark-background {
  1333. background: #0a0a08
  1334. }
  1335. .blue-background {
  1336. background: #0f3460
  1337. }
  1338. .bluedark-background {
  1339. background: linear-gradient(to bottom,
  1340. #0f3460 0%,
  1341. #0f3460 60%,
  1342. #02060c 100%);
  1343. }
  1344. .image-background {
  1345. background-repeat: no-repeat;
  1346. background-position: center;
  1347. background-size: 100% auto;
  1348. }
  1349. .lighter-container {
  1350. background-color: #eeeeee0b;
  1351. padding: 20px;
  1352. margin: 15px;
  1353. vertical-align: middle;
  1354. border-radius: 10px;
  1355. }
  1356. .affix-container{
  1357. position: absolute;
  1358. z-index: 2;
  1359. .active{
  1360. color: #3d9aff;
  1361. }
  1362. }
  1363. .lightblue-container {
  1364. margin: 15px;
  1365. background: linear-gradient(to bottom,
  1366. #215476 0%,
  1367. #28638b 66%,
  1368. #337aac 100%);
  1369. font-size: 20px;
  1370. border: 2px solid transparent;
  1371. border-radius: 12px;
  1372. background-clip: padding-box, border-box;
  1373. background-origin: padding-box, border-box;
  1374. background-image: linear-gradient(128deg, #052b5b, #2220), linear-gradient(136deg, #e5e5e5de, #00000000, #00000000, #00000000);
  1375. transition: all 0.3s ease;
  1376. &:hover {
  1377. // background-color: #060633;
  1378. transform: translateY(-5px);
  1379. box-shadow: 0 4px 12px #043e75;
  1380. }
  1381. .lightblue-container-boder{
  1382. border: 1px solid #2c5179;
  1383. border-radius: 10px;
  1384. // padding: 20px;
  1385. }
  1386. .third-title {
  1387. font-size: 28px;
  1388. padding: 0;
  1389. }
  1390. .img-container{
  1391. width: 100%;
  1392. height: 50%;
  1393. display: flex;
  1394. text-align: right;
  1395. justify-content: right;
  1396. position: relative;
  1397. border-radius: 10px;
  1398. overflow: hidden;
  1399. .row-warp-page-img{
  1400. width: 144px;
  1401. height: 144px;
  1402. transform: rotate(350deg);
  1403. position: relative;
  1404. right: -20px;
  1405. top: -20px;
  1406. }
  1407. .img-border{
  1408. background: url('@/assets/images/common/gn/5.png');
  1409. background-size: 100% 100%;
  1410. width: 144px;
  1411. height: 144px;
  1412. transform: rotate(-50deg);
  1413. top: 50%;
  1414. left: 50%;
  1415. }
  1416. }
  1417. }
  1418. .middle-container {
  1419. display: flex !important;
  1420. justify-content: center;
  1421. flex-direction: column;
  1422. padding: 0;
  1423. align-items: stretch;
  1424. border: 2px solid transparent;
  1425. border-radius: 12px;
  1426. background-clip: padding-box, border-box;
  1427. background-origin: padding-box, border-box;
  1428. background-image: linear-gradient(330deg, #050532, #2220), linear-gradient(330deg, #ffffff, #00000000, #00000000, #00000000);
  1429. transition: all 0.3s ease;
  1430. }
  1431. .row,
  1432. .warp-row,
  1433. .between-row {
  1434. display: flex !important;
  1435. justify-content: space-around;
  1436. padding: 0px;
  1437. align-items: stretch;
  1438. }
  1439. .warp-row {
  1440. flex-wrap: wrap;
  1441. }
  1442. .between-row {
  1443. justify-content: space-between;
  1444. }
  1445. .col {
  1446. display: flex !important;
  1447. justify-content: space-around;
  1448. flex-direction: column;
  1449. }
  1450. .dense-col {
  1451. display: flex !important;
  1452. justify-content: center;
  1453. flex-direction: column;
  1454. }
  1455. .start-reverse-col {
  1456. display: flex !important;
  1457. justify-content: start;
  1458. flex-direction: column-reverse;
  1459. }
  1460. .dense-col>*,
  1461. .start-reverse-col>* {
  1462. margin: 10px;
  1463. }
  1464. .grid-2x2 {
  1465. display: grid !important;
  1466. grid-template-columns: 1fr 1fr;
  1467. gap: 12px;
  1468. width: 100%;
  1469. height: 80%;
  1470. }
  1471. .strong-data {
  1472. font-size: 32px;
  1473. font-weight: bold;
  1474. text-align: center;
  1475. }
  1476. .title {
  1477. font-size: 36px;
  1478. margin-top: 10px;
  1479. text-align: center;
  1480. font-weight: bold;
  1481. }
  1482. .super-title {
  1483. font-size: 44px;
  1484. margin-top: 10px;
  1485. text-align: center;
  1486. font-weight: bold;
  1487. }
  1488. .title-sub {
  1489. font-size: 16px;
  1490. margin-top: 10px;
  1491. color: rgb(192, 192, 192);
  1492. text-align: center;
  1493. }
  1494. .second-title {
  1495. font-size: 20px;
  1496. margin-top: 10px;
  1497. padding-left: 10px;
  1498. border-left: 2px solid #3498db;
  1499. font-weight: bold;
  1500. }
  1501. .third-title {
  1502. font-size: 18px;
  1503. align-items: center;
  1504. display: flex;
  1505. font-weight: bold;
  1506. padding-bottom: 10px;
  1507. i{
  1508. margin-right: 5px;
  1509. }
  1510. }
  1511. .top-list {
  1512. display: flex;
  1513. flex-direction: column;
  1514. }
  1515. .top-list .list-item {
  1516. display: flex;
  1517. justify-content: space-between;
  1518. margin: 10px 0px;
  1519. // margin-left: 30px;
  1520. // margin-right: 30px;
  1521. }
  1522. .usecase-tabs {
  1523. width: 60%;
  1524. margin: auto;
  1525. margin-top: 60px;
  1526. margin-bottom: 30px;
  1527. }
  1528. .usecase-tabs .tab-lab {
  1529. display: flex;
  1530. align-items: center;
  1531. font-size: 24px;
  1532. color: #fff;
  1533. }
  1534. .use-case {
  1535. margin: 20px;
  1536. width: 45%;
  1537. height: 500px;
  1538. border-radius: 10px;
  1539. background-size: 100% auto;
  1540. /* 横向填满,纵向按比例缩放 */
  1541. background-repeat: no-repeat;
  1542. .use-case-empty {
  1543. width: 100%;
  1544. height: 50%;
  1545. }
  1546. .use-case-text {
  1547. padding: 15px;
  1548. width: 100%;
  1549. height: 50%;
  1550. border-radius: 10px;
  1551. box-sizing: border-box;
  1552. background: linear-gradient(to bottom,
  1553. #377f7f 0%,
  1554. #377f7f 80%,
  1555. #205161 100%);
  1556. .third-title {
  1557. padding: 0;
  1558. }
  1559. }
  1560. }
  1561. .six-router {
  1562. width: 30%;
  1563. // height: 300px;
  1564. font-size: 28px;
  1565. .third-title {
  1566. font-size: 32px;
  1567. }
  1568. }
  1569. .circle-number {
  1570. // display: block;
  1571. margin-right: 10px;
  1572. background-color: #eeeeee00;
  1573. // border: 1px solid #2272d4;
  1574. }
  1575. .block-page-router {
  1576. display: flex;
  1577. flex-direction: column;
  1578. margin: 15px;
  1579. padding: 15px;
  1580. box-sizing: border-box;
  1581. width: 30%;
  1582. height: 240px;
  1583. border: #2272d4 solid 1px;
  1584. border-radius: 13px;
  1585. background-color: #1e3348;
  1586. }
  1587. .blue {
  1588. // color: #3498db;
  1589. color: #1586FF;
  1590. font-weight: bold;
  1591. }
  1592. .white{
  1593. color: #fff;
  1594. }
  1595. .number-color{
  1596. color: #ade8fe;
  1597. }
  1598. .grey {
  1599. color: rgb(192, 192, 192);
  1600. padding: 20px 0px;
  1601. }
  1602. .lightgrey {
  1603. color: rgb(229, 229, 229);
  1604. padding: 0px 20px 20px 20px;
  1605. position: relative;
  1606. top: -30px;
  1607. height: 120px;
  1608. .lightgrey-title{
  1609. font-size: 24px;
  1610. font-weight: bold;
  1611. padding-bottom: 20px;
  1612. }
  1613. .lightgrey-desc{
  1614. font-size: 16px;
  1615. }
  1616. }
  1617. #echart1 {
  1618. width: 100%;
  1619. height: 450px;
  1620. }
  1621. #echartMultiLevelUse {
  1622. width: 100%;
  1623. height: 450px;
  1624. }
  1625. .container {
  1626. width: 100%;
  1627. margin: 0 auto;
  1628. }
  1629. .home {
  1630. position: relative;
  1631. .part1 {
  1632. width: 100%;
  1633. height: 750px;
  1634. // height: calc(100vh - 120px);
  1635. background: url('@static/images/home/bg.png');
  1636. background-size: 100% 100%;
  1637. position: relative;
  1638. overflow: hidden;
  1639. display: flex;
  1640. justify-content: left;
  1641. align-items: center;
  1642. .super-title{
  1643. font-size: 44px;
  1644. margin-top: 0px;
  1645. margin-bottom: 10px;
  1646. text-align: left;
  1647. font-weight: bold;
  1648. }
  1649. .title-sub{
  1650. font-size: 16px;
  1651. margin-top: 0px;
  1652. color: #ffffff;
  1653. text-align: left;
  1654. }
  1655. .count-title{
  1656. // font-size: 24px;
  1657. font-weight: bold;
  1658. text-align: left;
  1659. margin: 40px 0px 20px 0px;
  1660. .count{
  1661. padding: 5px;
  1662. }
  1663. .text1{
  1664. font-weight: 100;
  1665. font-size: 12px;
  1666. }
  1667. }
  1668. .part1-1 {
  1669. width: 100%;
  1670. height: 300px;
  1671. //background: #09284c;
  1672. margin: 0 auto;
  1673. margin-top: 10px;
  1674. overflow: hidden;
  1675. .part1-1-1 {
  1676. height: 300px;
  1677. width: fit-content;
  1678. margin: 0 auto;
  1679. // margin-top: 30px;
  1680. .number-container {
  1681. display: flex;
  1682. align-items: flex-start;
  1683. font-size: 2em;
  1684. }
  1685. .number-item {
  1686. width: 57px;
  1687. height: 70px;
  1688. background-color: rgb(10 71 137 / 70%);
  1689. border: 1px solid #2663a5;
  1690. box-shadow: 0 4px 20px #2663a5;
  1691. border-radius: 10px;
  1692. color: white;
  1693. display: flex;
  1694. justify-content: center;
  1695. align-items: center;
  1696. margin-right: 20px;
  1697. font-size: 44px;
  1698. line-height: 70px;
  1699. font-weight: bold;
  1700. }
  1701. .separator {
  1702. margin-right: 20px;
  1703. font-size: 35px;
  1704. text-align: end;
  1705. color: #ffffff;
  1706. }
  1707. .text {
  1708. font-size: 24px;
  1709. line-height: 100px;
  1710. padding: 0px 20px;
  1711. color: #ffffff;
  1712. font-weight: bold;
  1713. }
  1714. }
  1715. .part1-1-2 {
  1716. height: 50px;
  1717. width: 700px;
  1718. margin: 0 auto;
  1719. margin-top: 30px;
  1720. background: #8080804d;
  1721. border-radius: 5px;
  1722. line-height: 50px;
  1723. div {
  1724. display: inline-block;
  1725. vertical-align: top;
  1726. &.line {
  1727. height: 2px;
  1728. background: #808080;
  1729. width: 100px;
  1730. margin: 24px 20px;
  1731. margin-right: 20px;
  1732. }
  1733. &:nth-child(2) {
  1734. width: 420px;
  1735. text-align: center;
  1736. color: #ffffff;
  1737. font-size: 20px;
  1738. font-weight: bold;
  1739. .text1 {
  1740. margin-right: 20px;
  1741. }
  1742. .text2 {
  1743. margin-left: 20px;
  1744. }
  1745. }
  1746. &:nth-child(4) {
  1747. float: right;
  1748. }
  1749. }
  1750. }
  1751. }
  1752. }
  1753. .part2 {
  1754. background: #08224a;
  1755. padding-bottom: 1px;
  1756. .part1-2 {
  1757. color: #ffffff;
  1758. // margin-top: 20px;
  1759. .part1-2-1,
  1760. .part1-2-2,
  1761. .part1-2-3 {
  1762. display: inline-block;
  1763. text-align: center;
  1764. font-weight: bold;
  1765. width: calc(100% / 3);
  1766. div:nth-child(1) {
  1767. font-size: 24px;
  1768. }
  1769. div:nth-child(2) {
  1770. margin-top: 10px;
  1771. font-size: 32px;
  1772. }
  1773. }
  1774. }
  1775. .chapter {
  1776. text-align: center;
  1777. font-size: 40px;
  1778. width: 100%;
  1779. height: 80px;
  1780. line-height: 80px;
  1781. color: #ffffff;
  1782. font-weight: bold;
  1783. border-bottom: 2px solid gray;
  1784. margin-bottom: 20px;
  1785. }
  1786. .row {
  1787. display: flex;
  1788. justify-content: space-between;
  1789. margin-bottom: 20px;
  1790. padding: 0 100px;
  1791. }
  1792. .service {
  1793. flex: 1;
  1794. margin: 0 30px;
  1795. text-align: center;
  1796. }
  1797. .title {
  1798. position: relative;
  1799. padding-bottom: 10px;
  1800. margin-bottom: 15px;
  1801. height: 50px;
  1802. line-height: 90px;
  1803. font-size: 30px;
  1804. }
  1805. .title::before {
  1806. content: "";
  1807. position: absolute;
  1808. left: 0;
  1809. right: 0;
  1810. top: 0;
  1811. height: 15px;
  1812. }
  1813. .yellow {
  1814. color: #f1c40f;
  1815. }
  1816. .yellow::before {
  1817. background-color: #f1c40f;
  1818. }
  1819. .gray {
  1820. color: #bdc3c7;
  1821. }
  1822. .gray::before {
  1823. background-color: #bdc3c7;
  1824. }
  1825. .blue {
  1826. color: #3498db;
  1827. }
  1828. .blue::before {
  1829. background-color: #3498db;
  1830. }
  1831. .orange {
  1832. color: #e67e22;
  1833. }
  1834. .orange::before {
  1835. background-color: #e67e22;
  1836. }
  1837. .green {
  1838. color: #27ae60;
  1839. }
  1840. .green::before {
  1841. background-color: #27ae60;
  1842. }
  1843. .yellow-green {
  1844. color: #b2be2c;
  1845. }
  1846. .yellow-green::before {
  1847. background-color: #b2be2c;
  1848. }
  1849. p {
  1850. font-size: 20px;
  1851. line-height: 2;
  1852. color: #ffffff;
  1853. }
  1854. }
  1855. .part3 {
  1856. .container {
  1857. position: relative;
  1858. width: 100%;
  1859. height: 940px;
  1860. background-image: url("~@/assets/images/common/u30.png");
  1861. /* 替换为实际图片路径 */
  1862. background-size: cover;
  1863. background-position: center;
  1864. display: flex;
  1865. flex-direction: column;
  1866. justify-content: center;
  1867. align-items: center;
  1868. text-align: center;
  1869. color: #000000;
  1870. font-family: Arial, sans-serif;
  1871. overflow: hidden;
  1872. }
  1873. h1 {
  1874. position: absolute;
  1875. top: 30px;
  1876. font-size: 40px;
  1877. font-weight: bold;
  1878. }
  1879. p {
  1880. margin-bottom: 30px;
  1881. font-weight: bold;
  1882. font-size: 24px;
  1883. line-height: 2;
  1884. }
  1885. .el-button {
  1886. position: absolute;
  1887. bottom: 150px;
  1888. }
  1889. }
  1890. .part4 {
  1891. background: #08224a;
  1892. padding-bottom: 1px;
  1893. .chapter {
  1894. text-align: center;
  1895. font-size: 40px;
  1896. width: 100%;
  1897. height: 80px;
  1898. line-height: 80px;
  1899. color: #ffffff;
  1900. font-weight: bold;
  1901. /* border-bottom: 2px solid gray; */
  1902. margin-bottom: 20px;
  1903. }
  1904. .row {
  1905. display: flex;
  1906. justify-content: space-between;
  1907. margin-bottom: 40px;
  1908. padding: 0 100px;
  1909. }
  1910. .service {
  1911. flex: 1;
  1912. margin: 0 30px;
  1913. width: 500px;
  1914. height: 320px;
  1915. border: 1px solid gray;
  1916. border-radius: 8px;
  1917. padding: 10px 10px;
  1918. box-sizing: border-box;
  1919. overflow: hidden;
  1920. position: relative;
  1921. }
  1922. .title {
  1923. position: relative;
  1924. height: 30px;
  1925. line-height: 30px;
  1926. font-size: 30px;
  1927. text-align: left;
  1928. color: #ffffff;
  1929. padding-bottom: 20px;
  1930. }
  1931. p {
  1932. text-indent: 2rem;
  1933. font-size: 20px;
  1934. line-height: 2;
  1935. color: #ffffff;
  1936. }
  1937. .el-button {
  1938. position: absolute;
  1939. bottom: 10px;
  1940. left: 10px;
  1941. font-size: 20px;
  1942. color: #ffffff;
  1943. &:hover {
  1944. color: #3498db;
  1945. }
  1946. }
  1947. }
  1948. .part5 {
  1949. background: #08224a;
  1950. padding-bottom: 1px;
  1951. .chapter {
  1952. text-align: center;
  1953. font-size: 40px;
  1954. width: 100%;
  1955. height: 80px;
  1956. line-height: 80px;
  1957. color: #ffffff;
  1958. font-weight: bold;
  1959. /* border-bottom: 2px solid gray; */
  1960. margin-bottom: 20px;
  1961. }
  1962. .part5-1 {
  1963. color: #ffffff;
  1964. margin-top: 20px;
  1965. margin-bottom: 20px;
  1966. .part5-1-1,
  1967. .part5-1-2,
  1968. .part5-1-3 {
  1969. display: inline-block;
  1970. text-align: center;
  1971. font-weight: bold;
  1972. width: calc(100% / 3);
  1973. div {
  1974. font-size: 24px;
  1975. }
  1976. div:nth-child(2) {
  1977. margin-top: 10px;
  1978. font-size: 24px;
  1979. }
  1980. div p {
  1981. display: inline-block;
  1982. font-size: 40px;
  1983. }
  1984. }
  1985. }
  1986. .part5-2 {
  1987. margin-top: 40px;
  1988. padding-bottom: 1px;
  1989. height: fit-content;
  1990. .tab-container {
  1991. display: flex;
  1992. gap: 40px;
  1993. /* 选项卡间距 */
  1994. // border-bottom: 1px solid #eee; /* 可选底部分隔线 */
  1995. width: fit-content;
  1996. margin: 0 auto;
  1997. position: relative;
  1998. margin-bottom: 40px;
  1999. height: 55px;
  2000. }
  2001. .tab-container::after {
  2002. content: "";
  2003. display: block;
  2004. height: 1px;
  2005. width: 100%;
  2006. background: #eeeeee;
  2007. /* 下划线颜色 */
  2008. position: absolute;
  2009. bottom: 0;
  2010. }
  2011. .tab-item {
  2012. color: #ffffff;
  2013. cursor: pointer;
  2014. overflow: hidden;
  2015. position: relative;
  2016. font-size: 30px;
  2017. height: 55px;
  2018. }
  2019. .tab-item-active {
  2020. color: #66f;
  2021. /* 选中文字颜色 */
  2022. }
  2023. .tab-item-active::after {
  2024. content: "";
  2025. display: block;
  2026. height: 2px;
  2027. width: 100%;
  2028. background: #66f;
  2029. /* 下划线颜色 */
  2030. margin-top: 5px;
  2031. position: absolute;
  2032. bottom: 0;
  2033. z-index: 1;
  2034. }
  2035. .tab-icon {
  2036. margin-right: 5px;
  2037. /* 图标与文字间距 */
  2038. }
  2039. .row {
  2040. display: flex;
  2041. justify-content: space-between;
  2042. margin-bottom: 40px;
  2043. padding: 0 120px;
  2044. > :nth-child(1) {
  2045. background: url(~@/assets/images/common/u301.png) no-repeat 0 0/100%;
  2046. }
  2047. > :nth-child(2) {
  2048. background: url(~@/assets/images/common/u302.png) no-repeat 0 0/100%;
  2049. }
  2050. }
  2051. }
  2052. }
  2053. }
  2054. /deep/.el-affix--fixed{
  2055. height: 220px;
  2056. width: 120px !important;
  2057. top: 30% !important;
  2058. // top:unset !important;
  2059. // bottom: 60px !important;
  2060. z-index: 100;
  2061. border: 1px solid transparent;
  2062. border-radius: 16px;
  2063. background-clip: padding-box, border-box;
  2064. background-origin: padding-box, border-box;
  2065. background-image: linear-gradient(88deg, #00002e, #2220), linear-gradient(87deg, #fffdfd6b, #00000000, #00000000, #00000000);
  2066. }
  2067. .warp-container{
  2068. display: grid;
  2069. justify-content: flex-start;
  2070. align-items: center;
  2071. grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
  2072. gap: 30px;
  2073. .warp-page-card{
  2074. cursor: pointer;
  2075. justify-content: flex-start;
  2076. width: 100%;
  2077. height: 400px;
  2078. display: grid;
  2079. border: 1px solid transparent;
  2080. border-radius: 16px;
  2081. background-clip: padding-box, border-box;
  2082. background-origin: padding-box, border-box;
  2083. background-image: linear-gradient(345deg, #08113e, #2220), linear-gradient(345deg, #fffdfd6b, #00000000, #00000000, #00000000);
  2084. .warp-page-img{
  2085. cursor: pointer;
  2086. height: 200px;
  2087. background-size: cover;
  2088. border-radius: 16px 16px 0px 0px;
  2089. }
  2090. .warp-page-text{
  2091. padding: 0px 20px 20px 20px;
  2092. // height: 200px;
  2093. // font-size: 24px;
  2094. color: #c7c2c2;
  2095. .warp-page-text-title{
  2096. font-weight: bold;
  2097. margin: 10px 0px;
  2098. color: #ffffff;
  2099. }
  2100. .warp-page-text-desc{
  2101. display: -webkit-box;
  2102. -webkit-box-orient: vertical;
  2103. -webkit-line-clamp: 5; /* 限制显示4行 */
  2104. line-clamp: 5; /* 标准属性 */
  2105. overflow: hidden;
  2106. text-overflow: ellipsis;
  2107. }
  2108. }
  2109. transition: all 0.3s ease;
  2110. &:hover {
  2111. background-color: #152736;
  2112. transform: translateY(-5px);
  2113. box-shadow: 0 4px 12px rgba(24, 144, 255, 0.4);
  2114. }
  2115. }
  2116. }
  2117. </style>