-
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
-
119src/views/news/news.vue
-
111src/views/solution/solution.vue
-
18vite.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> |