feat: 钉钉适配

dingtalk
xjs 2025-09-05 09:30:04 +08:00
parent 4bcb347d4a
commit 7c4cedaeff
54 changed files with 488 additions and 341 deletions

View File

@ -59,8 +59,4 @@
"package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,LICENSE,.gitattributes,.gitignore,.gitpod.yml,CNAME,.npmrc,.browserslistrc",
".eslintrc.cjs": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.*,.prettierrc.*,.stylelintrc.*,.eslintrc-auto-import.json,.editorconfig,.commitlint.cjs"
},
"vetur.validation.template": false,
"vetur.validation.script": false,
"vetur.validation.style": false,
"vetur.experimental.templateInterpolationService": true
}

View File

@ -106,6 +106,7 @@
"@tanstack/vue-query": "^5.62.16",
"abortcontroller-polyfill": "^1.7.8",
"dayjs": "1.11.10",
"htmlparser2": "^10.0.0",
"pinia": "2.0.36",
"pinia-plugin-persistedstate": "3.2.1",
"pinyin-pro": "^3.26.0",

View File

@ -68,6 +68,9 @@ importers:
dayjs:
specifier: 1.11.10
version: 1.11.10
htmlparser2:
specifier: ^10.0.0
version: 10.0.0
pinia:
specifier: 2.0.36
version: 2.0.36(typescript@5.7.2)(vue@3.4.21(typescript@5.7.2))
@ -3063,6 +3066,9 @@ packages:
domutils@3.1.0:
resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
domutils@3.2.2:
resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
dot-prop@5.3.0:
resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
engines: {node: '>=8'}
@ -3129,6 +3135,10 @@ packages:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
entities@6.0.1:
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
engines: {node: '>=0.12'}
env-paths@2.2.1:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
@ -3825,6 +3835,9 @@ packages:
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
engines: {node: '>=8'}
htmlparser2@10.0.0:
resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==}
htmlparser2@3.10.1:
resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
@ -10612,6 +10625,12 @@ snapshots:
domelementtype: 2.3.0
domhandler: 5.0.3
domutils@3.2.2:
dependencies:
dom-serializer: 2.0.0
domelementtype: 2.3.0
domhandler: 5.0.3
dot-prop@5.3.0:
dependencies:
is-obj: 2.0.0
@ -10661,6 +10680,8 @@ snapshots:
entities@4.5.0: {}
entities@6.0.1: {}
env-paths@2.2.1: {}
environment@1.1.0: {}
@ -11631,6 +11652,13 @@ snapshots:
html-tags@3.3.1: {}
htmlparser2@10.0.0:
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
domutils: 3.2.2
entities: 6.0.1
htmlparser2@3.10.1:
dependencies:
domelementtype: 1.3.1

View File

@ -2,7 +2,7 @@
<!-- TabBar占位块 - 与TabBar高度一致 -->
<view
v-if="showPlaceholder"
class="tabbar-placeholder"
class="tabbar-placeholder mb-safe"
:style="{ height: `${tabbarTotalHeight}px` }"
></view>
@ -71,7 +71,6 @@ const changeItem = (item: TabesItem) => {
onMounted(() => {
uni.hideTabBar()
//
uni.getSystemInfo({
success: (res) => {
@ -162,4 +161,9 @@ defineExpose({
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
.mb-safe {
margin-bottom: constant(safe-area-inset-bottom);
margin-bottom: env(safe-area-inset-bottom);
}
</style>

View File

@ -35,9 +35,7 @@
import { useCityNewTop, newsList } from '@/hooks/useCityInfoHook'
import { News } from '@/types/app-type'
onShow(() => {
useCityNewTop()
})
useCityNewTop()
const handleClick = (item: News) => {
uni.navigateTo({

View File

@ -1,22 +1,16 @@
<template>
<view class="navbar">
<!-- 状态栏占位 -->
<view
v-if="safeAreaInsetTop"
class="status-bar"
:style="{ height: statusBarHeight + 'px', backgroundColor: bgColor }"
></view>
<view v-if="safeAreaInsetTop" class="status-bar"
:style="{ height: statusBarHeight + 'px', backgroundColor: bgColor }"></view>
<!-- 导航栏主体 -->
<view
class="navbar-content"
:class="[contentClass, fixed ? 'navbar-fixed' : '', bordered ? 'navbar-border' : '']"
<view class="navbar-content" :class="[contentClass, fixed ? 'navbar-fixed' : '', bordered ? 'navbar-border' : '']"
:style="{
backgroundColor: bgColor,
height: navHeight + 'px',
top: fixed ? (safeAreaInsetTop ? statusBarHeight : 0) + 'px' : '0',
}"
>
}">
<!-- 左侧区域 -->
<view class="navbar-left" @click="handleClickLeft">
<view v-if="leftArrow" class="back-icon">
@ -39,13 +33,10 @@
</view>
<!-- 占位元素 -->
<view
v-if="placeholder && fixed"
:style="{
height: `${navHeight}px`,
backgroundColor: bgColor,
}"
></view>
<view v-if="placeholder && fixed" :style="{
height: `${navHeight}px`,
backgroundColor: bgColor,
}"></view>
<slot name="background"></slot>
</view>
</template>
@ -95,7 +86,6 @@ const emit = defineEmits(['clickLeft'])
const systemInfo = getWindowInfo()
const deviceInfo = getDeviceInfo()
const statusBarHeight = systemInfo.statusBarHeight || 0
//
@ -196,8 +186,7 @@ const handleClickLeft = () => {
@font-face {
font-family: 'iconfont';
src: url('data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAAKYAAsAAAAABlAAAAJMAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACCcApcdgE2AiQDCAsGAAQgBYRnBzYbmQXIHpIkBQQKkYCABBEPz2/t/XN3twEbowBkQTxQEQ1RKaKSxEOi0agkJKF5Qvj/f037IFKwlZ2dWU2tJu0EhPwHkBwgOVAclKcvAQpI/v/fz/08XECy+YBymmPQiwIcSmhAY4uSFcgJ+IaxC1zCYwLtRjWSnZ2rGgQWBowLxCPrVBBYllQqNTQ0VISaBXEHtTRNUwW4jb4f/xYEC0kqMzDx6CGrQuKXxKc6Zf7POYQgQHs5kIwjYwEoxK3G/DpRwbi0dlNwKKjAL4lf6vw/R2zVWvTPIwuiCnp2wCRUZ3yJX5pJFVDfByyAFR2AblMAX/OR3t7+zOJi8GyyfzC1uQXLZvtnk/0zyfTy+PvH0/Xp5OzR98/H797/+/fDu3d/3739+/fd+/+nmxvLc5vrS+sry2vz84tLs9Mzc4vzs9NTM/Ozc1OzM3MzU/Mz0wvTU4vTk0tTE8uTEyuT4yv/G0E3XUxv7wwNbu/s9G8fbO9v7+3sb+3ubW4dbO4dbO3vbu4dbO3JzqPFtRE4gEGAX0NBkL+hpCZALkEp5FKUQqE0NHlXJIGrDNAOcEQBCHU+kXT5QNblC7kEv1EK9Y9SB/8o7YYu2m0YXrJLouNIjQJhH+QbVkVZrUQ+YuqzUJdzxPMHhdIj0+hg4o0D8ogj5r5bSoQUxjADz+A8hBDQFEYwh3mommXTul7Vm5ZtqAqJHIdoKCDYDyQ3mCqUG1YKn5+C0s0yiJ/qKVAQedKAhg6Y3mEHJBQaWKnvLVMiiEIxGAY8Aw6HIAhAJmEIzIIOUjLTTAB1taL1QvNq+fYN7QDjcc2okeioaOmy5LFXt3QAAAAA')
format('woff2');
src: url('data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAAKYAAsAAAAABlAAAAJMAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACCcApcdgE2AiQDCAsGAAQgBYRnBzYbmQXIHpIkBQQKkYCABBEPz2/t/XN3twEbowBkQTxQEQ1RKaKSxEOi0agkJKF5Qvj/f037IFKwlZ2dWU2tJu0EhPwHkBwgOVAclKcvAQpI/v/fz/08XECy+YBymmPQiwIcSmhAY4uSFcgJ+IaxC1zCYwLtRjWSnZ2rGgQWBowLxCPrVBBYllQqNTQ0VISaBXEHtTRNUwW4jb4f/xYEC0kqMzDx6CGrQuKXxKc6Zf7POYQgQHs5kIwjYwEoxK3G/DpRwbi0dlNwKKjAL4lf6vw/R2zVWvTPIwuiCnp2wCRUZ3yJX5pJFVDfByyAFR2AblMAX/OR3t7+zOJi8GyyfzC1uQXLZvtnk/0zyfTy+PvH0/Xp5OzR98/H797/+/fDu3d/3739+/fd+/+nmxvLc5vrS+sry2vz84tLs9Mzc4vzs9NTM/Ozc1OzM3MzU/Mz0wvTU4vTk0tTE8uTEyuT4yv/G0E3XUxv7wwNbu/s9G8fbO9v7+3sb+3ubW4dbO4dbO3vbu4dbO3JzqPFtRE4gEGAX0NBkL+hpCZALkEp5FKUQqE0NHlXJIGrDNAOcEQBCHU+kXT5QNblC7kEv1EK9Y9SB/8o7YYu2m0YXrJLouNIjQJhH+QbVkVZrUQ+YuqzUJdzxPMHhdIj0+hg4o0D8ogj5r5bSoQUxjADz+A8hBDQFEYwh3mommXTul7Vm5ZtqAqJHIdoKCDYDyQ3mCqUG1YKn5+C0s0yiJ/qKVAQedKAhg6Y3mEHJBQaWKnvLVMiiEIxGAY8Aw6HIAhAJmEIzIIOUjLTTAB1taL1QvNq+fYN7QDjcc2okeioaOmy5LFXt3QAAAAA') format('woff2');
}
.back-text {

View File

@ -101,11 +101,9 @@ const handleClickPrivacyPolicy = () => {
}
const getPhoneNumber = async (e: any) => {
console.log(e);
if (e.detail.errMsg == 'getPhoneNumber:ok') {
const detail = e.detail
let _getPhoneInfo = {
const _getPhoneInfo = {
iv: detail.iv,
encryptedData: detail.encryptedData,
code: detail.code,
@ -131,12 +129,11 @@ const handleClick = () => {
title: '您需先同意《服务条款》和《隐私条款》',
icon: 'none',
})
return
}
}
const getUserInfo = async (_code: string) => {
let userInfo = (await useLogin()) as { code: string; errMsg: string }
const userInfo = (await useLogin()) as { code: string; errMsg: string }
if (userInfo.errMsg == 'login:ok') {
const resp = await getSessionKey({ JsCode: userInfo.code })
@ -167,8 +164,8 @@ const getUserInfo = async (_code: string) => {
if (resp.code === 200) {
//
getVolunteerInitialization().then((res) => {
let list = res.result as any[]
let code = infoData.userExtend ? infoData.userExtend.provinceCode : ''
const list = res.result as any[]
const code = infoData.userExtend ? infoData.userExtend.provinceCode : ''
let addressItem: City
if (code !== '') {
for (let i = 0; i < list.length; i++) {

View File

@ -1,7 +1,7 @@
<route lang="json5" type="page">
{
style: {
navigationBarTitleText: '新高考选科'
navigationBarTitleText: '新高考选科',
},
}
</route>
@ -16,7 +16,7 @@
mode="aspectFit"
></image>
</view>
<!-- #ifdef MP-WEIXIN -->
<button
class="w-[493rpx]! mb-[40rpx] h-[88rpx]! rounded-[44rpx] text-[32rpx] text-white flex items-center justify-center"
:class="checked.length > 0 ? 'bg-[#1580FF]' : 'bg-[#BFBFBF]'"
@ -27,6 +27,17 @@
>
一键登录
</button>
<!-- #endif -->
<!-- #ifdef MP-ALIPAY -->
<button
class="w-[493rpx]! mb-[40rpx] h-[88rpx]! rounded-[44rpx] text-[32rpx] text-white flex items-center justify-center"
:class="checked.length > 0 ? 'bg-[#1580FF]' : 'bg-[#BFBFBF]'"
@click.stop="handleClick"
>
一键登录
</button>
<!-- #endif -->
<view class="flex items-center flex-nowrap">
<CheckboxGroup v-model="checked" class="check-class mr-[10rpx]">
@ -72,11 +83,9 @@ const checked = ref([]) // 是否同意条款
const getPhoneInfo = ref(null)
const getPhoneNumber = async (e: any) => {
console.log(e.detail);
if (e.detail.errMsg == 'getPhoneNumber:ok') {
const detail = e.detail
let _getPhoneInfo = {
const _getPhoneInfo = {
iv: detail.iv,
encryptedData: detail.encryptedData,
code: detail.code,
@ -102,8 +111,18 @@ const handleClick = () => {
title: '您需先同意《服务条款》和《隐私条款》',
icon: 'none',
})
return
}
// #ifdef MP-ALIPAY
dd.getAuthCode({
corpId: '3912995586',
success: (res) => {
const { authCode } = res
console.log(res)
},
fail: () => {},
complete: () => {},
})
// #endif
}
//
@ -130,7 +149,7 @@ const handleClickPrivacyPolicy = () => {
const userStore = useUserStore()
const getUserInfo = async (_code: string) => {
let userInfo = (await useLogin()) as { code: string; errMsg: string }
const userInfo = (await useLogin()) as { code: string; errMsg: string }
if (userInfo.errMsg == 'login:ok') {
const resp = await getSessionKey({ JsCode: userInfo.code })
@ -165,8 +184,8 @@ const getUserInfo = async (_code: string) => {
//
getVolunteerInitialization()
.then((res) => {
let list = res.result as any[]
let code = infoData.userExtend ? infoData.userExtend.provinceCode : ''
const list = res.result as any[]
const code = infoData.userExtend ? infoData.userExtend.provinceCode : ''
let addressItem: City
if (code !== '') {
for (let i = 0; i < list.length; i++) {

View File

@ -13,18 +13,21 @@
:class="[contentClass, fixed ? 'navbar-fixed' : '', bordered ? 'navbar-border' : '']"
:style="{
backgroundColor: bgColor,
height: navHeight + 'px',
height: `${navHeight}px`,
top: fixed ? (safeAreaInsetTop ? statusBarHeight : 0) + 'px' : '0',
}"
>
<!-- 左侧区域 -->
<view class="navbar-left" @click="handleClickLeft">
<view
:class="`navbar-left ${leftWidthMin ? 'min-w-[48rpx]' : ''} min-w-[48rpx]`"
@click="handleClickLeft"
>
<!-- #ifndef MP-ALIPAY -->
<view v-if="leftArrow" class="back-icon">
<view class="i-carbon-chevron-left text-[40rpx] text-[#333] font-semibold icon-class" />
</view>
<!-- #endif -->
<slot name="left"></slot>
</view>
<!-- 中间标题区域 -->
<view class="navbar-title">
<slot name="title">
@ -52,9 +55,8 @@
<script lang="ts" setup>
import { getDeviceInfo, getWindowInfo } from '@/utils/tools'
import { computed } from 'vue'
const props = defineProps({
defineProps({
title: {
type: String,
default: '',
@ -87,13 +89,18 @@ const props = defineProps({
type: String,
default: 'justify-between',
},
leftWidthMin: {
type: Boolean,
default: false,
},
})
const emit = defineEmits(['clickLeft'])
//
const systemInfo = getWindowInfo()
const deviceInfo = getDeviceInfo()
const systemInfo = getWindowInfo()
const statusBarHeight = systemInfo.statusBarHeight || 0
//

View File

@ -26,10 +26,12 @@
<view class="overflow-auto relative mt-[40rpx] flex-1 pb-[20rpx]">
<!-- 顶部卡片 -->
<view class="flex flex-col pt-[32rpx] px-[84rpx] h-[244rpx] mb-[-116rpx] font-700">
<image
src="https://api.static.ycymedu.com/src/images/evaluate/bg.png"
class="header-bg"
/>
<view class="header-bg">
<image
src="https://api.static.ycymedu.com/src/images/evaluate/bg.png"
class="w-full h-full"
/>
</view>
<text class="text-[#333] text-[28rpx] mb-[14rpx] z-2">您的性格类型为</text>
<text class="text-[#117CFC] text-[36rpx] z-2">{{ studyRecord.title }}</text>
</view>

View File

@ -1,22 +1,23 @@
<route lang="json5" type="page">
{
style: {
navigationBarTitleText: '兴趣测评报告'
navigationBarTitleText: '兴趣测评报告',
},
}
</route>
<template>
<view class="flex flex-col h-screen relative custom-bg">
<view class="flex-1 overflow-auto relative mt-[40rpx]">
<view class="overflow-auto relative mt-[40rpx] flex-1 pb-[20rpx]">
<!-- 顶部卡片 -->
<view class="flex flex-col pt-[32rpx] px-[84rpx] h-[244rpx] mb-[-116rpx] font-700">
<image
src="https://api.static.ycymedu.com/src/images/evaluate/bg.png"
class="header-bg"
/>
<view class="header-bg">
<image
src="https://api.static.ycymedu.com/src/images/evaluate/bg.png"
class="w-full h-full"
/>
</view>
<text class="text-[#333] text-[28rpx] mb-[14rpx] z-2">您的兴趣类型为</text>
<text class="text-[#117CFC] text-[36rpx] z-2">{{ studyRecord.title }}</text>
</view>

View File

@ -26,10 +26,12 @@
<view class="overflow-auto relative mt-[40rpx] flex-1 pb-[20rpx]">
<!-- 顶部卡片 -->
<view class="flex flex-col pt-[32rpx] px-[84rpx] h-[244rpx] mb-[-116rpx] font-700">
<image
src="https://api.static.ycymedu.com/src/images/evaluate/bg.png"
class="header-bg"
/>
<view class="header-bg">
<image
src="https://api.static.ycymedu.com/src/images/evaluate/bg.png"
class="w-full h-full"
/>
</view>
<text class="text-[#333] text-[28rpx] mb-[14rpx] z-2">您的职业价值观</text>
<text class="text-[#117CFC] text-[40rpx] z-2">{{ studyRecord.tag }}</text>
</view>

View File

@ -8,10 +8,12 @@
<view
class="rounded-[8rpx] border-[#1580FF] border-[2rpx] border-solid w-full py-[14rpx] flex items-center justify-center"
>
<image
src="https://api.static.ycymedu.com/images/btn-bottom.png"
class="w-[52rpx] h-[52rpx] mr-[10rpx]"
></image>
<view class="w-[52rpx] h-[52rpx] mr-[10rpx]">
<image
src="https://api.static.ycymedu.com/images/btn-bottom.png"
class="w-[52rpx] h-[52rpx]"
></image>
</view>
<text class="text-[#1580FF] text-[32rpx] font-700">智能AI顾问</text>
</view>
</view>

View File

@ -17,11 +17,13 @@
v-for="(person, index) in personList"
:key="index"
>
<image
:src="person.avatarUrl"
class="w-[120rpx] h-[120rpx] rounded-full"
mode="aspectFill"
></image>
<view class="w-[120rpx] h-[120rpx]">
<image
:src="person.avatarUrl"
class="w-[120rpx] h-[120rpx] rounded-full"
mode="aspectFill"
></image>
</view>
<text class="mt-[10rpx] text-[26rpx] text-[28rpx] font-normal text-center">
{{ person.nickName }}
</text>

View File

@ -13,11 +13,13 @@
</view>
<view class="relative mt-[68rpx] bg-[#F5FAFF]">
<image
src="https://api.static.ycymedu.com/src/images/home/test-icon.png"
mode="scaleToFill"
class="w-[180rpx] h-[52rpx] absolute top-[-9rpx] left-[20rpx]"
/>
<view class="absolute top-[-9rpx] left-[20rpx] w-[180rpx] h-[52rpx]">
<image
src="https://api.static.ycymedu.com/src/images/home/test-icon.png"
mode="scaleToFill"
class="w-[180rpx] h-[52rpx]"
/>
</view>
<view class="px-[20rpx] pb-[20rpx] pt-[58rpx] text-[#333] text-[26rpx]">
{{ description }}
</view>

View File

@ -2,11 +2,13 @@
<view class="flex flex-col bg-white rounded-[24rpx] p-[30rpx] gap-[40rpx]">
<view class="flex flex-col gap-[12rpx]">
<view class="flex items-center gap-[10rpx]">
<image
src="https://api.static.ycymedu.com/src/images/home/life-icon.png"
mode="scaleToFill"
class="w-[38rpx] h-[38rpx]"
/>
<view class="w-[38rpx] h-[38rpx]">
<image
src="https://api.static.ycymedu.com/src/images/home/life-icon.png"
mode="scaleToFill"
class="w-[38rpx] h-[38rpx]"
/>
</view>
<text class="text-[32rpx] text-[#000] font-700">生活建议</text>
</view>
<view class="text-[26rpx] text-[#666] font-400">
@ -16,11 +18,13 @@
</view>
<view class="flex flex-col gap-[12rpx]">
<view class="flex items-center gap-[10rpx]">
<image
src="https://api.static.ycymedu.com/src/images/home/diet-icon.png"
mode="scaleToFill"
class="w-[38rpx] h-[38rpx]"
/>
<view class="w-[38rpx] h-[38rpx]">
<image
src="https://api.static.ycymedu.com/src/images/home/diet-icon.png"
mode="scaleToFill"
class="w-[38rpx] h-[38rpx]"
/>
</view>
<text class="text-[32rpx] text-[#000] font-700">饮食建议</text>
</view>
<view class="text-[26rpx] text-[#666] font-400">
@ -30,11 +34,13 @@
</view>
<view class="flex flex-col gap-[12rpx]">
<view class="flex items-center gap-[10rpx]">
<image
src="https://api.static.ycymedu.com/src/images/home/learn-icon.png"
mode="scaleToFill"
class="w-[38rpx] h-[38rpx]"
/>
<view class="w-[38rpx] h-[38rpx]">
<image
src="https://api.static.ycymedu.com/src/images/home/learn-icon.png"
mode="scaleToFill"
class="w-[38rpx] h-[38rpx]"
/>
</view>
<text class="text-[32rpx] text-[#000] font-700">学习建议</text>
</view>
<view class="text-[26rpx] text-[#666] font-400">

View File

@ -4,11 +4,13 @@
<LEchart ref="echart" :customStyle="`z-index:1;`"></LEchart>
</view>
<view class="relative mt-[68rpx] bg-[#F5FAFF] mx-[20rpx] px-[24rpx] pt-[58rpx] pb-[20rpx]">
<image
src="https://api.static.ycymedu.com/src/images/home/test-icon.png"
mode="scaleToFill"
class="w-[180rpx] h-[52rpx] absolute top-[-9rpx] left-[20rpx]"
/>
<view class="w-[180rpx] h-[52rpx] absolute top-[-9rpx] left-[20rpx]">
<image
src="https://api.static.ycymedu.com/src/images/home/test-icon.png"
mode="scaleToFill"
class="w-[180rpx] h-[52rpx]"
/>
</view>
<view v-for="(item, index) in innerParsing" class="text-[26rpx] mb-[20rpx]" :key="index">
<text class="text-[#000] font-700">{{ item.title }}:&nbsp;</text>
<text class="text-[#3d3d3d] font-400">{{ item.desc }}</text>
@ -57,7 +59,6 @@ watch(
_val.tags.forEach((item) => {
if (item.title === '策略偏好') {
policy.value = item
return
} else {
innerParsing.value.push(...item.items)
}
@ -89,7 +90,7 @@ watch(
//
const maxLength = 4
const result = []
let _val = value.split(',')
const _val = value.split(',')
for (let i = 0; i < _val[0].length; i += maxLength) {
result.push(value.slice(i, i + maxLength))
}

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,9 @@
<view class="uni-collapse-item__title-wrap">
<slot name="title" :expanded="isOpen">
<view class="uni-collapse-item__title-box" :class="{ 'is-disabled': disabled }">
<image v-if="thumb" :src="thumb" class="uni-collapse-item__title-img" />
<view class="uni-collapse-item__title-img">
<image v-if="thumb" :src="thumb" class="uni-collapse-item__title-img" />
</view>
<text class="uni-collapse-item__title-text">{{ title }}</text>
</view>
</slot>

View File

@ -1,5 +1,5 @@
<template>
<view class="flex items-center rounded-[48rpx] bg-[#F7F7F7] px-[24rpx] py-[12rpx] ml-[32rpx]">
<view class="flex items-center rounded-[48rpx] bg-[#F7F7F7] px-[24rpx] py-[12rpx] ml-[12rpx]">
<view class="i-carbon-search text-[#999]"></view>
<input
v-model="searchValue"

View File

@ -11,11 +11,13 @@
/>
</view>
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/qujian.png"
mode="scaleToFill"
class="mx-[20rpx] flex-1 h-[20rpx]"
/>
<view class="mx-[20rpx] flex-1 h-[20rpx]">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/qujian.png"
mode="scaleToFill"
class="h-[20rpx]"
/>
</view>
<view
class="w-[84rpx] h-[36rpx] rounded-full border-[#187CFF] border-solid border-[2rpx] flex items-center px-[18rpx] py-[10rpx] text-[#1580FF] text-[26rpx] bg-[rgba(21,128,255,0.1)]"
>
@ -92,7 +94,7 @@ const handleNumberChange = () => {
}
const handleRightThumbTouchEnd = () => {
let changeValue = [currentLeftValue.value, currentRightValue.value]
const changeValue = [currentLeftValue.value, currentRightValue.value]
emits('change', changeValue)
}

View File

@ -17,14 +17,17 @@
top: fixed ? (safeAreaInsetTop ? statusBarHeight : 0) + 'px' : '0',
}"
>
<!-- 左侧区域 -->
<view :class="`navbar-left ${leftWidthMin ? 'w-m-[100rpx]' : ''}`" @click="handleClickLeft">
<view
:class="`navbar-left ${leftWidthMin ? 'min-w-[48rpx]' : ''} min-w-[48rpx]`"
@click="handleClickLeft"
>
<!-- #ifndef MP-ALIPAY -->
<view v-if="leftArrow" class="back-icon">
<view class="i-carbon-chevron-left text-[40rpx] text-[#333] font-semibold icon-class" />
</view>
<!-- #endif -->
<slot name="left"></slot>
</view>
<!-- 中间标题区域 -->
<view class="navbar-title">
<slot name="title">
@ -53,7 +56,6 @@
<script lang="ts" setup>
import { getDeviceInfo, getWindowInfo } from '@/utils/tools'
defineProps({
title: {
type: String,
@ -109,7 +111,7 @@ const navHeight = computed(() => {
// pxrpx
const ratio = 750 / screenWidth
//
if (platform === 'ios') {
return 88 / ratio // iOS 44ptpx

File diff suppressed because one or more lines are too long

View File

@ -1,20 +1,19 @@
<route lang="json5" type="page">
{
style: {
navigationBarTitleText: '在线客服'
navigationBarTitleText: '在线客服',
},
}
</route>
<template>
<view class="bg-[#fff] h-[100vh] flex flex-col">
<view class="flex-1 bg-[#F8F8F8] px-[32rpx] pb-safe">
<view class="mt-[84rpx] h-[754rpx] rounded-[16rpx] bg-[#fff]">
<view class="py-[48rpx] mx-[48rpx] avatar-border flex justify-center items-center">
<view class="min-w-[144rpx] min-h-[144rpx] w-[144rpx] h-[144rpx]">
<image
class=" rounded-full"
class="rounded-full"
src="https://api.static.ycymedu.com/sub/images/customerService/avatar.jpg"
></image>
</view>
@ -33,11 +32,13 @@
</view>
<view class="px-[168rpx] pt-[48rpx]">
<image
class="w-[352rpx] h-[352rpx]"
:src="qrCodeUrl"
:show-menu-by-longpress="true"
></image>
<view class="w-[352rpx] h-[352rpx]">
<image
class="w-[352rpx] h-[352rpx]"
:src="qrCodeUrl"
:show-menu-by-longpress="true"
></image>
</view>
<view class="flex items-center justify-center mt-[34rpx]">
<view class="i-carbon-fingerprint-recognition text-[#E75859] text-[28rpx]"></view>

View File

@ -122,12 +122,12 @@
<view class="text-[24rpx] text-[#1580FF] mr-[8rpx]">
{{ isExpand ? '展开' : '收起' }}
</view>
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/shouqi.png"
mode="scaleToFill"
class="w-[16rpx] h-[12rpx]"
:style="isExpand ? 'transform:rotate(180deg)' : ''"
/>
<view class="w-[16rpx] h-[12rpx]" :style="isExpand ? 'transform:rotate(180deg)' : ''">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/shouqi.png"
class="w-[16rpx] h-[12rpx]"
/>
</view>
</view>
</view>
</template>

View File

@ -42,11 +42,12 @@
</view>
<view class="top-[50%] left-[50%] absolute translate-x-[-50%] translate-y-[-50%]">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/zhongjian.png"
mode="scaleToFill"
class="w-[184rpx] h-[184rpx]"
/>
<view class="w-[184rpx] h-[184rpx]">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/zhongjian.png"
mode="scaleToFill"
/>
</view>
</view>
</view>
</template>

View File

@ -1,43 +1,53 @@
<template>
<view class="w-full flex flex-col">
<view class="flex flex-col items-center">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/toubu.png "
mode="scaleToFill"
class="w-full h-[538rpx]"
/>
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/mingzi.png"
mode="scaleToFill"
class="h-[44rpx] w-[420rpx] bg-transparent mt-[-78rpx]"
/>
<view class="w-full h-[538rpx]">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/toubu.png "
mode="scaleToFill"
class="w-full h-[538rpx]"
/>
</view>
<view class="h-[44rpx] w-[420rpx] mt-[-78rpx]">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/mingzi.png"
mode="scaleToFill"
class="h-[44rpx] w-[420rpx] bg-transparent"
/>
</view>
</view>
<view
class="rounded-[0rpx_0rpx_20rpx_20rpx] h-[474rpx] ml-[36rpx] mr-[38rpx] bg-white px-[24rpx] pt-[28rpx] pb-[18rpx]"
>
<view class="flex items-center">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/xuexiao.png"
mode="scaleToFill"
class="w-[214rpx] h-[180rpx] min-w-[214rpx]"
@click="
previewImg(
['https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/xuexiao.png'],
0,
)
"
/>
<view class="w-[214rpx] h-[180rpx] min-w-[214rpx]">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/xuexiao.png"
mode="scaleToFill"
class="w-[214rpx] h-[180rpx] min-w-[214rpx]"
@click="
previewImg(
[
'https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/xuexiao.png',
],
0,
)
"
/>
</view>
<view class="text-[26rpx] text-[#3d3d3d] ml-[16rpx] text-wrap">
经济南市教育局批准成立的十二年一贯制学校由山东锦泽实业集团投资创办坐落于济南市平阴县深泉路1号占地12万平方米环境清幽设施一流
</view>
</view>
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/tifen.png"
mode="scaleToFill"
class="h-[234rpx]"
/>
<view class="h-[234rpx]">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/tifen.png"
mode="scaleToFill"
class="h-[234rpx]"
/>
</view>
<view class="grid grid-cols-[1fr_2fr_1fr] text-[#333] text-[26rpx] gap-[10prx] mt-[6rpx]">
<view class="justify-self-center">轻松可提</view>
<view class="justify-self-center">复读生平均提分</view>

View File

@ -11,14 +11,16 @@
</view>
<view class="grid grid-cols-2 gap-x-[16rpx] gap-y-[10rpx]">
<image
:src="item"
mode="scaleToFill"
v-for="(item, index) in imageList"
:key="index"
class="w-full h-[170rpx]"
@click="previewImg(imageList, index)"
/>
<view class="w-full h-[170rpx]">
<image
:src="item"
mode="scaleToFill"
v-for="(item, index) in imageList"
:key="index"
class="w-full h-[170rpx]"
@click="previewImg(imageList, index)"
/>
</view>
</view>
</view>
</template>

View File

@ -1,11 +1,13 @@
<template>
<view class="flex mx-[20rpx] flex-col">
<view class="w-full relative z-2">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/biaoti.png"
mode="widthFix"
class="w-full h-[100rpx]"
/>
<view class="w-full h-[100rpx]">
<image
src="https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/ad-banner/biaoti.png"
mode="widthFix"
class="w-full h-[100rpx]"
/>
</view>
<view
class="text-[40rpx] font-700 absolute top-[12rpx] left-[50rpx] tracking-[10rpx] text-white italic"
>

View File

@ -6,7 +6,9 @@
class="rounded-[40rpx] bg-white px-[36rpx] pt-[38rpx] pb-[20rpx] grid grid-cols-4 gap-x-[0rpx] gap-y-[28rpx]"
>
<view class="flex flex-col items-center" v-for="(item, index) in schools" :key="index">
<image :src="item.badge" mode="scaleToFill" class="w-[120rpx] h-[120rpx]" />
<view class="w-[120rpx] h-[120rpx]">
<image :src="item.badge" mode="scaleToFill" class="w-[120rpx] h-[120rpx]" />
</view>
<span class="text-[26rpx] text-[#333]">{{ item.name }}</span>
</view>

View File

@ -15,12 +15,14 @@
<MessageBox v-model:show="show" title="好友添加">
<template>
<image
:src="friendImage"
mode="scaleToFill"
class="w-full h-[80vh] py-[20rpx]"
:show-menu-by-longpress="true"
/>
<view class="w-full h-[80vh] py-[20rpx]">
<image
:src="friendImage"
mode="scaleToFill"
class="w-full h-[80vh]"
:show-menu-by-longpress="true"
/>
</view>
</template>
</MessageBox>
</view>

View File

@ -20,12 +20,14 @@
</button>
</Badge>
<image
class="w-[286rpx] h-[286rpx] mt-[134rpx] mix-blend-darken"
src="https://api.static.ycymedu.com/sub/images/autoFill/auto-fill.jpg"
mode="widthFix"
@click="show = true"
></image>
<view class="w-[286rpx] h-[286rpx] mt-[134rpx]">
<image
class="w-[286rpx] h-[286rpx] mix-blend-darken"
src="https://api.static.ycymedu.com/sub/images/autoFill/auto-fill.jpg"
mode="widthFix"
@click="show = true"
></image>
</view>
</view>
<ActionSheet
v-model:show="show"
@ -76,9 +78,9 @@ const handleChange = (params) => {
}
const handleResult = () => {
let _params = filterMenuRef.value.handleConfirm()
const _params = filterMenuRef.value.handleConfirm()
let params = {
const params = {
p: userStore.userInfo.estimatedAchievement.sp,
location: userStore.userInfo.estimatedAchievement.provinceCode,
subjects: userStore.userInfo.estimatedAchievement.subjectGroup.split(','),
@ -91,9 +93,9 @@ const handleResult = () => {
getUniversityListByFilter(params).then((res) => {
if (res.code === 200) {
let collegeList = (res.result as { rows: any[] }).rows
let wishList = collegeList.map((item) => {
let _major = {
const collegeList = (res.result as { rows: any[] }).rows
const wishList = collegeList.map((item) => {
const _major = {
...item,
name: item.universityName,
vItems: item.majorItems.map((majorItem) => ({

View File

@ -27,11 +27,13 @@
<text class="text-[36rpx] text-[#000] font-bold mt-[24rpx] mb-[22rpx]">
{{ professionInfo.career }}
</text>
<image
class="w-full h-[264rpx] rounded-[8rpx]"
:src="professionInfo.img_url"
mode="aspectFill"
/>
<view class="w-full h-[264rpx]">
<image
class="w-full h-[264rpx] rounded-[8rpx]"
:src="professionInfo.img_url"
mode="aspectFill"
/>
</view>
</view>
<view class="h-[18rpx] bg-[#F8F8F8] mt-[24rpx] mb-[16rpx]"></view>
<view class="">

View File

@ -1,11 +1,13 @@
<template>
<view class="flex flex-col px-[32rpx] pt-[32rpx] bg-[#fff] mt-16rpx">
<view class="flex items-center gap-[10rpx]">
<image
class="w-[48rpx] h-[48rpx]"
src="https://api.static.ycymedu.com/zdx/faculty.png"
mode="scaleToFill"
/>
<view class="w-[48rpx] h-[48rpx]">
<image
class="w-[48rpx] h-[48rpx]"
src="https://api.static.ycymedu.com/zdx/faculty.png"
mode="scaleToFill"
/>
</view>
<text class="text-[32rpx] font-semibold text-[#333]">院系设置</text>
</view>
@ -51,9 +53,9 @@ watch(
(newVal) => {
getUniversityListByProvince({ id: newVal }).then((resp) => {
if (resp.code === 200) {
let _res = (originTableData = resp.result as { name: string; item: { name: string }[] }[])
const _res = (originTableData = resp.result as { name: string; item: { name: string }[] }[])
_res.forEach((college) => {
let _college = { name: college.name, major: '' }
const _college = { name: college.name, major: '' }
_college.major = college.item.map((item) => item.name).join(',')
tableData.value.push(_college)
})

View File

@ -37,11 +37,13 @@
v-show="assessmentSubjectList.length > 0"
>
<view class="flex items-center gap-[10rpx]">
<image
class="w-[48rpx] h-[48rpx]"
src="https://api.static.ycymedu.com/zdx/subject.png"
mode="scaleToFill"
/>
<view class="w-[48rpx] h-[48rpx]">
<image
class="w-[48rpx] h-[48rpx]"
src="https://api.static.ycymedu.com/zdx/subject.png"
mode="scaleToFill"
/>
</view>
<text class="text-[30rpx] font-600 text-[#000]">
学科评估·{{ assessmentSubjectList.length }}
</text>
@ -72,11 +74,13 @@
</view>
<view class="flex flex-col p-[32rpx] bg-[#fff] mt-[16rpx]" v-show="featureSubjectList.length > 0">
<view class="flex items-center gap-[10rpx]">
<image
class="w-[48rpx] h-[48rpx]"
src="https://api.static.ycymedu.com/zdx/profession.png"
mode="scaleToFill"
/>
<view class="w-[48rpx] h-[48rpx]">
<image
class="w-[48rpx] h-[48rpx]"
src="https://api.static.ycymedu.com/zdx/profession.png"
mode="scaleToFill"
/>
</view>
<text class="text-[30rpx] font-600 text-[#000]">
特色专业·{{ featureSubjectList.length }}
</text>
@ -207,7 +211,7 @@ const parsedNames = (name: string) => {
}
}
return {
name: name,
name,
grade: '',
}
}

File diff suppressed because one or more lines are too long

View File

@ -84,7 +84,9 @@
>
<view class="flex items-center p-[32rpx]">
<view class="w-[80rpx] h-[80rpx] ml-[18rpx] mr-[24rpx]">
<image class="w-[80rpx] h-[80rpx]" :src="item.logo"></image>
<view class="w-[80rpx] h-[80rpx]">
<image class="w-[80rpx] h-[80rpx] rounded-full" :src="item.logo"></image>
</view>
</view>
<view class="flex justify-between items-center flex-1 overflow-y-hidden">
<view class="flex flex-col w-full" hover-class="none">

View File

@ -26,11 +26,13 @@
<view class="flex-1 flex flex-col pb-safe overflow-y-auto">
<view class="flex items-center p-[32rpx]" hover-class="none">
<image
class="w-[104rpx] h-[104rpx]"
:src="universityBaseInfo?.universityResult.logo"
:lazy-load="true"
></image>
<view class="w-[104rpx] h-[104rpx]">
<image
class="w-[104rpx] h-[104rpx]"
:src="universityBaseInfo?.universityResult.logo"
:lazy-load="true"
></image>
</view>
<view class="flex flex-col ml-[24rpx]">
<text class="text-[32rpx] font-semibold text-[#303030]">
{{ universityBaseInfo?.universityResult.name }}

View File

@ -127,9 +127,6 @@ const handleRegionChangeCode = (val) => {
getUniversityList()
}
const navigatorBack = () => {
uni.navigateBack()
}
const tableData = ref([])
const getUniversityList = () => {

View File

@ -1,7 +1,7 @@
<route lang="json5" type="page">
{
style: {
navigationBarTitleText:'查扩缩招'
navigationBarTitleText: '查扩缩招',
},
}
</route>
@ -109,18 +109,20 @@
<text v-if="item.newPlan - item.oldPlan === 0"></text>
<view v-else class="flex items-center justify-center gap-[10rpx]">
<text>{{ item.newPlan - item.oldPlan }}</text>
<image
v-if="item.newPlan - item.oldPlan < 0"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAARRJREFUSEu91EFOhDAYhuH370TXHGGOwMaEuNJM4jnKCYwnEE4yeAoTE0LcsZwb6BE8wFC1OBBGO6UmZboikPTJ9/Uvkj3rtbqkMUqK9nb7xEJLrmv9Bqzt/kaJXgqTrNZawXYIshQmFjgH1kPnwEboP9jVi05XkLZ3VRU6O0dQCGaRixUNkBgo2k1VhmB/IB82RcbhCcSckBMzlEpxb5MckI/hOSTZSciFTVLkXcduqLC/gzPJvJAzGeTt5mcIflfpw2ah6YYGHgZkSBeKBUFzU+XDslo/YniNAp2q0b5XUNCRR4Nc2NiEoYwKebAqOmTPpK/reMU7o8NVcCH203vURDeNTvZ7UhGS7pMUIUFI5ftv8gVvqo+bwdfwaAAAAABJRU5ErkJggg=="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
/>
<image
v-if="item.newPlan - item.oldPlan > 0"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAATlJREFUSEu11eFNwzAQBeB3gQEyAIV2g67QDewJgBGYgHYCRmhH8AbABHSDRhSJvxmA5sEFtTKuk7jIza9EivP57l0SQcZjY8z0ApgSGAtwI0ApInpdSkYH78bcicjy6JnkOiukQAwj8Jod+rD29qd1K78qkqusUAxRsCEX2aAQIXmviGam58mQTtTEuXVseGLItXNt+zSzAkgbhq0xjxCZg5yPnFv4WB/i3zdY0QHZr/KwAKlB2pFzL7Gqe6EjxMNEpPKmqxZydtXR2jarrhc2QGoNtBB50rc+WDOIdEIhst/tpzHjncizhyUhUagL2VfhYeVQuzqHYQj5gwFlXyZhJIeMUpH/foRb6NxIm5GPEKgK0p7SktQKZWvtG35/VtWOnE2cq1IXn3KfbIwpL4ti+dU0D+dCdEPf+I3M1u2H9e8AAAAASUVORK5CYII="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
/>
<view class="w-[16rpx] h-[16rpx]">
<image
v-if="item.newPlan - item.oldPlan < 0"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAARRJREFUSEu91EFOhDAYhuH370TXHGGOwMaEuNJM4jnKCYwnEE4yeAoTE0LcsZwb6BE8wFC1OBBGO6UmZboikPTJ9/Uvkj3rtbqkMUqK9nb7xEJLrmv9Bqzt/kaJXgqTrNZawXYIshQmFjgH1kPnwEboP9jVi05XkLZ3VRU6O0dQCGaRixUNkBgo2k1VhmB/IB82RcbhCcSckBMzlEpxb5MckI/hOSTZSciFTVLkXcduqLC/gzPJvJAzGeTt5mcIflfpw2ah6YYGHgZkSBeKBUFzU+XDslo/YniNAp2q0b5XUNCRR4Nc2NiEoYwKebAqOmTPpK/reMU7o8NVcCH203vURDeNTvZ7UhGS7pMUIUFI5ftv8gVvqo+bwdfwaAAAAABJRU5ErkJggg=="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
/>
<image
v-if="item.newPlan - item.oldPlan > 0"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAATlJREFUSEu11eFNwzAQBeB3gQEyAIV2g67QDewJgBGYgHYCRmhH8AbABHSDRhSJvxmA5sEFtTKuk7jIza9EivP57l0SQcZjY8z0ApgSGAtwI0ApInpdSkYH78bcicjy6JnkOiukQAwj8Jod+rD29qd1K78qkqusUAxRsCEX2aAQIXmviGam58mQTtTEuXVseGLItXNt+zSzAkgbhq0xjxCZg5yPnFv4WB/i3zdY0QHZr/KwAKlB2pFzL7Gqe6EjxMNEpPKmqxZydtXR2jarrhc2QGoNtBB50rc+WDOIdEIhst/tpzHjncizhyUhUagL2VfhYeVQuzqHYQj5gwFlXyZhJIeMUpH/foRb6NxIm5GPEKgK0p7SktQKZWvtG35/VtWOnE2cq1IXn3KfbIwpL4ti+dU0D+dCdEPf+I3M1u2H9e8AAAAASUVORK5CYII="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
/>
</view>
</view>
</view>
</view>

View File

@ -10,7 +10,7 @@
<template>
<view class="flex flex-col h-screen">
<view class="relative">
<view class="relative z-11">
<Navbar
safeAreaInsetTop
bg-color="transparent"

View File

@ -1,13 +1,13 @@
<route lang="json5" type="page">
{
style: {
navigationBarTitleText: '详细信息'
navigationBarTitleText: '详细信息',
},
}
</route>
<template>
<view class="flex flex-col h-screen">
<view class="flex flex-col h-screen bg-white">
<view class="flex-1 overflow-auto pb-safe">
<view class="flex flex-col px-[32rpx]">
<text class="font-semibold text-[28rpx] text-[#1F2329]">
@ -21,16 +21,58 @@
</view>
</view>
<view class="w-full h-[1px] bg-[#E5E5E5] my-[16rpx]"></view>
<view class="px-[32rpx]" v-html="newsDetail.detail"></view>
<view class="px-[32rpx]">
<rich-text :nodes="nodes"></rich-text>
</view>
</view>
</view>
</template>
<script lang="ts" setup>
import { useCityNewDetail, newsDetail } from '@/hooks/useCityInfoHook'
import * as htmlparser from 'htmlparser2'
onLoad((option) => {
let newsId = option.newsId
const newsId = option.newsId
useCityNewDetail(newsId)
})
const nodes = ref<any[]>([])
const parseHTMLToObject = (htmlString) => {
const handler = new htmlparser.DomHandler((error, dom) => {
if (error) {
console.error('Error parsing HTML:', error)
} else {
console.log('Parsed DOM:', dom)
}
})
const parser = new htmlparser.Parser(handler)
parser.write(htmlString)
parser.end()
return handler.dom
}
function traverseNodes(nodes) {
return nodes.map((node) => {
if (node.type === 'text') {
return { type: 'text', text: node.data }
} else if (node.type === 'tag') {
return {
name: node.name,
attrs: node.attribs,
children: traverseNodes(node.children || []),
}
}
})
}
watch(
() => newsDetail.value.detail,
(newV: string) => {
const _nodes = parseHTMLToObject(newV)
nodes.value = traverseNodes(_nodes)
},
)
</script>

View File

@ -1,7 +1,7 @@
<route lang="json5" type="page">
{
style: {
navigationBarTitleText: '院校排行榜'
navigationBarTitleText: '院校排行榜',
},
}
</route>
@ -18,26 +18,25 @@
<!-- 需要固定在顶部不滚动的view放在slot="top"的view中如果需要跟着滚动则不要设置slot="top" -->
<template #top>
<view class="relative h-[400rpx]" hover-class="none" :hover-stop-propagation="false">
<view class="absolute top-0 z-[-1]">
<view class="absolute top-0 z-[-1] w-full h-full">
<image
class=""
src="https://api.static.ycymedu.com/sub/images/schoolRank/background.svg"
/>
</view>
<view class="h-[78rpx] w-[270rpx] absolute top-[249rpx] left-[102rpx] z-[-1]">
<image
class=""
src="https://api.static.ycymedu.com/sub/images/schoolRank/title.svg"
/>
<image class="" src="https://api.static.ycymedu.com/sub/images/schoolRank/title.svg" />
</view>
<view class="h-[190rpx] w-[190rpx] absolute top-[194rpx] left-[460rpx] mix-blend-multiply z-[-1]">
<view
class="h-[190rpx] w-[190rpx] absolute top-[194rpx] left-[460rpx] mix-blend-multiply z-[-1]"
>
<image
class=""
class="w-full h-full"
src="https://api.static.ycymedu.com/sub/images/schoolRank/trophy.png"
/>
</view>
</view>
<view class="my-[24rpx]">
<view class="my-[24rpx] mx-[8rpx]">
<z-tabs
:current="tabIndex"
:list="unSortTypeList"
@ -53,7 +52,7 @@
top: '0',
zIndex: '99',
height: '52rpx',
background:'transparent'
background: 'transparent',
}"
:active-style="{
background: 'linear-gradient( 270deg, #F2CE95 0%, #F8DEBA 100%)',
@ -73,7 +72,7 @@
<view class="flex items-center py-[32rpx] w-full">
<text class="text-[28rpx] text-[#999] font-normal">{{ item.rank }}</text>
<view class="w-[80rpx] h-[80rpx] ml-[18rpx] mr-[24rpx]">
<image class="" :src="item.logo"></image>
<image class="rounded-full" :src="item.logo"></image>
</view>
<view class="flex justify-between items-center flex-1">
<view class="flex flex-col" hover-class="none">
@ -100,16 +99,13 @@
import { getUniversityRank, getUnSortType } from '@/service/index/api'
import zTabs from '@/pages-sub/uni_modules/z-tabs/components/z-tabs/z-tabs.vue'
type UnSortType = { type: number; name: string }[]
let unSortTypeList = ref([])
const unSortTypeList = ref([])
getUnSortType().then((res) => {
unSortTypeList.value = res.result as UnSortType
})
const tabIndex = ref<number>(0)
const tabsRef = ref(null)
@ -192,10 +188,9 @@ const handleTabChange = (index: number) => {
background-color: #f5efe1;
border-radius: 8rpx;
padding: 0 !important;
}
:deep(.z-tabs-item):not(:last-child){
:deep(.z-tabs-item):not(:last-child) {
margin-right: 16rpx;
}
@ -205,7 +200,7 @@ const handleTabChange = (index: number) => {
gap: 16rpx;
}
:deep(.z-tabs-list){
:deep(.z-tabs-list) {
margin-top: 0 !important;
}

View File

@ -38,18 +38,20 @@
</view>
<view class="flex items-center gap-[8rpx]" v-else-if="col.key === 'rankDiff'">
{{ item['rankDiff'] }}
<image
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAATlJREFUSEu11eFNwzAQBeB3gQEyAIV2g67QDewJgBGYgHYCRmhH8AbABHSDRhSJvxmA5sEFtTKuk7jIza9EivP57l0SQcZjY8z0ApgSGAtwI0ApInpdSkYH78bcicjy6JnkOiukQAwj8Jod+rD29qd1K78qkqusUAxRsCEX2aAQIXmviGam58mQTtTEuXVseGLItXNt+zSzAkgbhq0xjxCZg5yPnFv4WB/i3zdY0QHZr/KwAKlB2pFzL7Gqe6EjxMNEpPKmqxZydtXR2jarrhc2QGoNtBB50rc+WDOIdEIhst/tpzHjncizhyUhUagL2VfhYeVQuzqHYQj5gwFlXyZhJIeMUpH/foRb6NxIm5GPEKgK0p7SktQKZWvtG35/VtWOnE2cq1IXn3KfbIwpL4ti+dU0D+dCdEPf+I3M1u2H9e8AAAAASUVORK5CYII="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
v-if="item['rankDiff'] > 0"
/>
<image
v-else
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAARRJREFUSEu91EFOhDAYhuH370TXHGGOwMaEuNJM4jnKCYwnEE4yeAoTE0LcsZwb6BE8wFC1OBBGO6UmZboikPTJ9/Uvkj3rtbqkMUqK9nb7xEJLrmv9Bqzt/kaJXgqTrNZawXYIshQmFjgH1kPnwEboP9jVi05XkLZ3VRU6O0dQCGaRixUNkBgo2k1VhmB/IB82RcbhCcSckBMzlEpxb5MckI/hOSTZSciFTVLkXcduqLC/gzPJvJAzGeTt5mcIflfpw2ah6YYGHgZkSBeKBUFzU+XDslo/YniNAp2q0b5XUNCRR4Nc2NiEoYwKebAqOmTPpK/reMU7o8NVcCH203vURDeNTvZ7UhGS7pMUIUFI5ftv8gVvqo+bwdfwaAAAAABJRU5ErkJggg=="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
/>
<view class="w-[16rpx] h-[16rpx]">
<image
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAATlJREFUSEu11eFNwzAQBeB3gQEyAIV2g67QDewJgBGYgHYCRmhH8AbABHSDRhSJvxmA5sEFtTKuk7jIza9EivP57l0SQcZjY8z0ApgSGAtwI0ApInpdSkYH78bcicjy6JnkOiukQAwj8Jod+rD29qd1K78qkqusUAxRsCEX2aAQIXmviGam58mQTtTEuXVseGLItXNt+zSzAkgbhq0xjxCZg5yPnFv4WB/i3zdY0QHZr/KwAKlB2pFzL7Gqe6EjxMNEpPKmqxZydtXR2jarrhc2QGoNtBB50rc+WDOIdEIhst/tpzHjncizhyUhUagL2VfhYeVQuzqHYQj5gwFlXyZhJIeMUpH/foRb6NxIm5GPEKgK0p7SktQKZWvtG35/VtWOnE2cq1IXn3KfbIwpL4ti+dU0D+dCdEPf+I3M1u2H9e8AAAAASUVORK5CYII="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
v-if="item['rankDiff'] > 0"
/>
<image
v-else
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAARRJREFUSEu91EFOhDAYhuH370TXHGGOwMaEuNJM4jnKCYwnEE4yeAoTE0LcsZwb6BE8wFC1OBBGO6UmZboikPTJ9/Uvkj3rtbqkMUqK9nb7xEJLrmv9Bqzt/kaJXgqTrNZawXYIshQmFjgH1kPnwEboP9jVi05XkLZ3VRU6O0dQCGaRixUNkBgo2k1VhmB/IB82RcbhCcSckBMzlEpxb5MckI/hOSTZSciFTVLkXcduqLC/gzPJvJAzGeTt5mcIflfpw2ah6YYGHgZkSBeKBUFzU+XDslo/YniNAp2q0b5XUNCRR4Nc2NiEoYwKebAqOmTPpK/reMU7o8NVcCH203vURDeNTvZ7UhGS7pMUIUFI5ftv8gVvqo+bwdfwaAAAAABJRU5ErkJggg=="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
/>
</view>
</view>
<view v-else>
{{ item[col.key] }}
@ -135,20 +137,20 @@ const columns = ref([
const rankDiff = (index: number, item) => {
return index === props.data.length - 1
? item['rankLine']
: item['rankLine'] - props.data[index + 1]['rankLine']
? item.rankLine
: item.rankLine - props.data[index + 1].rankLine
}
const recompileData = computed(() => {
if (!props.data) return []
let _data = props.data.map((item, index) => {
item['rankDiff'] =
const _data = props.data.map((item, index) => {
item.rankDiff =
props.lowscoreRank !== -1
? props.lowscoreRank === 0
? '--'
: item['rankLine'] - props.lowscoreRank
: item.rankLine - props.lowscoreRank
: rankDiff(index, item)
item['lineDiff'] = item['score'] - props.score
item.lineDiff = item.score - props.score
return item
})
return _data

View File

@ -2,7 +2,9 @@
<view class="h-[16rpx] bg-[#F5F5F5]"></view>
<view class="flex items-start p-[32rpx]">
<view class="flex flex-col items-center gap-[16rpx]">
<image :src="college.logo" mode="scaleToFill" class="w-[112rpx] h-[112rpx]" />
<view class="w-[112rpx] h-[112rpx]">
<image :src="college.logo" mode="scaleToFill" class="w-[112rpx] h-[112rpx]" />
</view>
<view
class="w-[52rpx] h-[52rpx] rounded-[8rpx] font-semibold text-[28rpx] flex items-center justify-center"
:style="calcTypeName(college.type).style"

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -40,11 +40,9 @@
v-if="currentTab === 0"
@click.stop="navigatorTo(item)"
>
<image
class="min-w-[112rpx] min-h-[112rpx] w-[112rpx] h-[112rpx]"
:src="item.logo"
mode="scaleToFill"
/>
<view class="min-w-[112rpx] min-h-[112rpx] w-[112rpx] h-[112rpx]">
<image class="" :src="item.logo" mode="scaleToFill" />
</view>
<view class="flex flex-col flex-1">
<text class="text-[28rpx] text-[#333] font-semibold mb-[6rpx]">
{{ item.name }}

View File

@ -8,7 +8,7 @@
<!-- 表头 -->
<view class="vip-table-header">
<view class="feature-column">功能</view>
<view class="vip-column vip-header">
<view class="vip-column vip-header w-[66rpx] h-[46rpx]">
<image
src="https://api.static.ycymedu.com/sub/images/ucenter/vip-crown.png"
class="vip-icon"

View File

@ -9,11 +9,13 @@
<template>
<view class="h-screen flex flex-col bg-[#f8f8f8]">
<view class="px-[32rpx]">
<image
src="https://api.static.ycymedu.com/sub/images/ucenter/vip-back.png"
class="mt-[32rpx] h-[400rpx]"
mode="aspectFit"
/>
<view class="mt-[32rpx] h-[400rpx]">
<image
src="https://api.static.ycymedu.com/sub/images/ucenter/vip-back.png"
class="w-full h-full"
mode="aspectFit"
/>
</view>
<view
class="flex flex-col rounded-[16rpx] bg-[#fff] mt-[30rpx] pt-[24rpx] pl-[18rpx] pr-[20rpx] pb-[32rpx]"
>
@ -108,10 +110,10 @@ const requestPay = (res) => {
provider: 'wxpay',
timeStamp: res.timeStamp,
orderInfo: '',
nonceStr: res.nonceStr, //32
package: res.package, //prepay_id prepay_id=xx
signType: res.signType, //MD5
paySign: res.paySign, //
nonceStr: res.nonceStr, // 32
package: res.package, // prepay_id prepay_id=xx
signType: res.signType, // MD5
paySign: res.paySign, //
success: (result) => {
uni.showToast({
title: '支付成功!',

View File

@ -9,11 +9,13 @@
<template>
<view class="flex flex-col items-center">
<image
class="w-[440rpx] h-[440rpx] mt-[136rpx]"
src="https://api.static.ycymedu.com/images/logo.png"
mode="aspectFit"
></image>
<view class="w-[440rpx] h-[440rpx] mt-[136rpx]">
<image
class="w-[440rpx] h-[440rpx]"
src="https://api.static.ycymedu.com/images/logo.png"
mode="aspectFit"
></image>
</view>
<button
class="w-[493rpx]! mb-[40rpx] h-[88rpx]! rounded-[44rpx] text-[32rpx] text-white flex items-center justify-center bg-[#1580FF]"

View File

@ -4,7 +4,7 @@
* @see [uni.getDeviceInfo](https://uniapp.dcloud.net.cn/api/system/getDeviceInfo.html)
*/
export function getDeviceInfo() {
if(uni.getSystemInfoSync || uni.canIUse("getSystemInfoSync")){
if (uni.getSystemInfoSync || uni.canIUse('getSystemInfoSync')) {
return uni.getSystemInfoSync()
} else {
return uni.getDeviceInfo()

View File

@ -131,6 +131,9 @@ export default ({ command, mode }) => {
alias: {
'@': path.join(process.cwd(), './src'),
'@img': path.join(process.cwd(), './src/static/images'),
// 修复部分三方库引用 entities/decode / entities/encode 的子路径导入在 exports 下无法解析的问题
'entities/decode': 'entities/lib/decode.js',
'entities/encode': 'entities/lib/encode.js',
},
},
server: {