-
10.env.development
-
6.env.production
-
3index.html
-
2package.json
-
286pnpm-lock.yaml
-
BINpublic/favicon.ico
-
1src/App.vue
-
6src/assets/base.css
-
0src/assets/images/appal.png
-
0src/assets/images/homeIcon (1).png
-
0src/assets/images/homeIcon (2).png
-
0src/assets/images/homeIcon (3).png
-
0src/assets/images/homeIcon (4).png
-
0src/assets/images/homeTit.png
-
0src/assets/images/homeicon.png
-
0src/assets/images/homeicon2.png
-
0src/assets/images/joinus.png
-
BINsrc/assets/images/jxQrcode.png
-
6src/components/bottoms/bottoms.vue
-
17src/components/top/top.vue
-
32src/http/api.js
-
48src/http/request.js
-
7src/main.js
-
19src/router/index.js
-
43src/utils/utils.js
-
15src/views/AboutView.vue
-
9src/views/HomeView.vue
-
17src/views/aboutUs/aboutUs.vue
-
2src/views/contactUs/contactUs.vue
-
344src/views/home/home.vue
-
2src/views/joinUs/joinUs.vue
-
48src/views/news/detils.vue
-
61src/views/news/news.vue
-
31src/views/solution/solution.vue
-
16vite.config.js
@ -0,0 +1,10 @@ |
|||||
|
# 变量必须以 VITE_ 为前缀才能暴露给外部读取 |
||||
|
|
||||
|
VITE_APP_PORT = 3000 |
||||
|
|
||||
|
|
||||
|
# 开发环境配置 |
||||
|
VITE_APP_ENV = 'development' |
||||
|
|
||||
|
# 若依管理系统/开发环境 |
||||
|
VITE_APP_BASE_API = '/dev-api' |
@ -0,0 +1,6 @@ |
|||||
|
# 变量必须以 VITE_ 为前缀才能暴露给外部读取 |
||||
|
|
||||
|
VITE_APP_PORT = 3000 |
||||
|
|
||||
|
VITE_APP_BASE_API = 'https://www.jaxc.cn/gzpt/' |
||||
|
|
Before Width: 754 | Height: 633 | Size: 124 KiB After Width: 754 | Height: 633 | Size: 124 KiB |
Before Width: 62 | Height: 62 | Size: 3.2 KiB After Width: 62 | Height: 62 | Size: 3.2 KiB |
Before Width: 62 | Height: 62 | Size: 3.8 KiB After Width: 62 | Height: 62 | Size: 3.8 KiB |
Before Width: 62 | Height: 62 | Size: 4.9 KiB After Width: 62 | Height: 62 | Size: 4.9 KiB |
Before Width: 62 | Height: 62 | Size: 4.1 KiB After Width: 62 | Height: 62 | Size: 4.1 KiB |
Before Width: 1920 | Height: 218 | Size: 108 KiB After Width: 1920 | Height: 218 | Size: 108 KiB |
Before Width: 123 | Height: 100 | Size: 11 KiB After Width: 123 | Height: 100 | Size: 11 KiB |
Before Width: 123 | Height: 100 | Size: 7.4 KiB After Width: 123 | Height: 100 | Size: 7.4 KiB |
Before Width: 1920 | Height: 477 | Size: 367 KiB After Width: 1920 | Height: 477 | Size: 367 KiB |
After Width: 400 | Height: 400 | Size: 12 KiB |
@ -0,0 +1,32 @@ |
|||||
|
|
||||
|
|
||||
|
import request from './request' |
||||
|
|
||||
|
// 获取新闻数据
|
||||
|
export const querySimpleIndustryDynamics = (data) => { |
||||
|
return request({ |
||||
|
url: '/index/querySimpleIndustryDynamics.do', |
||||
|
method: 'post', |
||||
|
data |
||||
|
}) |
||||
|
} |
||||
|
// 获取新闻详情
|
||||
|
export const getIndustryDynamicDetails = (industryDynamicId) => { |
||||
|
return request({ |
||||
|
url: '/index/getIndustryDynamicDetails.do', |
||||
|
method: 'get', |
||||
|
params: { |
||||
|
industryDynamicId |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
// 获取报名数据
|
||||
|
export const indexCollectList = (data) => { |
||||
|
return request({ |
||||
|
url: '/index/indexCollectList.do', |
||||
|
method: 'post', |
||||
|
data |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
|
@ -0,0 +1,48 @@ |
|||||
|
import axios from 'axios'; |
||||
|
import {ElMessage} from 'element-plus'; |
||||
|
import router from '@/router'; |
||||
|
|
||||
|
const service = axios.create({ |
||||
|
baseURL: import.meta.env.VITE_APP_BASE_API |
||||
|
}); |
||||
|
|
||||
|
// 请求拦截器
|
||||
|
service.interceptors.request.use( |
||||
|
config => { |
||||
|
|
||||
|
return config; |
||||
|
}, |
||||
|
error => Promise.reject(error), |
||||
|
); |
||||
|
|
||||
|
// 响应拦截器
|
||||
|
service.interceptors.response.use( |
||||
|
response => { |
||||
|
const {code, msg} = response.data; |
||||
|
const logoutCodes = [207, 200, 403, 8001, 703]; |
||||
|
|
||||
|
if (logoutCodes.includes(code)) { |
||||
|
if (!service.msg) { |
||||
|
service.msg = ElMessage({ |
||||
|
type: 'error', |
||||
|
message: msg || 'Error', |
||||
|
onClose: () => service.msg = null, |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
const {pathname, search} = window.location; |
||||
|
router.replace({ path: `/login?redirect=${pathname + search}` }); |
||||
|
} else { |
||||
|
return response.data; |
||||
|
} |
||||
|
}, |
||||
|
error => { |
||||
|
if (error.response.data) { |
||||
|
const {code, msg} = error.response.data; |
||||
|
ElMessage.error(msg || '系统出错'); |
||||
|
} |
||||
|
return Promise.reject(error.message); |
||||
|
}, |
||||
|
); |
||||
|
|
||||
|
export default service; |
@ -0,0 +1,43 @@ |
|||||
|
|
||||
|
|
||||
|
// 日期格式化
|
||||
|
export function parseTime(time, pattern) { |
||||
|
if (arguments.length === 0 || !time) { |
||||
|
return null |
||||
|
} |
||||
|
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' |
||||
|
let date |
||||
|
if (typeof time === 'object') { |
||||
|
date = time |
||||
|
} else { |
||||
|
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { |
||||
|
time = parseInt(time) |
||||
|
} else if (typeof time === 'string') { |
||||
|
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), ''); |
||||
|
} |
||||
|
if ((typeof time === 'number') && (time.toString().length === 10)) { |
||||
|
time = time * 1000 |
||||
|
} |
||||
|
date = new Date(time) |
||||
|
} |
||||
|
const formatObj = { |
||||
|
y: date.getFullYear(), |
||||
|
m: date.getMonth() + 1, |
||||
|
d: date.getDate(), |
||||
|
h: date.getHours(), |
||||
|
i: date.getMinutes(), |
||||
|
s: date.getSeconds(), |
||||
|
a: date.getDay() |
||||
|
} |
||||
|
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { |
||||
|
let value = formatObj[key] |
||||
|
// Note: getDay() returns 0 on Sunday
|
||||
|
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } |
||||
|
if (result.length > 0 && value < 10) { |
||||
|
value = '0' + value |
||||
|
} |
||||
|
return value || 0 |
||||
|
}) |
||||
|
return time_str |
||||
|
} |
||||
|
|
@ -1,15 +0,0 @@ |
|||||
<template> |
|
||||
<div class="about"> |
|
||||
<h1>This is an about page</h1> |
|
||||
</div> |
|
||||
</template> |
|
||||
|
|
||||
<style> |
|
||||
@media (min-width: 1024px) { |
|
||||
.about { |
|
||||
min-height: 100vh; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
} |
|
||||
} |
|
||||
</style> |
|
@ -1,9 +0,0 @@ |
|||||
<script setup> |
|
||||
import TheWelcome from '../components/TheWelcome.vue' |
|
||||
</script> |
|
||||
|
|
||||
<template> |
|
||||
<main> |
|
||||
<TheWelcome /> |
|
||||
</main> |
|
||||
</template> |
|
@ -0,0 +1,344 @@ |
|||||
|
<template> |
||||
|
<div class="aboutUs"> |
||||
|
<div class="banner"> |
||||
|
<img src="@/assets/images/homebanner.png" alt=""> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<div class="container" ref="con1Ref"> |
||||
|
<div class="titleBox"> |
||||
|
<titles :text="{ h1: '公司介绍', tps: '驾培行业数字化改革全域解决方案开发商' }" /> |
||||
|
</div> |
||||
|
<div class="con1"> |
||||
|
<div class="leftTxt"> |
||||
|
<div class="p"> |
||||
|
<div class="h1">杭州钧安科技</div> |
||||
|
<div class="text">杭州钧安科技有限公司,成立于2021年1月,是一家专注于为驾培行业数字化改革提供技术支持和服务,为行业提供数字化解决方案的软件开发公司。</div> |
||||
|
<div class="text2"> |
||||
|
公司的骨干均是在驾培行业、互联网行业、深耕多年有着丰富经验的人员。公司秉承“精心服务,用户至上”的服务宗旨,为驾校提供推广招生服务及驾校管理系统,为用户提供集找驾校、报名、缴费、学车于一体的一站式平台,为行业管理部门提供行业监管治理平台,公司致力于为驾培行业创新、发展,提升行业数字化服务水平做出贡献。 |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="rightImg"> |
||||
|
<img src="@/assets/images/onething.png" alt=""> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="con2" ref="con4Ref"> |
||||
|
<div class="container"> |
||||
|
<div class="titleBox"> |
||||
|
<titles :text="{ h1: '数字驾培解决方案', tps: '学驾资金监管解决方案、行业监管治理解决方案' }" /> |
||||
|
</div> |
||||
|
<div class="flex-b"> |
||||
|
<div class="item"> |
||||
|
<div class="icon"><img src="@/assets/images/homeicon.png" alt=""></div> |
||||
|
<div class="h2">学驾资金监管解决方案</div> |
||||
|
<div class="txt">用户——找驾校——身份验证——填报名表——电子合同签署——确 认订单支付缴费——报名成功——资金流(第三方支付平台T+1工作 |
||||
|
日)——驾校资金监管户——驾校自有资金账户</div> |
||||
|
<div class="btn" @click="router.push('/solution?offsetTops=con2Top')">查看更多</div> |
||||
|
</div> |
||||
|
<div class="item"> |
||||
|
<div class="icon"><img src="@/assets/images/homeicon2.png" alt=""></div> |
||||
|
<div class="h2">行业监管治理解决方案</div> |
||||
|
<div class="txt"> |
||||
|
· 行业基础数据归集赋码管理 <br> · 业务管理 <br>· 行业监测预警处置分析 <br>· 行业态势研判分析 |
||||
|
</div> |
||||
|
<div class="btn" @click="router.push('/solution?offsetTops=con3Top')">查看更多</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="con3"> |
||||
|
<div class="tit"><img src="@/assets/images/homeTit.png" alt=""></div> |
||||
|
<div class="container"> |
||||
|
<div class="leftImg"> |
||||
|
<img src="@/assets/images/appal.png" alt=""> |
||||
|
</div> |
||||
|
<div class="rightText"> |
||||
|
<div class="h2">“浙里学车”平台</div> |
||||
|
<div class="txt">“浙里学车”平台应用场景投入使用后,杭州市委常委、常务副市长戴建平等领导听取场景汇报,并给予了充分肯定;</div> |
||||
|
<div class="txt">中国交通报头版、中国新闻网、浙江交通旅游导报、浙江新闻网、钱江晚报、杭州日报、钱江频道、杭州一套等30多家国家、省市媒体对改革场景进行了专题正面报道;</div> |
||||
|
<div class="txt">入选2021年杭州市党史学习教育“民呼我为”最佳实践案例。</div> |
||||
|
<div class="ul"> |
||||
|
<div class="li"> |
||||
|
<div class="icon"><img src="@/assets/images/homeIcon (2).png" alt=""></div> |
||||
|
<div class="rightTxt"> |
||||
|
<div class="numRow"> |
||||
|
<div class="num">{{ (info.studentCount / 10000).toFixed(1) }}</div> |
||||
|
<div class="unit">万</div> |
||||
|
</div> |
||||
|
<div class="lab">累计报名学员</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="li"> |
||||
|
<div class="icon"><img src="@/assets/images/homeIcon (3).png" alt=""></div> |
||||
|
<div class="rightTxt"> |
||||
|
<div class="numRow"> |
||||
|
<div class="num">7.3</div> |
||||
|
<div class="unit">亿+</div> |
||||
|
</div> |
||||
|
<div class="lab">学员学费监管账户累计监管资金总额</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="li"> |
||||
|
<div class="icon"><img src="@/assets/images/homeIcon (4).png" alt=""></div> |
||||
|
<div class="rightTxt"> |
||||
|
<div class="numRow"> |
||||
|
<div class="num">30</div> |
||||
|
<div class="unit">万+</div> |
||||
|
</div> |
||||
|
<div class="lab">APP累计下载量</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="li"> |
||||
|
<div class="icon"><img src="@/assets/images/homeIcon (1).png" alt=""></div> |
||||
|
<div class="rightTxt"> |
||||
|
<div class="numRow"> |
||||
|
<div class="num">30</div> |
||||
|
<div class="unit">%</div> |
||||
|
</div> |
||||
|
<div class="lab">资金监管账户留存率</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, onMounted, nextTick } from 'vue' |
||||
|
import titles from '@/components/title/title.vue' |
||||
|
|
||||
|
import { useRouter } from 'vue-router' |
||||
|
const router = useRouter() |
||||
|
|
||||
|
|
||||
|
import { indexCollectList } from '@/http/api' |
||||
|
const info = ref({}) |
||||
|
async function indexCollectListFn() { |
||||
|
const { data: res } = await indexCollectList() |
||||
|
info.value = res |
||||
|
console.log(res) |
||||
|
} |
||||
|
indexCollectListFn() |
||||
|
|
||||
|
|
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.banner { |
||||
|
width: 100%; |
||||
|
|
||||
|
img { |
||||
|
display: block; |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.map { |
||||
|
width: 1280px; |
||||
|
height: 400px; |
||||
|
border-radius: 10px; |
||||
|
overflow: hidden; |
||||
|
margin-top: 30px; |
||||
|
} |
||||
|
|
||||
|
.con4 { |
||||
|
padding: 60px 0 150px 0; |
||||
|
background: #F6F7F8; |
||||
|
|
||||
|
.h2 { |
||||
|
font-size: 24px; |
||||
|
font-weight: 700; |
||||
|
padding: 20px 0; |
||||
|
} |
||||
|
|
||||
|
.txt { |
||||
|
font-size: 16px; |
||||
|
margin-bottom: 14px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.con1 { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
|
||||
|
.leftTxt { |
||||
|
color: #333; |
||||
|
padding-right: 120px; |
||||
|
flex: 1; |
||||
|
|
||||
|
.p { |
||||
|
|
||||
|
.text { |
||||
|
margin-bottom: 20px; |
||||
|
font-size: 22px; |
||||
|
} |
||||
|
|
||||
|
.text2 { |
||||
|
margin-bottom: 20px; |
||||
|
font-size: 16px; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
.h1 { |
||||
|
font-size: 24px; |
||||
|
margin-bottom: 25px; |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.con2 { |
||||
|
padding: 30px 0 96px 0; |
||||
|
background: #F6F7F8; |
||||
|
|
||||
|
.flex-b { |
||||
|
display: flex; |
||||
|
width: 100%; |
||||
|
justify-content: space-between; |
||||
|
|
||||
|
.item { |
||||
|
display: flex; |
||||
|
width: 48%; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
background: #fff; |
||||
|
border-radius: 10px; |
||||
|
padding: 106px 130px 60px 130px; |
||||
|
|
||||
|
&:hover { |
||||
|
// background: linear-gradient( 180deg, #53D3E5 0%, #3593FB 100%); |
||||
|
box-shadow: 0px 2px 24px 0px rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.icon { |
||||
|
width: 123px; |
||||
|
height: 100px; |
||||
|
|
||||
|
img { |
||||
|
display: block; |
||||
|
width: 100%; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.h2 { |
||||
|
font-size: 24px; |
||||
|
padding: 73px 0 25px 0; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
.txt { |
||||
|
font-size: 16px; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.btn { |
||||
|
width: 178px; |
||||
|
height: 40px; |
||||
|
background: #1989FA; |
||||
|
border-radius: 2px; |
||||
|
font-size: 16px; |
||||
|
margin-top: 140px; |
||||
|
color: #fff; |
||||
|
text-align: center; |
||||
|
line-height: 40px; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.con3 { |
||||
|
width: 100%; |
||||
|
padding: 20px 0 74px 0; |
||||
|
background: #1C232B; |
||||
|
.tit { |
||||
|
width: 100%; |
||||
|
img {display: block;width: 100%;} |
||||
|
} |
||||
|
|
||||
|
.container { |
||||
|
display: flex; |
||||
|
background: #fff; |
||||
|
border-radius: 10px; |
||||
|
.leftImg { |
||||
|
flex: 1; |
||||
|
background: #F6F7F8; |
||||
|
img { |
||||
|
width: 100%; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.rightText { |
||||
|
flex: 1; |
||||
|
width: 0; |
||||
|
padding: 0 56px 0 70px; |
||||
|
.h2 { |
||||
|
font-size: 24px; |
||||
|
font-weight: 700; |
||||
|
color: #333; |
||||
|
margin-top: 65px; |
||||
|
} |
||||
|
|
||||
|
.txt { |
||||
|
font-size: 16px; |
||||
|
color: #666; |
||||
|
margin-top: 20px; |
||||
|
} |
||||
|
|
||||
|
.ul { |
||||
|
display: flex; |
||||
|
flex-wrap: wrap; |
||||
|
margin-top: 30px; |
||||
|
.li { |
||||
|
width: 50%; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 40px; |
||||
|
.icon { |
||||
|
width: 62px; |
||||
|
height: 62px; |
||||
|
img {} |
||||
|
} |
||||
|
|
||||
|
.rightTxt { |
||||
|
flex: 1; |
||||
|
width: 0; |
||||
|
padding-left: 6px; |
||||
|
.numRow { |
||||
|
display: flex; |
||||
|
.num {font-size: 28px;font-weight: 700;} |
||||
|
.unit { |
||||
|
font-size: 14px; |
||||
|
font-weight: 400; |
||||
|
margin-top: 14px; |
||||
|
margin-left: 4px; |
||||
|
color: #999; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.lab { |
||||
|
font-size: 14px; |
||||
|
color: #333; |
||||
|
margin-top: 3px; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,48 @@ |
|||||
|
|
||||
|
<template> |
||||
|
<div class="container"> |
||||
|
<div class="back" @click="router.back()"> |
||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="backSvg" viewBox="0 0 1024 1024" ><path fill="currentColor" d="M224 480h640a32 32 0 1 1 0 64H224a32 32 0 0 1 0-64"></path><path fill="currentColor" d="m237.248 512 265.408 265.344a32 32 0 0 1-45.312 45.312l-288-288a32 32 0 0 1 0-45.312l288-288a32 32 0 1 1 45.312 45.312z"></path></svg> |
||||
|
<div class="txt">返回</div> |
||||
|
|
||||
|
</div> |
||||
|
<div v-html="info.content"></div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref } from 'vue' |
||||
|
import { useRoute, useRouter } from 'vue-router' |
||||
|
const route = useRoute() |
||||
|
const router = useRouter() |
||||
|
import { getIndustryDynamicDetails } from '@/http/api' |
||||
|
|
||||
|
const info = ref({}) |
||||
|
async function getIndustryDynamicDetailsFn() { |
||||
|
const { data: res } = await getIndustryDynamicDetails(route.query.industryDynamicId) |
||||
|
console.log(res) |
||||
|
info.value = res |
||||
|
|
||||
|
} |
||||
|
getIndustryDynamicDetailsFn() |
||||
|
|
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.container { |
||||
|
padding: 30px 0; |
||||
|
} |
||||
|
.back { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 20px; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.txt { |
||||
|
font-size: 18px; color: var(--el-menu-active-color);margin-right: 4px; |
||||
|
} |
||||
|
.backSvg { |
||||
|
width: 30px; |
||||
|
color: var(--el-menu-active-color); |
||||
|
} |
||||
|
</style> |