This commit is contained in:
zoujiandong 2025-12-02 14:39:05 +08:00
commit d10c17827d
105 changed files with 62763 additions and 0 deletions

2
.env.development Normal file
View File

@ -0,0 +1,2 @@
# VITE_BASE_URL="http://dev.edu.igandan.com/gdxz-h5/"
VITE_BASE_URL="https://h5.ixuanjiao.com/api/"

2
.env.production Normal file
View File

@ -0,0 +1,2 @@
# VITE_BASE_URL="http://dev.edu.igandan.com/gdxz-h5/"
VITE_BASE_URL="https://h5.ixuanjiao.com/api/"

2
.env.test Normal file
View File

@ -0,0 +1,2 @@
# VITE_BASE_URL="https://twx.igandan.org/"
VITE_BASE_URL="http://dev.edu.igandan.com/gdxz-h5/"

51
.gitignore vendored Normal file
View File

@ -0,0 +1,51 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
# vercel
.vercel
# typescript
*.tsbuildinfo
# eslint
.eslintcache
# stylelint
.stylelintcache
dist
dist-ssr
*.local
/dist*
stats.html

1
README.md Normal file
View File

@ -0,0 +1 @@
全景平台

65
auto-imports.d.ts vendored Normal file
View File

@ -0,0 +1,65 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
const customRef: typeof import('vue')['customRef']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent']
const effectScope: typeof import('vue')['effectScope']
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
const getCurrentScope: typeof import('vue')['getCurrentScope']
const h: typeof import('vue')['h']
const inject: typeof import('vue')['inject']
const isProxy: typeof import('vue')['isProxy']
const isReactive: typeof import('vue')['isReactive']
const isReadonly: typeof import('vue')['isReadonly']
const isRef: typeof import('vue')['isRef']
const markRaw: typeof import('vue')['markRaw']
const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated']
const onBeforeMount: typeof import('vue')['onBeforeMount']
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
const onDeactivated: typeof import('vue')['onDeactivated']
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
const onMounted: typeof import('vue')['onMounted']
const onRenderTracked: typeof import('vue')['onRenderTracked']
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
const onScopeDispose: typeof import('vue')['onScopeDispose']
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
const onUnmounted: typeof import('vue')['onUnmounted']
const onUpdated: typeof import('vue')['onUpdated']
const provide: typeof import('vue')['provide']
const reactive: typeof import('vue')['reactive']
const readonly: typeof import('vue')['readonly']
const ref: typeof import('vue')['ref']
const resolveComponent: typeof import('vue')['resolveComponent']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
const toRaw: typeof import('vue')['toRaw']
const toRef: typeof import('vue')['toRef']
const toRefs: typeof import('vue')['toRefs']
const toValue: typeof import('vue')['toValue']
const triggerRef: typeof import('vue')['triggerRef']
const unref: typeof import('vue')['unref']
const useAttrs: typeof import('vue')['useAttrs']
const useCssModule: typeof import('vue')['useCssModule']
const useCssVars: typeof import('vue')['useCssVars']
const useSlots: typeof import('vue')['useSlots']
const watch: typeof import('vue')['watch']
const watchEffect: typeof import('vue')['watchEffect']
const watchPostEffect: typeof import('vue')['watchPostEffect']
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
}
// for type re-export
declare global {
// @ts-ignore
export type { Component, ComponentPublicInstance, ComputedRef, InjectionKey, PropType, Ref, VNode } from 'vue'
}

37
components.d.ts vendored Normal file
View File

@ -0,0 +1,37 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}
declare module 'vue' {
export interface GlobalComponents {
Department: typeof import('./src/views/department.vue')['default']
DoctorInfo: typeof import('./src/views/doctor-info.vue')['default']
EducationCentre: typeof import('./src/views/education-centre.vue')['default']
FeedbackHistory: typeof import('./src/views/feedback-history.vue')['default']
HeadBar: typeof import('./src/components/headBar.vue')['default']
Information: typeof import('./src/views/information.vue')['default']
Interact: typeof import('./src/views/interact.vue')['default']
InteractSearch: typeof import('./src/views/interact-search.vue')['default']
LeaveMessage: typeof import('./src/views/leave-message.vue')['default']
Live: typeof import('./src/views/live.vue')['default']
Loading: typeof import('./src/components/loading/loading.vue')['default']
My: typeof import('./src/views/my.vue')['default']
PaperList: typeof import('./src/components/paperList.vue')['default']
PersonalData: typeof import('./src/views/personal-data.vue')['default']
PrivateRecords: typeof import('./src/views/private-records.vue')['default']
Questionnaire: typeof import('./src/views/questionnaire.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
Search: typeof import('./src/components/search.vue')['default']
Searchblue: typeof import('./src/components/searchblue.vue')['default']
Searchthings: typeof import('./src/views/searchthings.vue')['default']
Searchview: typeof import('./src/views/searchview.vue')['default']
TabTools: typeof import('./src/components/tabTools.vue')['default']
Video: typeof import('./src/views/video.vue')['default']
VisitingInformation: typeof import('./src/views/visiting-information.vue')['default']
WebsView: typeof import('./src/views/webs-view.vue')['default']
}
}

13
index.html Normal file
View File

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title><%- title %></title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

14
jsconfig.json Normal file
View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"allowSyntheticDefaultImports": true,
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
},
"exclude": [
"node_modules"
]
}

4640
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

40
package.json Normal file
View File

@ -0,0 +1,40 @@
{
"name": "wxapp-home",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"test": "vite build --mode=test",
"build-prod": "vite build --mode=production",
"preview": "vite preview"
},
"dependencies": {
"@nutui/nutui": "^4.1.4",
"axios": "^1.5.0",
"cheerio": "^1.0.0-rc.12",
"reset-css": "^5.0.2",
"tdesign-mobile-vue": "^1.0.3",
"vconsole": "^3.15.1",
"vue": "^3.3.4",
"vue-lazyload": "^3.0.0",
"vue-router": "^4.2.4",
"vue3-seamless-scroll": "^2.0.1",
"vxe-table": "^4.5.12",
"weixin-js-sdk": "^1.6.0",
"xe-utils": "^3.5.13"
},
"devDependencies": {
"@types/node": "^20.4.5",
"@vitejs/plugin-vue": "^4.2.3",
"rollup-plugin-external-globals": "^0.8.0",
"rollup-plugin-visualizer": "^5.9.2",
"terser": "^5.19.1",
"unplugin-auto-import": "^0.16.6",
"unplugin-vue-components": "^0.25.1",
"vite": "^4.4.5",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-html": "^3.2.0"
}
}

1
public/vite.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

38
src/App.vue Normal file
View File

@ -0,0 +1,38 @@
<template>
<body>
<router-view></router-view>
</body>
</template>
<style>
body {
line-height: normal!important;
}
:root {
--font-size-11: 11px;
--font-size-12: 12px;
--font-size-13: 13px;
--font-size-14: 14px;
--font-size-16: 16px;
--font-size-18: 18px;
--font-size-20: 20px;
--font-size-title: 17px;
--empty-top: 117px;
--text-color-normal:#233C4C;
--back-color-01:#FEFFFFFF;
--back-color-02:#F6F7FBFF;
--back-color-03:#F1FAFFFF;
}
strong{
font-weight: bold!important;
}
sup{
vertical-align: super!important;
}
video{
width:100%;height:80px
}
</style>

BIN
src/assets/back.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 B

BIN
src/assets/bigcollect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
src/assets/bigcollect1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

BIN
src/assets/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
src/assets/collect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/collectb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
src/assets/collects.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/assets/databg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
src/assets/databgs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/assets/deletes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

BIN
src/assets/department.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/assets/departmentn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 B

BIN
src/assets/edu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
src/assets/edubg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

BIN
src/assets/edubg1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
src/assets/edun.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 B

BIN
src/assets/first.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
src/assets/gotosle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

BIN
src/assets/his.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 864 B

BIN
src/assets/history.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B

BIN
src/assets/historyb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
src/assets/interact.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
src/assets/interactn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/assets/liviing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/assets/my.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/assets/mybg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
src/assets/myn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

BIN
src/assets/n_bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
src/assets/notcollect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 B

BIN
src/assets/notice.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
src/assets/notice_bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
src/assets/now.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/assets/nowb.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
src/assets/popbg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
src/assets/popbg1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

BIN
src/assets/radio_no.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

BIN
src/assets/radio_sel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 B

BIN
src/assets/read.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 995 B

BIN
src/assets/readb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
src/assets/readed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 B

BIN
src/assets/readedd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 995 B

BIN
src/assets/rotbot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/assets/search.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
src/assets/searchb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 734 B

BIN
src/assets/second.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/assets/select_no.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

BIN
src/assets/select_not.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

BIN
src/assets/select_yes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

BIN
src/assets/sempty.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
src/assets/third.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/assets/toto.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

View File

@ -0,0 +1,56 @@
<!-- <template>
<t-navbar :title=props.title :fixed="false" class="headnav" @left-click="handleClick" :style="{'--td-navbar-bg-color':props.backg}">
<template #left>
<img src='../assets/back.png' with="22" height="22" alt="back" :style="{ marginLeft: '16px' }">
</template>
</t-navbar>
</template> -->
<template>
<div :style="{height:'5px',background:props.backg}"></div>
</template>
<script setup>
// import { title } from '../utils/const'
// import { useRoute,useRouter } from 'vue-router';
// const router = useRoute();
// const routerr = useRouter();
const props = defineProps({
title: {
type: String,
required: true
},
backg:{
type: String,
default:'white'
}
});
onMounted(() => {
document.title = props.title;
});
onUpdated(() => {
document.title = props.title;
});
// const handleClick = () => {
// if(router.query.frommywexin =='wx')
// {
// routerr.push({ path: '/'});
// }
// else
// {
// window.history.back();
// }
// };
</script>
<style scoped>
.headnav {
--td-navbar-height: 41px;
--td-navbar-left-arrow-size: 22px;
/* --td-navbar-bg-color: linear-gradient(180deg, #F1FAFF 0%, #FFFFFF 100%); */
--td-navbar-title-font-size: var(--font-size-title);
}
</style>

View File

@ -0,0 +1,28 @@
import { createApp } from "vue"
// 导入写好的Loading.vue文件
import Loading from "./loading.vue"
export default {
loading: null,
// 每当这个插件被添加到应用程序中时,如果它是一个对象,就会调用 install 方法。如果它是一个 function则函数本身将被调用。在这两种情况下——它都会收到两个参数由 Vue 的 createApp 生成的 app 对象和用户传入的选项。
install(app) {
if (this.loading) {
// 防止多次载入
app.config.globalProperties.$loading = this.loading
return
}
// 创建Loading实例用于挂载
let instance = createApp(Loading)
// 创建div元素装载Loading对象
let div = document.createElement("div")
div.setAttribute("id","maskbox")
let body = document.body
// 导入body中
body.appendChild(div);
this.loading = instance.mount(div)
// 挂载vue身上
app.config.globalProperties.$loading = this.loading;
}
}

View File

@ -0,0 +1,194 @@
<template>
<div class="maskbox" v-if="loading">
<div class="mask"></div>
<div class="sk-fading-circle">
<div class="sk-circle1 sk-circle"></div>
<div class="sk-circle2 sk-circle"></div>
<div class="sk-circle3 sk-circle"></div>
<div class="sk-circle4 sk-circle"></div>
<div class="sk-circle5 sk-circle"></div>
<div class="sk-circle6 sk-circle"></div>
<div class="sk-circle7 sk-circle"></div>
<div class="sk-circle8 sk-circle"></div>
<div class="sk-circle9 sk-circle"></div>
<div class="sk-circle10 sk-circle"></div>
<div class="sk-circle11 sk-circle"></div>
<div class="sk-circle12 sk-circle"></div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
const loading = ref(false)
const show = () => {
loading.value = true
}
const hide = () => {
loading.value = false
}
defineExpose({
show,
hide
})
</script>
<style lang="scss">
.maskbox{
top:0;
bottom:0;
width:100%;
height:100%;
z-index:999999;
position: fixed;
display: flex;
justify-content: center;
align-items: center;
.mask{
top:0;
bottom:0;
position: absolute;
width:100%;
height:100%;
opacity: 0.4;
background-color: #000;
}
}
.sk-fading-circle {
margin: 100px auto;
width: 40px;
height: 40px;
position: relative;
}
.sk-fading-circle .sk-circle {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
}
.sk-fading-circle .sk-circle:before {
content: '';
display: block;
margin: 0 auto;
width: 15%;
height: 15%;
background-color: #fff;
border-radius: 100%;
-webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out both;
animation: sk-circleFadeDelay 1.2s infinite ease-in-out both;
}
.sk-fading-circle .sk-circle2 {
-webkit-transform: rotate(30deg);
-ms-transform: rotate(30deg);
transform: rotate(30deg);
}
.sk-fading-circle .sk-circle3 {
-webkit-transform: rotate(60deg);
-ms-transform: rotate(60deg);
transform: rotate(60deg);
}
.sk-fading-circle .sk-circle4 {
-webkit-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
.sk-fading-circle .sk-circle5 {
-webkit-transform: rotate(120deg);
-ms-transform: rotate(120deg);
transform: rotate(120deg);
}
.sk-fading-circle .sk-circle6 {
-webkit-transform: rotate(150deg);
-ms-transform: rotate(150deg);
transform: rotate(150deg);
}
.sk-fading-circle .sk-circle7 {
-webkit-transform: rotate(180deg);
-ms-transform: rotate(180deg);
transform: rotate(180deg);
}
.sk-fading-circle .sk-circle8 {
-webkit-transform: rotate(210deg);
-ms-transform: rotate(210deg);
transform: rotate(210deg);
}
.sk-fading-circle .sk-circle9 {
-webkit-transform: rotate(240deg);
-ms-transform: rotate(240deg);
transform: rotate(240deg);
}
.sk-fading-circle .sk-circle10 {
-webkit-transform: rotate(270deg);
-ms-transform: rotate(270deg);
transform: rotate(270deg);
}
.sk-fading-circle .sk-circle11 {
-webkit-transform: rotate(300deg);
-ms-transform: rotate(300deg);
transform: rotate(300deg);
}
.sk-fading-circle .sk-circle12 {
-webkit-transform: rotate(330deg);
-ms-transform: rotate(330deg);
transform: rotate(330deg);
}
.sk-fading-circle .sk-circle2:before {
-webkit-animation-delay: -1.1s;
animation-delay: -1.1s;
}
.sk-fading-circle .sk-circle3:before {
-webkit-animation-delay: -1s;
animation-delay: -1s;
}
.sk-fading-circle .sk-circle4:before {
-webkit-animation-delay: -0.9s;
animation-delay: -0.9s;
}
.sk-fading-circle .sk-circle5:before {
-webkit-animation-delay: -0.8s;
animation-delay: -0.8s;
}
.sk-fading-circle .sk-circle6:before {
-webkit-animation-delay: -0.7s;
animation-delay: -0.7s;
}
.sk-fading-circle .sk-circle7:before {
-webkit-animation-delay: -0.6s;
animation-delay: -0.6s;
}
.sk-fading-circle .sk-circle8:before {
-webkit-animation-delay: -0.5s;
animation-delay: -0.5s;
}
.sk-fading-circle .sk-circle9:before {
-webkit-animation-delay: -0.4s;
animation-delay: -0.4s;
}
.sk-fading-circle .sk-circle10:before {
-webkit-animation-delay: -0.3s;
animation-delay: -0.3s;
}
.sk-fading-circle .sk-circle11:before {
-webkit-animation-delay: -0.2s;
animation-delay: -0.2s;
}
.sk-fading-circle .sk-circle12:before {
-webkit-animation-delay: -0.1s;
animation-delay: -0.1s;
}
@-webkit-keyframes sk-circleFadeDelay {
0%, 39%, 100% { opacity: 0; }
40% { opacity: 1; }
}
@keyframes sk-circleFadeDelay {
0%, 39%, 100% { opacity: 0; }
40% { opacity: 1; }
}
</style>

View File

@ -0,0 +1,438 @@
<template>
<t-pull-down-refresh
v-model="refreshing"
@refresh="onRefresh"
:loading-bar-height="36"
:loading-texts="['下拉刷新', '松开刷新', '正在刷新', '刷新完成']"
:loading-props="{ theme: 'dots' }"
>
<div class="listbox" v-if="list.length > 0">
<t-list :async-loading="loading" @scroll="onScroll" >
<div v-for="(item, $index) in list" >
<div
:style="{
background: `url(${imgurl + item.img})`,
height: '136px',
marginLeft: '16px',
marginRight: '16px',
marginTop: '16px',
'border-radius': '8px',
'background-size': '100% 100%',
'background-repeat': 'no-repeat',
'justify-content': 'space-between',
display: 'flex',
}"
@click="clickArticles(item)"
>
<!-- <div class="stickytop" v-if="$index==0&&props.needTop">置顶</div> -->
<div class="stickytop" v-if="item.topFlag && props.needTop">置顶</div>
<div style="height: 20px" v-else></div>
<div class="stickybottom" v-if="item.readFlag == 1">已读</div>
</div>
<div
class="titlebox"
style="
display: flex;
margin-left: 16px;
margin-right: 16px;
margin-top: 8px;
"
>
<div class="type tag" v-if="item.mediaType == 2">音频</div>
<div class="type1 tag" v-else-if="item.mediaType == 1">图文</div>
<div class="type2 tag" v-else-if="item.mediaType == 3">视频</div>
<div class="title">
<!-- {{ item.title }} -->
<nut-ellipsis
:content=item.title
rows="2"
direction="end"
></nut-ellipsis>
</div>
</div>
<div
style="
display: flex;
margin-left: 16px;
margin-right: 16px;
flex-wrap: wrap;
"
v-if="props.needlabel"
>
<div v-for="(itemt, $index) in item.tags">
<div class="types" @click="clickTag(itemt)">{{ itemt.tagName }}</div>
</div>
</div>
</div>
<template #footer>
<div class="end" v-if="evisible"> END </div>
</template>
</t-list>
</div>
<nut-empty v-else>
<template #image>
<nut-image :src="props.emptyimg" fit="cover" />
</template>
<template #description>
<div
style="
font-size: var(--front-size-16);
font-family: AlibabaPuHuiTiR;
color: rgba(0, 0, 0, 0.65);
line-height: 22px;
margin-top: 16px;
"
>
<!-- {{ props.emptytxt }} -->
</div>
</template>
</nut-empty>
</t-pull-down-refresh>
</template>
<script setup>
import {getCurrentInstance} from 'vue';
const { proxy } = getCurrentInstance();
import sempty from "../assets/sempty.png";
import {
imgurl,
clickArticle,
getArticleList,
} from "../utils/api.js";
import { useRouter } from "vue-router";
const evisible = ref(false);
const page = ref(1);
const totalPage = ref(1);
const router = useRouter();
const list = ref([]);
const tagId =ref('')
const name =ref('')
const refreshing=ref(false);
const loading = ref('');
const props = defineProps({
url: {
type: String,
default: "",
},
parameter: {
type: Array,
default: ["", "", ""],
},
list: {
type: Array,
},
emptyimg: {
type: String,
default: sempty,
},
emptytxt: {
type: String,
default: "暂无数据",
},
needTop: {
type: Boolean,
default: true,
},
needlabel:{
type: Boolean,
default: true,
}
});
const listtmp = reactive([
{
pageNum: 1,
pageSize: 10,
total: 1,
pages: 1,
list: [
{
id: 28,
ceecId: 4,
ceecName: "百问百答",
title: "平台发布-健康宣教库-测试订阅6",
topFlag: 1,
readFlag: 0,
originalFlag: 0,
editType: 1,
img: "public/platform/c2ab5a958cb5405f8df450a36bc61d5b_20231019150207_jpeg",
tags: [
{
tagName: "腹部超声",
tagId: 32,
},
{
tagName: "血常规",
tagId: 33,
},
{
tagName: "放射治疗",
tagId: 30,
},
],
link: null,
},
],
emptyFlag: false,
},
]);
onMounted(() => {
if (props.list != null && props.list.length > 0) {
list.value.push(...props.list);
evisible.value = true;
}
});
watch(
() => props.url,
(newValue, oldValue) => {
console.log("props.url", props.url);
if (props.url != "") {
onLoad(page.value,tagId.value);
}
}
);
watch(
() => props.parameter[2],
(newValue, oldValue) => {
console.log("rops.parameter[2]", props.parameter[2]);
if (props.url != "") {
onRefresh();
}
}
);
watch(
() => props.parameter[1],
(newValue, oldValue) => {
if (props.url != "") {
onRefresh();
}
}
);
const onLoad = (page,tagId) => {
if (props.list != null && props.list.length > 0) {
refreshing.value=false;
return;
}
if (page > totalPage.value) {
refreshing.value=false;
return;
}
if (page == 1 || !evisible.value) {
loading.value = 'loading';
proxy.$loading.show();
getArticleList(
props.url,
page,
props.parameter[0],
props.parameter[1],
props.parameter[2],tagId
).then((data) => {
console.log("getArticleList", data);
if (page == 1) {
list.value = [];
list.value.push(...data.data.list);
} else {
list.value.push(...data.data.list);
}
totalPage.value = data.data.pages;
if (page >= totalPage.value) {
evisible.value = true;
}
if(name.value!='')
{
document.title = name.value
}
refreshing.value=false;
loading.value = '';
proxy.$loading.hide();
});
}
};
const onRefresh = () => {
console.log("onRefresh");
page.value = 1;
totalPage.value = 1;
evisible.value = false;
setTimeout(()=>{
loading.value = '';
refreshing.value = false;
})
onLoad(page.value,tagId.value);
};
const onScroll = (scrollBottom) => {
if (scrollBottom < 100) {
page.value=page.value+1;
onLoad(page.value,tagId.value);
}
};
function clickArticles(item) {
console.log("item", item);
if (item.link == null || item.link == "null" || item.link == "") {
router.push({
path: "/webs-view",
query: {article_id: item.id },
});
} else {
clickArticle(item.id).then((data) => {
window.location.href = item.link;
});
}
}
const emits = defineEmits(["child-event"]);
function clickTag(item) {
tagId.value=item.tagId
name.value=item.tagName
onRefresh()
emits('child-event', item.tagName); // 'child-event'
}
</script>
<style scoped>
.titlebox {
position: relative;
}
.tag {
top: 0px;
width: 38px;
position: absolute;
transform: skew(-8deg);
}
.stickytop {
width: 50px;
height: 30px;
background: linear-gradient(32deg, #ffa39e 0%, #fe4e4f 100%);
border-radius: 8px 0px 8px 0px;
font-size: var(--front-size-12);
font-family: AlibabaPuHuiTiR;
color: #ffffff;
line-height: 30px;
text-align: center;
}
.stickybottom {
margin-top: 106px;
width: 50px;
height: 30px;
background: rgba(0, 0, 0, 0.65);
border-radius: 8px 0px 8px 0px;
font-size: var(--front-size-12);
font-family: AlibabaPuHuiTiR;
color: #ffffff;
line-height: 30px;
text-align: center;
}
.type {
/* font-size: var(--font-size-11); */
font-size:14px;
font-family: DingTalk-JinBuTi, DingTalk;
font-weight: normal;
color: #ffffff;
line-height: 20px;
text-align: center;
text-shadow: 0px 2px 3px #2db27f;
width: 38px;
height: 19px;
background: linear-gradient(33deg, #4ecf9d 0%, #81eec6 100%);
border-radius: 2px;
}
.type1 {
/* font-size: var(--font-size-11); */
font-family: DingTalk-JinBuTi, DingTalk;
font-weight: normal;
color: #ffffff;
line-height: 20px;
text-align: center;
font-size:14px;
text-shadow: 0px 2px 3px #299bdf;
width: 38px;
height: 19px;
background: linear-gradient(197deg, #a6d9ff 0%, #3bb5fe 100%);
border-radius: 2px;
}
.type2 {
font-size:14px;
/* font-size: var(--font-size-11); */
font-family: DingTalk-JinBuTi, DingTalk;
font-weight: normal;
color: #ffffff;
line-height: 20px;
text-align: center;
text-shadow: 0px 2px 3px #7963f1;
width: 38px;
height: 19px;
background: linear-gradient(196deg, #c4b9ff 0%, #9784ff 100%);
border-radius: 2px;
}
.end {
display: flex;
align-items: center;
justify-content: center;
margin-top: 21px;
font-size: var(--font-size-14);
font-family: AlibabaPuHuiTiR;
color: rgba(0, 0, 0, 0.24);
line-height: 24px;
}
/* .title:before{
content: '图文';
font-size:var(--font-size-11);
font-family: DingTalk-JinBuTi, DingTalk;
font-weight: normal;
color: #FFFFFF;
line-height: 20px;
text-align: center;
text-shadow: 0px 2px 3px #299BDF;
width: 38px;
height: 20px;
background: linear-gradient(197deg, #A6D9FF 0%, #3BB5FE 100%);
border-radius: 2px;
} */
.title {
text-indent: 42px;
padding-left: 4px;
/* font-size: var(--font-size-14); */
font-size:16px;
font-family: AlibabaPuHuiTiM;
color: #000000d9;
line-height: 24px;
flex: 1;
}
.types {
margin-top: 6px;
margin-right: 6px;
font-size: var(--font-size-12);
font-family: AlibabaPuHuiTiR;
color: #38a7fe;
line-height: 16px;
background: #ecf6ff;
border-radius: 12px;
padding: 4px 8px 4px 8px;
}
.nut-empty {
margin-top: var(--empty-top);
--nut-empty-padding: 0px;
}
:deep().nut-empty__box {
width: 246px;
height: 159px;
}
.t-pull-down-refresh{
height: auto;
}
</style>

102
src/components/search.vue Normal file
View File

@ -0,0 +1,102 @@
<template>
<div v-if="props.type=='ss'">
<div class="ss" @click="click">
<img src='../assets/search.png' with="20" height="20" class="dicon">
<!-- <nut-image class="dicon" width="20" height="20" src='@/assets/search.png' alt="图片描述" /> -->
{{ props.message }}</div>
</div>
<div style=" background: linear-gradient(180deg, #F1FAFF 0%, #FFFFFF 100%);" v-else>
<div style="height:16px;"></div>
<div class="ss1" @click="click">
<img src='../assets/search.png' with="20" height="20" class="dicon" >
<!-- <nut-image class="dicon" width="20" height="20" src='@/assets/search.png' alt="图片描述" /> -->
{{ props.message }}</div>
</div>
</template>
<script setup>
// import search from '../assets/search.png'
import { useRouter } from 'vue-router';
const props = defineProps({
message: {
type: String,
required: true
},
searchtype:{
type: String,
default:'paper'
},
type:{
type: String,
default:'ss'
} ,
ceecId:{
type: String,
default:''
}
});
const router = useRouter();
function click()
{
if(props.searchtype=='paper')
{
router.push({ path: '/searchview' ,query:{ceecId:props.ceecId,from:'edu-center'}});
// let json={ceecId:props.ceecId,from:'edu-center'}
// router.push({ path: '/searchview', state:
// {
// data:JSON.stringify(json)
// }
// });
}
else {
router.push({ path: '/search-things' });
}
}
</script>
<style scoped>
.ss{
display: flex;
/* margin: 16px; */
margin-top: 16px;
margin-left: 16px;
margin-right: 16px;
height: 40px;
align-items: center;
background: #FFFFFF;
box-shadow: 0px 2px 4px 0px #E0F2FF;
border-radius: 21px;
font-size: var(--front-size-14);
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: rgba(0,0,0,0.25);
line-height: 22px;
text-shadow: 0px 2px 4px #E0F2FF;
}
.ss1{
display: flex;
margin-left: 16px;
margin-right: 16px;
margin-bottom: 8px;
height: 40px;
align-items: center;
background: #FFFFFF;
box-shadow: 0px 2px 4px 0px #E0F2FF;
border-radius: 21px;
font-size: var(--front-size-14);
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: rgba(0,0,0,0.25);
line-height: 22px;
text-shadow: 0px 2px 4px #E0F2FF;
}
.nut-image{
margin-left: 16px;
margin-right: 6px;
}
.dicon{
margin-left: 16px;
margin-right: 6px;
}
</style>

View File

@ -0,0 +1,93 @@
<template >
<div class="edu-head1">
<div>&nbsp;</div>
<div class="ss" @click="click">
<!-- <nut-image class="dicon" width="20" height="20" :src=search alt="图片描述" /> -->
<img src='../assets/search.png' with="20" height="20" class="dicon" >
<!-- <nut-image class="dicon" width="20" height="20" src='src/assets/search.png' alt="图片描述" /> -->
{{ props.message}}</div>
</div>
</template>
<script setup >
import { useRouter } from 'vue-router';
// import search from '../assets/search.png'
const props = defineProps({
message: {
type: String,
required: true
} ,
searchtype:{
type: String,
default:'paper'
} ,
ceecId:{
type: String,
default:''
}
});
const router = useRouter();
function click()
{
if(props.searchtype=='paper')
{
router.push({ path: '/searchview',query:{ceecId:props.ceecId,from:'department'} });
// let json={ceecId:props.ceecId,from:'department'}
// router.push({ path: '/searchview', state:
// {
// data:JSON.stringify(json)
// }
// });
}
else if(props.searchtype=='xuanjiao')
{
router.push({ path: '/interact-search' });
}
else {
router.push({ path: '/search-things' });
}
}
</script>
<style scoped>
.edu-head1{
/* background-image: url(../assets/edubg.png); */
/* background-size: cover; */
background: linear-gradient(180deg, #F1FAFF 0%, #FFFFFF 100%);
}
.ss{
display: flex;
margin-right: 16px;
margin-left: 16px;
margin-bottom: 16px;
height: 40px;
align-items: center;
background: #FFFFFF;
border-radius: 21px;
border: 2px solid #3BB5FE;
font-size: var(--front-size-14);
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: rgba(0,0,0,0.25);
line-height: 22px;
text-shadow: 0px 2px 4px #E0F2FF;
}
.nut-image{
margin-left: 16px;
margin-right: 6px;
}
.dicon{
margin-left: 16px;
margin-right: 6px;
}
</style>

View File

@ -0,0 +1,88 @@
<template>
<nut-tabbar class="nuttabbar" @tab-switch="tabSwitch"
bottom active-color="#2BB5ECFF" unactive-color="rgba(0,0,0,0.24)" v-model="activee">
<nut-tabbar-item
v-for="item in list"
:tab-title="item.text"
:to="item.to"
>
<template #icon="props">
<img :src="props.active ? item.active : item.unactive" alt="" :style="{width:'24px',height:'24px'}"/>
</template>
</nut-tabbar-item>
</nut-tabbar>
</template>
<script setup>
import edu from "../assets/edu.png";
import edun from "../assets/edun.png";
import My from "../assets/myn.png";
import SMy from "../assets/my.png";
import department from '@/assets/department.png'
import departmentn from '@/assets/departmentn.png'
import interact from '@/assets/interact.png'
import interactn from '@/assets/interactn.png'
import { ref,onMounted } from 'vue';
import { useRouter } from 'vue-router'
const router = useRouter();
const cur_path=ref(router.currentRoute.value.path)
// const props = defineProps({
// departmentType: {
// type: String,
// required: false
// }
// });
// const active = (cur_path.value=='/my-tools')?ref(1):ref(0);
const activee = active();
const list = ref([
{ text: '宣教中心', active:edu,unactive:edun,to:'/education-centre',name:'/education-centre'},
{ text: '科室服务', active:department,unactive: departmentn,to:'/department',name:'/department'},
{ text: '健康互动', active:interact,unactive: interactn,to:'/interact',name:'/interact'},
{ text: '我的', active:SMy,unactive: My,to:'/my',name:'/my'},
]);
const tabSwitch= (item,index)=> {
// console.log(activee);
}
function active()
{
if(cur_path.value=='/education-centre')
{
return ref(0);
}
else if(cur_path.value=='/department')
{
return ref(1);
}
else if(cur_path.value=='/interact')
{
return ref(2);
}
else if(cur_path.value=='/my')
{
return ref(3);
}
else
{
return ref(0);
}
}
onMounted(() => {
document.title = list.value[activee.value].text;
});
</script>
<style scoped>
.nuttabbar{
--nut-tabbar-border-top: #fff;
--nut-tabbar-border-bottom: #ffffff;
--nut-tabbar-item-text-font-size:12px;
--nut-tabbar-box-shadow:0px -4px 16px 0px rgba(0,0,0,0.04);
--nut-tabbar-height:73px;
}
/deep/.nut-tabbar.nut-tabbar-bottom{
box-shadow: 0px -9px 28px 2px rgba(0,30,69,0.04);
border-radius: 24px 24px 0px 0px;
}
</style>

30
src/main.js Normal file
View File

@ -0,0 +1,30 @@
import { createApp } from 'vue'
import 'reset-css'
import './style.css'
import App from './App.vue'
import router from "@/router/index.js"
import NutUI from "@nutui/nutui";
import "@nutui/nutui/dist/style.css";
import TDesign from 'tdesign-mobile-vue';
import 'tdesign-mobile-vue/es/style/index.css';
import vue3SeamlessScroll from "vue3-seamless-scroll";
import VXETable from 'vxe-table'
import 'vxe-table/lib/style.css'
import VueLazyload from 'vue-lazyload'
import Loading from "@/components/loading/index"
//import VConsole from 'vconsole';
//const vConsole = new VConsole();
const app = createApp(App);
app.use(NutUI);
app.use(router);
app.use(TDesign);
app.use(vue3SeamlessScroll);
app.use(VXETable);
app.use(Loading);
app.use(VueLazyload,{
preLoad: 1.3,
attempt: 2
})
app.mount('#app')

249
src/router/index.js Normal file
View File

@ -0,0 +1,249 @@
import { createWebHashHistory, createRouter, createWebHistory } from 'vue-router';
import { defineAsyncComponent } from 'vue'
// import educationCentre from "@/views/education-centre.vue"
// import department from "@/views/department.vue"
// import interact from "@/views/interact.vue"
// import interactserach from "@/views/interact-search.vue"
// import my from "@/views/my.vue"
// import searchthings from "@/views/searchthings.vue"
// import live from "@/views/live.vue"
// import privateRecords from "@/views/private-records.vue"
// import visitingInformation from "@/views/visiting-information.vue"
// import doctorInfo from "@/views/doctor-info.vue"
// import leaveMessage from "@/views/leave-message.vue"
// import fbhistory from "@/views/feedback-history.vue"
// import information from "@/views/information.vue";
// import personalData from "@/views/personal-data.vue";
// import websView from "@/views/webs-view.vue";
// import video from "@/views/video.vue";
// import searchview from "@/views/searchview.vue";
// import questionnaire from "@/views/questionnaire.vue";
const routes = [
// {
// path: '/',
// name: 'home',
// component: home,
// children: [{ path: '', component: educationCentre },{ path: '/education-centre', component: educationCentre },{ path: '/my-drugs', namne:'my-drugs',component: myDrugs}
// ]
// },
{
path: '/',
redirect: '/education-centre',
},
{
path: '/education-centre',
name: 'education-centre',
//component: ()=>import('@/views/education-centre.vue')
component: defineAsyncComponent(() =>import('@/views/education-centre.vue'))
// component: educationCentre,
},
{
path: '/department',
name: 'department',
//component: ()=>import('@/views/department.vue')
component:defineAsyncComponent(() =>import('@/views/department.vue'))
// component: department,
},
{
path: '/interact',
name: 'interact',
component:defineAsyncComponent(() =>import('@/views/interact.vue'))
// component: ()=>import('@/views/interact.vue')
// component: resolve=>(require(["/@/views/interact.vue"],resolve))
// component: interact,
},
{
path: '/my',
name: 'my',
component:defineAsyncComponent(() =>import('@/views/my.vue'))
// component: ()=>import('@/views/my.vue')
// component: resolve=>(require(["/@/views/my.vue"],resolve))
// component: my,
},
{
path: '/search-things',
name: 'search-things',
component:defineAsyncComponent(() =>import('@/views/searchthings.vue'))
// component: ()=>import('@/views/searchthings.vue')
// component: resolve=>(require(["/@/views/search-things.vue"],resolve))
// component: searchthings,
},
{
path: '/live',
name: 'live',
component:defineAsyncComponent(() =>import('@/views/live.vue'))
// component: ()=>import('@/views/live.vue')
// component: resolve=>(require(["/@/views/live.vue"],resolve))
// component: live,
},
{
path: '/private-records',
name: 'private-records',
component:defineAsyncComponent(() =>import('@/views/private-records.vue'))
// component: ()=>import('@/views/private-records.vue')
// component: resolve=>(require(["/@/views/private-records.vue"],resolve))
// component: privateRecords,
},
{
path: '/visiting-information',
name: 'visiting-information',
component:defineAsyncComponent(() =>import('@/views/visiting-information.vue'))
// component: ()=>import('@/views/visiting-information.vue')
// component: resolve=>(require(["/@/views/visiting-information.vue"],resolve))
// component: visitingInformation,
},
{
path: '/doctor-info',
name: 'doctor-info',
component:defineAsyncComponent(() =>import('@/views/doctor-info.vue'))
// component: ()=>import('@/views/doctor-info.vue')
// component: resolve=>(require(["/@/views/doctor-info.vue"],resolve))
// component: doctorInfo,
},
{
path: '/leave-message',
name: 'leave-message',
component:defineAsyncComponent(() =>import('@/views/leave-message.vue'))
// component: ()=>import('@/views/leave-message.vue')
// component: resolve=>(require(["/@/views/leave-message.vue"],resolve))
// component: leaveMessage,
},
{
path: '/feedback-history',
name: 'feedback-history',
component:defineAsyncComponent(() =>import('@/views/feedback-history.vue'))
// component: ()=>import('@/views/feedback-history.vue')
// component: resolve=>(require(["/@/views/feedback-history.vue"],resolve))
// component: fbhistory,
},
{
path: '/information',
name: 'information',
component:defineAsyncComponent(() =>import('@/views/information.vue'))
// component: ()=>import('@/views/information.vue')
// component: resolve=>(require(["/@/views/information.vue"],resolve))
// component: information,
},
{
path: '/personal-data',
name: 'personal-data',
component:defineAsyncComponent(() =>import('@/views/personal-data.vue'))
// component: ()=>import('@/views/personal-data.vue')
// component: resolve=>(require(["/@/views/personal-data.vue"],resolve))
// component: personalData,
},
{
path: '/webs-view',
name: 'webs-view',
component:defineAsyncComponent(() =>import('@/views/webs-view.vue'))
// component: ()=>import('@/views/webs-view.vue')
// component: resolve=>(require(["/@/views/webs-view.vue"],resolve))
// component: websView,
},
{
path: '/video',
name: 'video',
component:defineAsyncComponent(() =>import('@/views/video.vue'))
// component: ()=>import('@/views/video.vue')
// component: resolve=>(require(["/@/views/video.vue"],resolve))
// component: video,
},
{
path: '/searchview',
name: 'searchview',
component:defineAsyncComponent(() =>import('@/views/searchview.vue'))
// component: ()=>import('@/views/searchview.vue')
// component: resolve=>(require(["/@/views/searchview.vue"],resolve))
// component: searchview,
},
{
path: '/questionnaire',
name: 'questionnaire',
component:defineAsyncComponent(() =>import('@/views/questionnaire.vue'))
// component: ()=>import('@/views/questionnaire.vue')
// component: resolve=>(require(["/@/views/questionnaire.vue"],resolve))
// component: questionnaire,
},
{
path: '/interact-search',
name: 'interactserach',
component:defineAsyncComponent(() =>import('@/views/interact-search.vue'))
// component: ()=>import('@/views/interact-search.vue')
// component: resolve=>(require(["/@/views/interact-search.vue"],resolve))
// component: interactserach,
},
];
// const routes = [
// // {
// // path: '/',
// // redirect: '/liver-drugs',
// // },
// {
// path: '/',
// redirect: '/home',
// },
// {
// path: '/home',
// name: 'home',
// component: home,
// child:[{ path: '', component: liverDrugs },
// {
// path: '/liver-drugs',
// // name: 'liver-drugs',
// component: liverDrugs,
// },
// { path: '/my-drugs',
// // name: 'my-drugs',
// component: myDrugs} ]
// },
// {
// path: '/liver-drugs',
// name: 'liver-drugs',
// component: liverDrugs,
// },
// {
// path: '/liver-tools',
// name: 'liver-tools',
// component: liverTools,
// },
// {
// path: '/liver-guidelines',
// name: 'liver-guidelines',
// component: liverGuidelines,
// },
// {
// path: '/my-drugs',
// name: 'my-drugs',
// component: myDrugs}
// ];
const router = createRouter({
// createWebHashHistory URL 带井号
// createWebHistory URL 去井号
history:createWebHashHistory(),
routes: routes,
});
export default router;

21
src/style.css Normal file
View File

@ -0,0 +1,21 @@
body{
background:#fff;
}
/* @font-face {
font-family: "阿里巴巴普惠体 2.0 65 Medium";font-weight: 500;src: url("//at.alicdn.com/wf/webfont/sgTFboRMJU3n/JxNJC26HiA0D.woff2") format("woff2"),
url("//at.alicdn.com/wf/webfont/sgTFboRMJU3n/T8cUklUUIqA1.woff") format("woff");
font-display: swap;
} */
/* 在线链接服务仅供平台体验和调试使用,平台不承诺服务的稳定性,企业客户需下载字体包自行发布使用并做好备份。 */
@font-face {
font-family:AlibabaPuHuiTiM;;
src:url('../src/assets/font/Alibaba_PuHuiTi_2.0_65_Medium_65_Medium.ttf')
}
@font-face {
font-family:AlibabaPuHuiTiR;
src:url('../src/assets/font/Alibaba_PuHuiTi_2.0_55_Regular_55_Regular.ttf')
}
@font-face {
font-family:AlibabaPuHuiTiB;
src:url('../src/assets/font/Alibaba_PuHuiTi_2.0_115_Black_115_Black.ttf')
}

285
src/utils/api.js Normal file
View File

@ -0,0 +1,285 @@
import service from './request';
export function getJsapiSignature(appid,url) {
return service({
url:'/oauth2/getJsapiSignature/'+appid,
method: 'get',
params:{
url:url,
}
})
}
export function oauth2greet(appid,officeId,code) {
return service({
url:'/oauth2/greet/'+appid+'/'+officeId,
method: 'get',
params:{
code:code
}
})
}
export function getIndex() {
return service({
url:'/index',
method: 'get'
})
}
export function queryDepars() {
return service({
url:'/officeserve/queryDepars',
method: 'get'
})
}
export function queryPage(pageNum,title) {
return service({
url:'/interact/queryPage',
method: 'post',
data:{
pageNum:pageNum,
pageSize :10 ,
title:title
}
})
}
export function queryNoticeList() {
return service({
url:'/notice/queryNoticeList',
method: 'get'
})
}
export function clickArticle(article_id) {
return service({
url:'/article/clickArticle/'+article_id,
method: 'get'
})
}
export function Articleread(article_id) {
return service({
url:'/article/read/'+article_id,
method: 'get'
})
}
export function Articlecollect(article_id,collect_flag) {
return service({
url:'/article/collect/'+article_id+'/'+collect_flag,
method: 'get'
})
}
export function Articledetail(article_id) {
return service({
url:'/article/detail/'+article_id,
method: 'get'
})
}
export function queryClickArticle(pageNum) {
return service({
url:'/article/queryClickArticle',
method: 'post',
data:{
// ceecId: 0,
pageNum:pageNum,
pageSize :10 ,
// tagId:0,
// title:'string'
}
})
}
export function queryColectArticle() {
return service({
url:'/article/queryColectArticle',
method: 'post'
})
}
export function queryReadArticle() {
return service({
url:'/article/queryReadArticle',
method: 'post'
})
}
export function getArticleList(url,pageNum,ceecId,title,mediaType,tagId) {
return service({
url:url,
method: 'post',
data:{
ceecId:ceecId ,
pageNum:pageNum,
pageSize :10 ,
tagId:tagId,
title:title,
mediaType:mediaType
}
})
}
export function getCeecArticleList(pageNum,ceecId,tagId,title) {
return service({
url:'/ceecArticleList',
method: 'post',
data:{
ceecId:ceecId ,
pageNum:pageNum,
pageSize :10 ,
tagId:tagId,
title:title
}
})
}
export function advise(content) {
return service({
url:'/advise/add',
method: 'post',
data:{
content:content ,
}
})
}
export function advisequeryPage(pageNum) {
return service({
url:'/advise/queryPage',
method: 'post',
data:{
pageNum:pageNum,
pageSize :10 ,
}
})
}
export function queryAddressTime(week) {
return service({
url:'/outpatient/queryAddressTime',
method: 'post',
data:{
week:week,
}
})
}
export function getmy() {
return service({
url:'/user/my',
method: 'get'
})
}
export function queryList() {
return service({
url:'/medicalStaff/queryList',
method: 'get'
})
}
export function medicalStaff(id) {
return service({
url:'/medicalStaff/get/'+id,
method: 'get'
})
}
export function userInfo() {
return service({
url:'/user/info',
method: 'get'
})
}
export function diseaseList() {
return service({
url:'/user/diseaseList',
method: 'get'
})
}
export function educationalList() {
return service({
url:'/user/educationalList',
method: 'get'
})
}
export function positionList() {
return service({
url:'/user/positionList',
method: 'get'
})
}
// export function userUpdate(birthday,city,disease,district,educational,height,mobile,name,occupation,province,sex,weight) {
// return service({
// url:'/user/update',
// method: 'post',
// data:{
// birthday: birthday,
// city:city,
// disease: disease,
// district: district,
// educational:educational,
// height:height,
// mobile: mobile,
// name: name,
// occupation: occupation,
// province: province,
// sex:sex,
// weight: weight
// }
// })
// }
export function userUpdate(formData){
return service({
url:'/user/update',
method: 'post',
data:formData
})
}
export function medicalStaffqueryPage(pageNum,name) {
return service({
url:'/medicalStaff/queryPage',
method: 'post',
data:{
name:name,
pageNum:pageNum,
pageSize :10 ,
}
})
}
export function livequeryPage(pageNum) {
return service({
url:'/live/queryPage',
method: 'post',
data:{
pageNum:pageNum,
pageSize :10 ,
}
})
}
export function questionnaire(pageNum) {
return service({
url:'/questionnaire/queryPage',
method: 'post',
data:{
pageNum:pageNum,
pageSize :10 ,
}
})
}
// export function addCorrection(id,catalog_id,content) {
// return service({
// url:'/book/drughand/addCorrection',
// method: 'post',
// params:{
// id:id,
// catalog_id:catalog_id,
// content:content
// }
// })
// }
export const imgurl='https://health-edu.oss-cn-beijing.aliyuncs.com/';
// export const greet="http://dev.edu.igandan.com/gdxz-h5/oauth2/index/";
export const greet="https://h5.ixuanjiao.com/api/oauth2/index/";
// export const roootUrl='http://dev.edu.igandan.com/h5/index.html?officeid=';
// export const roootUrl='https://xuanjiao.igandan.com/h5/index.html?officeid=';
export const roootUrl='https://h5.ixuanjiao.com/index.html?officeid=';
export const fromwexin='&frommywexin=wx';
export const frommywexin='?frommywexin=wx';

24998
src/utils/areaList.js Normal file

File diff suppressed because it is too large Load Diff

1
src/utils/const.js Normal file
View File

@ -0,0 +1 @@
export const title='健康宣教';

56
src/utils/greet.js Normal file
View File

@ -0,0 +1,56 @@
import {oauth2greet,roootUrl} from '../utils/api'
export async function goGreet() {
//alert(window.location.href);
const urlSearchParams = new URLSearchParams(window.location.search)
let appid = urlSearchParams.get('appid')
let officeid = urlSearchParams.get('officeid')
const code = urlSearchParams.get('code')
localStorage.setItem("officeid", officeid);
const token=localStorage.getItem(officeid + '-token');
if(typeof token === "undefined" ||token ==null)
{
}
else
{
localStorage.removeItem(officeid + '-token');
}
//alert('第1个'+code)
if (code) {
//alert('第二个:'+code)
//alert('appid:'+appid);
//alert('officeid:'+officeid);
let res= await oauth2greet(appid, officeid, code);
//alert(JSON.stringify(res));
if(res.code==200){
localStorage.setItem(officeid + '-token', res.data);
window.location.href =roootUrl + officeid + '&appid=' +appid
}else if(res.code === 30001){
let encodedUrl = encodeURIComponent(window.location.href)
window.location.href = roootUrl + appid + "&redirect_uri=" + encodedUrl + "&response_type=code&scope=snsapi_userinfo&state=1&component_appid=wx61944e1d991e380e&connect_redirect=1#wechat_redirect";
}else{
console.log('接口报错');
}
// .then((res) => {
// console.log("oauth2greetapp", res);
// // alert("oauth2greetapp")
// localStorage.setItem(officeid + '-token', res.data);
// // localStorage.setItem('default' + '-token', res.data);
// if(res.code === 30001){
// let encodedUrl = encodeURIComponent(window.location.href)
// window.location.href = roootUrl + appid + "&redirect_uri=" + encodedUrl + "&response_type=code&scope=snsapi_userinfo&state=1&component_appid=wx61944e1d991e380e&connect_redirect=1#wechat_redirect";
// return
// }
// }).then(()=>{
// // window.location.reload();
// window.location.href =roootUrl + officeid + '&appid=' +appid
// })
} else {
// alert("coddafse")
let encodedUrl = encodeURIComponent(window.location.href)
window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + encodedUrl + "&response_type=code&scope=snsapi_userinfo&state=1&component_appid=wx61944e1d991e380e&connect_redirect=1#wechat_redirect";
}
}

179
src/utils/request.js Normal file
View File

@ -0,0 +1,179 @@
import axios from 'axios';
import { goGreet } from '../utils/greet.js'
let flag=true;
// create an axios instance
const service = axios.create({
baseURL:import.meta.env.VITE_BASE_URL,
timeout: 8000,
// withCredentials: true,
headers:{
'Content-Type':'application/json',
'Authorization':'',
'x-access-token':''
//'x-access-token':'eyJhbGciOiJIUzUxMiJ9.eyJpZCI6NjAsIm9mZmljZWlkIjoxNSwiaDVfdXNlciI6IntcImFwcGlkXCI6XCJ3eGFiOGEzMDUwNTNhYTk3MTRcIixcImRlcGFydG1lbnRJZFwiOjM1LFwiaWRcIjo2MCxcIm9mZmljZUlkXCI6MTUsXCJvcGVuaWRcIjpcIm9ycktCNlVBdUt2a0J6czExcFo5dDlfY0R6UHdcIn0iLCJ0eXBlIjo1LCJkZXZpY2UiOjQsInN1cGVyUGFzc3dvcmRGbGFnIjpmYWxzZSwiaWF0IjoxNzA5ODAzODM0LCJleHAiOjE3MTA0MDg2MzR9.sl9UosweMuh39c30dekva68xKsfp0v0n74_Bkn4JGczIIU8eUTdJR6Iud0JuypRymtEl4YzVOny7c7KnMtzrMA'
}
});
// request interceptor
service.interceptors.request.use(
(config) => {
// Store 必须在拦截器内部导入,在外部导入会显示 Pinia 未初始化
// 设置请求头部 Authorization
// console.log("333333");
// console.log(config);
const officeid = localStorage.getItem("officeid")
if(typeof officeid === "undefined"||officeid ==null|| officeid == "undefined")
{
config.headers['x-access-token'] = '';
}
else
{
const token=localStorage.getItem(officeid + '-token');
if(typeof token === "undefined"||token ==null|| token == "undefined"|| token == "")
{
config.headers['x-access-token'] = '';
}
else
{
config.headers['x-access-token'] = token;
}
}
return config;
},
(error) => {
console.error(error);
return Promise.reject(error);
}
);
// response interceptor
service.interceptors.response.use(
async (response) => {
// console.log(response)
//var Authorization_token = response.headers.Authorization;
// if (Authorization_token) {
// sessionStorage.setItem('token', Authorization_token); //当token快过期时服务器会返回新token本地刷新
// }
const { code, message } = response.data;
// console.log("code",code);
if (code == 30007 || code == 40007)
{
const officeid = localStorage.getItem("officeid");
if(!officeid){
console.log("officeid不存在")
};
localStorage.clear();
// if(flag){
// flag=false;
// goGreet();
// }
goGreet();
}
else if(code == 60003)
{
let back_url = window.location.href;
window.location.href="https://wx.igandan.com/hcp/toLogin?back_url="+back_url;
// window.location.href="https://twx.igandan.org/hcp/toLogin?back_url="+back_url;
}
else if (code == 401 || code==403 || code==405 || code==406) {
//Message.clear();
// Message.error({
// content: message,
// duration: 3000
// });
// 重定向路由到登陆页面
}else if(code === 400){
// Message.error({
// content: '缺少参数',
// duration: 3000
// });
}else if(code == 402){
// Message.error({
// content: '请求无权限',
// duration: 3000
// });
}else if(code == 201){
// Message.error({
// content: '账户状态异常',
// duration: 3000
// });
}else if(code==-1){
// Message.error({
// content: message,
// duration: 3000
// });
}else{
flag=true;
}
return response.data;
},
(error) => {
console.log("------------------");
console.log(error);
const { code, message } = error.response.data;
// 如果过期则退出登录
if (code == 30007 || code == 40007)
{
const officeid = localStorage.getItem("officeid");
if(!officeid){
console.log("officeid不存在")
};
localStorage.clear();
// if(flag){
// flag=false;
// goGreet();
// }
goGreet();
}
else if(code == 60003)
{
let back_url = window.location.href;
window.location.href="https://wx.igandan.com/hcp/toLogin?back_url="+back_url;
}
else if (code === 401 || code==403 || code==405 || code==406) {
// Message.error({
// content: message,
// duration: 3000
// });
// // 重定向路由到登陆页面
// store.clearInfo();
// window.location.href="/login";
}else if(code === 400){
// Message.error({
// content: '缺少参数',
// duration: 3000
// });
}else if(code === 402){
// Message.error({
// content: '请求无权限',
// duration: 3000
// });
}else if(code === 201){
// Message.error({
// content: '账户状态异常',
// duration: 3000
// });
}else {
flag=true;
// Message.error({
// content: error.message,
// duration: 3000
// })
}
return Promise.reject(message);
}
);
// export const imgurl='http://47.105.52.114:8085/app/';
export const fromwexin='&frommywexin=wx';
export const frommywexin='?frommywexin=wx';
export default service;

26083
src/utils/video.js Normal file

File diff suppressed because one or more lines are too long

103
src/utils/wxshare-1.6.0.js Normal file
View File

@ -0,0 +1,103 @@
import wx from 'weixin-js-sdk'
import { getJsapiSignature } from './api'
let share = {
title: "",
desc: "",
link: "",
imgUrl: "",
init: function () {
var path = location.href.split('#')[0];
var url = "";
var appid = localStorage.getItem("appid");
// getJsapiSignature(url, {
// params: {
// path: encodeURIComponent(window.location.href.split('#')[0]),
// appid: appid
// }
// })
getJsapiSignature(appid,encodeURIComponent(window.location.href.split('#')[0]))
.then(json => {
// console.log('json',json)
wx.config({
debug: false,
appId: appid,
timestamp: json.data.timestamp,
nonceStr: json.data.nonceStr,
signature: json.data.signature,
jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'onMenuShareTimeline', 'onMenuShareAppMessage']
});
}).catch((e) => {
console.log('获取数据失败');
});
wx.checkJsApi({
jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'onMenuShareTimeline', 'onMenuShareAppMessage'], // 需要检测的JS接口列表所有JS接口列表见附录2,
success: function (res) {
console.log(res)
}
});
wx.ready(function () {
wx.updateAppMessageShareData({
title: share.title,
desc: share.desc,
link: share.link,
imgUrl: share.imgUrl,
success: function () { }
})
wx.updateTimelineShareData({
title: share.title,
desc: share.desc,
link: share.link,
imgUrl: share.imgUrl,
success: function () { }
})
wx.onMenuShareTimeline({
title: share.title,
desc: share.desc,
link: share.link,
imgUrl: share.imgUrl,
success: function () { }
})
wx.onMenuShareAppMessage({
title: share.title,
desc: share.desc,
link: share.link,
imgUrl: share.imgUrl,
success: function () { }
})
});
}
}
function WXSHARE(title, desc, link, imgUrl) {
share.title = title;
// share.desc = desc;
share.desc = '欢迎来到'+localStorage.getItem("hospitalName")+localStorage.getItem("officeName")+'智能化移动宣教中心';
share.link = link;
if (imgUrl == undefined || imgUrl == "") {
imgUrl = "https://health-edu.oss-cn-beijing.aliyuncs.com/system/share.png";
}
share.imgUrl = imgUrl;
share.init();
};
function WXSHAREHOME(title, desc, link, imgUrl) {
// share.title = title;
// share.desc = desc;
share.title = '欢迎来到'+localStorage.getItem("hospitalName")+localStorage.getItem("officeName")+'智能化移动宣教中心';
share.desc ='点击进入并收藏,把知识带回家';
share.link = link;
if (imgUrl == undefined || imgUrl == "") {
imgUrl = "https://health-edu.oss-cn-beijing.aliyuncs.com/system/share.png";
}
share.imgUrl = imgUrl;
share.init();
};
export {
WXSHARE,WXSHAREHOME
}

219
src/views/department.vue Normal file
View File

@ -0,0 +1,219 @@
<template >
<div style="background: var(--back-color-02);min-height:100vh;">
<div style="height: 12px;"></div>
<div class="notice" v-if="horseLamp3.length>0">
<img
src="../assets/notice.png"
style="width: 65px; height: 26px;margin-left: 28px;margin-top: 36px;"
/>
<div style="height: 16px;border: 1px solid rgba(0,0,0,0.25);margin-top: 40px;margin-left: 12px;"></div>
<!-- <div class="scroll1" v-if="horseLamp3.length==1" @click="openNotice(horseLamp3[0])" >
{{horseLamp3[0].title}}
</div> -->
<vue3-seamless-scroll :list="horseLamp3" class="scroll" direction=left singleLine=true limitScrollNum=1 step="0.5" >
<div class="custom-item" v-for="(item, index) in horseLamp3" :key="index" @click="openNotice(item)">
<div style="min-width: 200px;">{{item.title+'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'}}</div>
</div>
</vue3-seamless-scroll>
</div>
<nut-overlay v-model:visible="show" :close-on-click-overlay="false">
<div class="wrapper">
<div class="content">
<div style="font-size: var(--font-size-16);font-family: AlibabaPuHuiTiM;color: rgba(0,0,0,0.85);line-height: 24px;text-align: center;margin-top: 24px;
margin-left: 16px;margin-right: 16px;">{{ noticeTitle }}</div>
<div style="font-size: var(--font-size-14);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 24px;margin: 16px; overflow: auto;
white-space: pre-line;
">{{ noticeDetail}}</div>
</div>
<img
src="../assets/close.png"
style="width: 32px; height: 32px;margin-top: 32px;" @click="closeNotice"
/>
</div>
</nut-overlay>
<div class="classgrid">
<div v-for="(item, index) in departemntlist" v-if="departemntlist.length>0" class="third" @click="gotoNextPage(item)">
<!-- <div @click="gotoNextPage(item)"> -->
<nut-image :src=imgurl+item.ceecImg width="68" height="60"
/>
<div class="ftitle">{{ item.ceecName }} </div>
<div class="fcontent" v-if="item.ceecArticleNum>0" style="color: rgba(0,0,0,0.45);">{{''+item.ceecArticleNum+''}}</div>
<div class="fcontent" v-else style="color: white;">共篇</div>
<!-- </div> -->
</div>
</div>
<TabTools></TabTools>
</div>
</template>
<script setup >
import { useRouter } from 'vue-router';
import { WXSHARE } from '../utils/wxshare-1.6.0';
import {queryDepars,queryNoticeList,imgurl} from '../utils/api.js'
const router = useRouter();
const show = ref(false);
const noticeTitle = ref('');
const noticeDetail = ref('');
const horseLamp3 = reactive([
]);
const departemntlist=ref([])
function initData()
{
queryDepars().then((data) => {
departemntlist.value.push(...data.data)
departemntlist.value=departemntlist.value.filter(item => item.ceecName !== '公告板块');
});
queryNoticeList().then((data) => {
horseLamp3.push(...data.data)
});
}
onMounted(() => {
initData()
WXSHARE("科室服务", '肝胆相照-肝胆病在线公共服务平台', window.location.href,"");
})
function openNotice(item)
{
console.log(item.name)
show.value=true
noticeTitle.value=item.title
noticeDetail.value=item.content
}
function closeNotice()
{
show.value=false
}
function gotoNextPage(item)
{
if(item.ceecName=='出诊信息')
{
router.push({ path: '/visiting-information'});
}
else if(item.ceecName=='留言反馈')
{
router.push({ path: '/leave-message'});
}
else if(item.ceecName=='调查问卷')
{
router.push({ path: '/questionnaire'});
}
else
// (item.ceecName==''||item.ceecName==''||item.ceecName==''||item.ceecName=='')
{
// let json={type:item.ceecName,ceecId:item.ceecId,from:'department'}
// router.push({ path: '/information', state:
// {
// data:JSON.stringify(json)
// }
// });
router.push({ path: '/information', query: {type:item.ceecName,ceecId:item.ceecId,from:'department'} });
}
}
</script>
<style scoped>
.notice {
display: flex;
margin-left: 14px;
margin-right: 14px;
background: url(../assets/notice_bg.png);
background-size: contain;
height: 80px;
background-repeat: no-repeat;
}
.scroll{
margin-top: 40px;
margin-left: 12px;
margin-right: 28px;
overflow: hidden;
}
.scroll1{
margin-top: 40px;
font-size: 16px;
/* font-size: var( --font-size-14); */
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
padding-left: 12px;
padding-right: 28px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.custom-item{
font-size: 16px;
/* font-size: var( --font-size-14); */
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
}
.wrapper {
display: flex;
height: 100%;
flex-direction: column;
align-items: center;
justify-content: center;
}
.content {
width: 80%;
min-height: 178px;
max-width: 420px;
background:#F6FBFF ;
border-radius: 16px;
/* background: url(../assets/n_bg.png);
background-size: contain;
background-repeat:no-repeat; */
}
.classgrid{
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 10px;
margin: 16px;
padding-bottom: 60px;
}
.third{
display: flex;
flex-direction: column;
height: 137px;
background: linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(255,255,255,0.5) 100%);
border-radius: 8px;
width: 100%;
background: white;
justify-content: center;
align-items: center;
}
.ftitle{
margin-top: 5px;
/* font-size: var(--font-size-16); */
font-size: 18px;
font-family: AlibabaPuHuiTiM;
color: #233C4C;
line-height: 24px;
}
.fcontent{
margin-top: 2px;
font-size: 14px;
/* font-size: var(--font-size-12); */
font-family: AlibabaPuHuiTiR;
line-height: 17px;
}
</style>

365
src/views/doctor-info.vue Normal file
View File

@ -0,0 +1,365 @@
<template>
<nut-sticky>
<div style="background: white;" ref="myDiv" id="myDiv">
<headBar :title=title ></headBar>
<div class="horizontal-list-item" >
<div style="margin-left: 16px; display: block;width: 60%;">
<div style="font-size: var(--font-size-20);
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
line-height: 22px;">
{{ name }}
</div>
<div class="personinfo1">
{{ duties+''}}
<!-- <div>
<span class="zhu1" style="background: #2BBAF9FF;" v-if="position=='主任医师'"></span>
<span class="zhu1" style="background: #00CA70FF;" v-if="position=='副主任医师'"></span>
</div> -->
{{position }}
</div>
<div class="personinfo">
{{'专长:'+goodat}}
</div>
</div>
<nut-image :src=imgurl+photo alt="图片描述" fit="cover"
width="119px" height='119px' round radius="60"
style="margin-right: 16px;margin-left: 16px;"/>
</div>
<t-tabs :value="currentValue" @change="onChange" >
<t-tab-panel value="first">
<template #label>
<div>个人介绍</div>
</template>
</t-tab-panel>
<t-tab-panel value="second">
<template #label>出诊信息</template>
</t-tab-panel>
<t-tab-panel value="third" v-if="list.length>0">
<template #label>科普宣教</template>
</t-tab-panel>
</t-tabs>
</div>
</nut-sticky>
<div >
<div ref="myDiv1">
<div class="personin" style="margin-top: 24px;" id="grjs">
个人介绍
</div>
<div class="personinfo2" >
{{ introduction }}
</div>
<div class="personin" id="czxx">
出诊信息
</div>
</div>
<div v-for="(item, index) in outpatientList" >
<div class="info" >
<div class="infog" v-if=" index % 2 == 0"> </div>
<div class="infog1" v-else> </div>
<div style="margin-left: 16px;">
<div style="display: flex;">
<div class="personinfo3">出诊类型</div>
<div class="personinfo4">{{ item.type }}</div>
</div>
<div style="display: flex;margin-top: 12px;">
<div class="personinfo3">出诊时间</div>
<div class="personinfo4">{{item.week+item.timeSlot+''+item.address}}</div>
</div>
</div>
</div>
</div>
<div style="height: 16px;"></div>
<div class="personin" id="xjkp" style="margin: 0px 16px 0px 16px;" v-if="list.length>0">
宣教科普
</div>
<paperList :list="list" :needTop="false" :needlabel="false" v-if="list.length>0"></paperList>
</div>
</template>
<script setup>
import {medicalStaff,imgurl,fromwexin} from '../utils/api.js'
import { useRoute } from 'vue-router';
import { WXSHARE } from '../utils/wxshare-1.6.0';
const title=ref('医生信息')
const router = useRoute();
const currentValue = ref('first');
const myDiv = ref(null);
const name = ref('');
const goodat = ref('');
const duties = ref('');
const position = ref('');
const photo = ref('');
const myDiv1 = ref(null);
const scrollHeight = ref(0);
const introduction= ref('');
const outpatientList= ref([]);
const list = ref(
[
// {
// title:'',
// type:'',
// types:['','','gsklgjl','','ufoirut[quopp]'],
// img:"#A6D9FFFF"
// },
// {
// title:'',
// type:'',
// types:['',''],
// img:"#299BDFFF"
// },
// {
// title:'rwr34r',
// type:'',
// types:['',''],
// img:"#299BDFFF"
// }
]
);
const getElementTop=(elem)=> {
let elemTop = elem.offsetTop; //
let parentElem = elem.offsetParent; //
while (parentElem) {
elemTop += parentElem.offsetTop;
parentElem = parentElem.offsetParent;
}
return elemTop;
}
const onChange = (label) => {
currentValue.value=label;
console.log(currentValue.value)
let topH=document.querySelector("#myDiv").offsetHeight;
if(label=='first'){
let ele=document.querySelector("#grjs");
let t=getElementTop(ele);
window.scrollTo(0,t-topH);
}else if(label=='second'){
let ele=document.querySelector("#czxx");
let t=getElementTop(ele);
window.scrollTo(0,t-topH);
// if (scrollHeight.value>myDiv1.value.clientHeight) {
// window.scrollTo(0, myDiv.value.clientHeight);
// }else{
// window.scrollTo(0, myDiv1.value.clientHeight);
// }
// window.scrollTo(0, myDiv.value.clientHeight-10);
}else{
let ele=document.querySelector("#xjkp");
let t=getElementTop(ele);
window.scrollTo(0,t-topH);
}
};
onMounted(() => {
const handleScroll = () => {
scrollHeight.value = document.documentElement.scrollTop || document.body.scrollTop;
};
window.addEventListener('scroll', handleScroll);
onUnmounted(() => {
window.removeEventListener('scroll', handleScroll);
});
initData( router.query.id)
});
watch(
() => scrollHeight.value,
(newValue) => {
let topH=document.querySelector("#myDiv").offsetHeight;
//let ele1=document.querySelector("#grjs");
let ele2=document.querySelector("#czxx");
let ele3=document.querySelector("#xjkp");
//let t1=getElementTop(ele1)-topH;
let t2=getElementTop(ele2)-topH;
let t3=getElementTop(ele3)-topH;
let scrollHeight = document.body.scrollHeight;
let scrollTop = document.body.scrollTop || document.documentElement.scrollTop
let clientHeight = window.innerHeight ;
// console.log(newValue.toFixed(0));
// console.log(topH)
// // console.log("t2:"+t2);
// // console.log("t3:"+t3)
// console.log('scrollHeight:'+scrollHeight)
// console.log('scrollTop:'+scrollTop);
// console.log("clientHeight:"+clientHeight)
let isBottom=false;
console.log('add:'+(scrollTop+clientHeight));
console.log('scrollHeight:'+scrollHeight);
console.log(Math.abs(scrollTop+clientHeight-scrollHeight)<5)
if(Math.abs(scrollTop+clientHeight-scrollHeight)<5){
isBottom=true
}
if(isBottom){
currentValue.value='third'
} else if(newValue.toFixed(0)<t2){
currentValue.value='first';
}else if(newValue.toFixed(0)>=t2 &&newValue.toFixed(0)<t3 && !isBottom){
currentValue.value='second'
}else if(newValue.toFixed(0)>=t3){
currentValue.value='third'
}
// if(newValue <myDiv.value.clientHeight&&newValue <myDiv1.value.clientHeight)
// {
// currentValue.value='first'
// }
// else if (newValue>=myDiv1.value.clientHeight&&newValue<=myDiv.value.clientHeight+myDiv1.value.clientHeight) {
// currentValue.value='second'
// }
// else
// {
// currentValue.value='third'
// }
}
);
function initData(id)
{
medicalStaff(id).then((data) => {
console.log("medicalStaff", data);
name.value= data.data.name
goodat.value=data.data.goodat
duties.value=data.data.duties
position.value=data.data.position
photo.value=data.data.photo
introduction.value=data.data.introduction
outpatientList.value.push(...data.data.outpatientList)
list.value.push(...data.data.articleList)
WXSHARE(name.value, '肝胆相照-肝胆病在线公共服务平台', window.location.href+fromwexin,"");
});
}
</script>
<style scoped>
:deep() .t-pull-down-refresh__tips{
display: none!important;
}
.horizontal-list-item {
display: flex;
align-items: center;
margin-top: 24px;
}
.personinfo1{
font-size:16px;
/* font-size: var(--font-size-14); */
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
display: flex;
line-height: 16px;
margin-top: 12px;
margin-bottom: 13px;
}
.personinfo{
font-size:14px;
/* font-size: var(--font-size-12); */
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
line-height: 22px;
}
.t-tabs{
margin-top: 18px;
--td-tab-item-height:38px;
/* height: 38px; */
/* font-size: var(--font-size-14); */
font-size:16px;
font-family: AlibabaPuHuiTiR;
--td-tab-track-color: #3BB5FEFF;
--td-tab-nav-bg-color:transparent;
background: #FFFFFF;
border-radius: 20px 20px 0px 0px;
--td-tab-item-active-color: #3BB5FEFF;
--td-tab-item-color:rgba(0,0,0,0.65);
--td-tab-border-color:transparent;
}
.personin{
margin-left: 16px;
font-size:18px;
/* font-size: var(--font-size-16); */
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
line-height: 24px;
}
.personinfo2{
font-size:16px;
/* font-size: var(--font-size-14); */
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
line-height: 24px;
margin-left: 16px;
margin-right: 16px;
margin-top: 12px;
margin-bottom: 32px;
white-space: pre-wrap;
}
.info{
position: relative;
padding:10px 0;
/* height: 88px; */
background: #FFFFFF;
border-radius: 8px;
border: 2px solid rgba(0,0,0,0.08);
margin-left: 16px;
margin-right: 16px;
margin-top: 12px;
overflow: hidden;
display: flex;
align-items: center;
}
.infog{
position: absolute;
width: 4px;
height: 100%;
background: #26D674;
}
.infog1{
position: absolute;
width: 4px;
height: 100%;
background: #FB9798FF;
}
.personinfo3{
white-space: nowrap;
font-size:16px;
/* font-size: var(--font-size-14); */
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.45);
line-height: 22px;
}
.personinfo4{
margin-left: 16px;
font-size:16px;
/* font-size: var(--font-size-14); */
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.85);
line-height: 22px;
}
.zhu1{
margin-left: 4px;
margin-right: 4px;
font-size:14px;
/* font-size: var(--font-size-12); */
font-family: AlibabaPuHuiTiR;
color: #FFFFFF;
line-height: 16px;
padding:0px 2px;
border-radius: 2px;
word-wrap: break-word;
}
:deep() .t-list{
padding-bottom: 20px;
}
</style>

View File

@ -0,0 +1,543 @@
<template >
<div class="edu-head">
<div class="department">
<nut-image class="dicon" width="40" height="40" :src=hospitalLogo alt="图片描述" round />
<div class="dtitle">
<nut-ellipsis
:content=hospital
rows="1"
direction="end"
v-if="hospital.length>10"
></nut-ellipsis>
<nut-ellipsis
:content=dtitle
v-if="hospital.length>10"
rows="1"
direction="end"
></nut-ellipsis>
<div v-if="hospital.length<11">{{ hospital}}</div>
<div v-if="hospital.length<11">{{dtitle }}</div>
</div>
<div class="changedepart" @click="changedepart" v-if="hospital.length<11">
<img src='../assets/change_depart.png' style=" width: 16px;height: 16px;">
切换科室</div>
</div>
<search :message="searchMessage" />
</div>
<div style="background: var(--back-color-01);">
<nut-overlay v-model:visible="show" :close-on-click-overlay="false">
<div class="wrapper">
<div class="content" v-if="showPop">
<div class="raido_title">切换科室</div>
<nut-radio-group v-model="radioVal" @change="handleChange" class="contentchild">
<div v-for="(item, index) in departemntlist">
<nut-radio :label=index>
<template #icon>
<!-- <IconFont size="16" name= 'src/assets/radio_no.png' :style="{ 'margin-top': '3px' }" /> -->
<IconFont size="16" :name=radio_no :style="{ 'margin-top': '3px' }" />
</template>
<template #checkedIcon>
<!-- <IconFont size="16" name= 'src/assets/radio_sel.png' :style="{ 'margin-top': '3px' }" /> -->
<IconFont size="16" :name=radio_sel :style="{ 'margin-top': '3px' }" />
</template>
{{ item.officeName }}
</nut-radio>
</div>
</nut-radio-group>
<div :style="{
display: 'flex', background: '#FFFFFF',
'border-radius': '0px 0px 12px 12px'
}">
<div class="bt_no" @click.stop="handleclick(false)">取消</div>
<div class="bt_yes" @click.stop="handleclick(true)">确认</div>
</div>
</div>
<div class="content1" v-if="showPop1">
<div class="raido_title">温馨提示</div>
<div class="raido_title1">{{ '您确定要跳转到:' + hospitaltmp + '-' + dtitletmp }}</div>
<div class="raido_title2">{{ '您当前浏览的科室为:' + hospital + '-' + dtitle }}</div>
<div :style="{ display: 'flex' }">
<div class="bt_no" @click.stop="handleclick(false)">取消</div>
<div class="bt_yes" @click.stop="handleclick(true, true)">确认</div>
</div>
<div>
</div>
</div>
</div>
</nut-overlay>
<div class="classgrid">
<div v-if="appOfficeCeecList.length > 0" :style="{
'background-size': '100% 100%', 'height': '188px', 'background-repeat': 'no-repeat', 'border-radius': '8px'
}" @click="gotoNextPage(appOfficeCeecList[0])" v-lazy:background-image="imgurl + appOfficeCeecList[0].ceecImg">
<div class="ftitle">{{ appOfficeCeecList[0].ceecName }}</div>
<div class="fcontent" v-if="appOfficeCeecList[0].ceecArticleNum > 0">{{ '' + appOfficeCeecList[0].ceecArticleNum
+ '篇'
}}</div>
</div>
<div class="classgrid1">
<div :style="{
'height': '88px',
'background-size': '100% 100%', 'background-repeat': 'no-repeat', 'border-radius': '8px'
}" @click="gotoNextPage(appOfficeCeecList[1])" v-if="appOfficeCeecList.length > 1" v-lazy:background-image="imgurl + appOfficeCeecList[1].ceecImg">
<div class="ftitle">{{ appOfficeCeecList[1].ceecName }}</div>
<div class="fcontent" v-if="appOfficeCeecList[1].ceecName=='科普直播'"><img src='../assets/nowb.gif' style=" width: 20px;height: 20px;"></div>
<div class="fcontent" v-else-if="appOfficeCeecList[1].ceecArticleNum > 0">{{
'共' + appOfficeCeecList[1].ceecArticleNum + '篇' }}</div>
</div>
<div :style="{
'height': '88px',
'background-size': '100% 100%', 'background-repeat': 'no-repeat', 'border-radius': '8px'
}" @click="gotoNextPage(appOfficeCeecList[2])" v-if="appOfficeCeecList.length > 2" v-lazy:background-image="imgurl + appOfficeCeecList[2].ceecImg">
<div class="ftitle">{{ appOfficeCeecList[2].ceecName }}</div>
<div class="fcontent" v-if="appOfficeCeecList[2].ceecName=='科普直播'"><img src='../assets/nowb.gif' style=" width: 20px;height: 20px;"></div>
<div class="fcontent" v-else-if="appOfficeCeecList[2].ceecArticleNum > 0">{{
'共' + appOfficeCeecList[2].ceecArticleNum + '篇' }}</div>
</div>
</div>
<div v-for="(item, index) in appOfficeCeecList.slice(3)" :style="{
'height': '88px',
'background-size': '100% 100%', 'background-repeat': 'no-repeat', 'border-radius': '8px'
}" @click="gotoNextPage(item)" v-lazy:background-image="imgurl + item.ceecImg">
<div class="ftitle">{{ item.ceecName }} </div>
<div class="fcontent" v-if="item.ceecName=='科普直播'"><img src='../assets/nowb.gif' style=" width: 20px;height: 20px;"></div>
<div class="fcontent" v-else-if="item.ceecArticleNum > 0">{{ '共' + item.ceecArticleNum + '篇' }}</div>
</div>
<!-- <div class="third" @click="gotoLiving">
<div class="ftitle">科普直播 </div>
<div class="fcontent"><img src='../assets/nowb.gif' style=" width: 20px;height: 20px;"></div>
</div> -->
</div>
<TabTools></TabTools>
</div>
</template>
<script setup >
import { showToast } from '@nutui/nutui';
// import now from '../assets/nowb.gif'
import radio_no from '../assets/radio_no.png'
import radio_sel from '../assets/radio_sel.png'
import TabTools from '@/components/tabTools.vue';
// import change_depart from '../assets/change_depart.png'
import { IconFont } from '@nutui/icons-vue';
import { useRouter, useRoute } from 'vue-router';
import { WXSHAREHOME } from '../utils/wxshare-1.6.0';
import search from '../components/search.vue'
import { getIndex, imgurl,roootUrl } from '../utils/api.js'
// const Logos = ref('https://health-edu.oss-cn-beijing.aliyuncs.com/system/getheadimg.png');
const router = useRouter();
const routerr = useRoute();
const searchMessage = ref('请输入文章标题/疾病/关键词…');
const hospital = ref('');
const hospitalLogo = ref('https://health-edu.oss-cn-beijing.aliyuncs.com/system/getheadimg.png');
const show = ref(false);
const dtitle = ref('');
const dtitletmp = ref('');
const hospitaltmp = ref('');
const urltmp = ref('');
const radioVal = ref(dtitle.value);
const showPop1 = ref(false)
const showPop = ref(true)
let officeid = ''
let appid = ''
const urlSearchParams = new URLSearchParams(window.location.search)
const departemntlist = reactive([
])
const appOfficeCeecList = reactive([])
const handleChange = (value) => {
console.log('handleChange', value);
// window.location.href='http://dev.edu.igandan.com/h5/index.html?officeid='+departemntlist[value].offidId+'&appid='+departemntlist[value].appid
if (isNaN(value)) {
} else {
dtitletmp.value = departemntlist[value].officeName;
hospitaltmp.value = departemntlist[value].hospitalName;
officeid=departemntlist[value].officeId
urltmp.value = roootUrl+ departemntlist[value].officeId + '&appid=' + departemntlist[value].appid
}
};
onMounted(() => {
// appid = urlSearchParams.get('appid')
// officeid = urlSearchParams.get('officeid')
// alert("appid:"+appid)
// alert("officeid:"+officeid)
// console.log("appid", appid);
// console.log("officeid", officeid);
// localStorage.setItem("officeid", officeid);
// const token = localStorage.getItem(officeid + '-token');
// alert("token:"+token)
// console.log(officeid + '-token', token);
// if (token) {
const urlSearchParams = new URLSearchParams(window.location.search)
let officeid = urlSearchParams.get('officeid')
if(typeof officeid === "undefined"||officeid ==null|| officeid == "undefined")
{
}
else
{
localStorage.setItem("officeid", officeid);
}
appid = urlSearchParams.get('appid')
if(typeof appid === "undefined"||appid ==null|| appid == "undefined")
{
}
else
{
localStorage.setItem("appid", appid);
}
initData()
 
// } else {
// goGreet()
// }
})
// function goGreet() {
// const code = urlSearchParams.get('code')
// alert(code)
// if (code) {
// oauth2greet(appid, officeid, code).then((res) => {
// console.log("oauth2greetapp", res);
// localStorage.setItem(officeid + '-token', res.data);
// localStorage.setItem('default' + '-token', res.data);
// if(res.code === 30001){
// let encodedUrl = encodeURIComponent(window.location.href)
// window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + encodedUrl + "&response_type=code&scope=snsapi_userinfo&state=1&component_appid=wx61944e1d991e380e&connect_redirect=1#wechat_redirect";
// return
// }
// }).then(()=>{
// initData()
// })
// } else {
// let encodedUrl = encodeURIComponent(window.location.href)
// window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + encodedUrl + "&response_type=code&scope=snsapi_userinfo&state=1&component_appid=wx61944e1d991e380e&connect_redirect=1#wechat_redirect";
// }
// }
function initData() {
getIndex().then((data) => {
// if (data.code == 30007 || data.code == 40007) {
// goGreet()
// } else {
console.log("getIndex", data);
// Logos.value=data.data.hospitalLogo
hospital.value = data.data.appOffice.hospitalName
dtitle.value = data.data.appOffice.officeName
dtitletmp.value = data.data.appOffice.officeName
hospitalLogo.value = imgurl + data.data.appOffice.hospitalLogo
appOfficeCeecList.push(...data.data.appOfficeCeecList)
departemntlist.push(...data.data.appOfficeRecord)
localStorage.setItem("hospitalName", hospital.value);
localStorage.setItem("officeName", dtitle.value);
// }
WXSHAREHOME("宣教中心", '肝胆相照-肝胆病在线公共服务平台', window.location.href,"");
});
}
function handleclick(choose, close) {
if (close) {
window.location.href = urltmp.value
// showPop.value=true;
// showPop1.value=false;
// show.value=false;
// dtitle.value=dtitletmp.value;
}
else if (choose) {
if (dtitle.value == dtitletmp.value) {
show.value = false;
}
else {
showPop.value = false;
showPop1.value = true;
}
}
else {
showPop.value = true;
showPop1.value = false;
radioVal.value = dtitle.value
dtitletmp.value = dtitle.value
show.value = false;
}
}
function gotoLiving() {
router.push({ path: '/live' });
}
function gotoNextPage(item) {
if(item.ceecName=='科普直播')
{
router.push({ path: '/live' });
}
else if (item.ceecType == 2) {
window.location.href = item.ceecLink;
}
else {
// let json = { type: item.ceecName, ceecId: item.ceecId, from: 'edu-center' }
// router.push({
// path: '/information', state:
// {
// data: JSON.stringify(json)
// }
// });
router.push({ name: 'information', query:{type:item.ceecName,ceecId:item.ceecId,from:'edu-center'} });
}
}
function changedepart() {
if (departemntlist.length > 0) {
show.value = true
}
else {
showToast.text('暂无可切换的科室');
}
}
</script>
<style scoped>
.edu-head {
background-image: url(../assets/edubg1.png);
background-size: cover;
padding-bottom: 48px;
}
.department {
width: 100%;
padding-top: 16px;
display: flex;
align-items: center;
justify-content: space-between;
z-index: 1;
}
.dicon {
margin-left: 16px;
}
/* 在线链接服务仅供平台体验和调试使用,平台不承诺服务的稳定性,企业客户需下载字体包自行发布使用并做好备份。 */
.dtitle {
margin-left: 8px;
margin-right: 8px;
width: 100%;
flex: 1;
/* font-size: var(--font-size-14); */
font-size:18px;
font-family: AlibabaPuHuiTiM;
;
color: var(--text-color-normal);
line-height: 24px;
}
.changedepart {
display: flex;
background: rgba(255, 255, 255, 0.65);
border-radius: 14px;
margin-left: 16px;
margin-right: 8px;
padding: 3px 10px 3px 8px;
/* font-size: var(--font-size-12); */
font-size:14px;
font-family: AlibabaPuHuiTiR;
color: var(--text-color-normal);
line-height: 17px;
}
.wrapper {
display: flex;
height: 100%;
align-items: center;
justify-content: center;
}
.content {
width: 80%;
min-height: 256px;
/* height: 256px; */
background: url(../assets/popbg.png);
background-size: contain;
background-repeat: no-repeat;
}
.contentchild {
/* height: 300px; */
min-height: 100px;
max-height: 300px;
overflow: scroll
}
.content1 {
width: 80%;
min-height: 256px;
/* height: 256px; */
background: linear-gradient(184deg, #F1FAFF 0%, #FFFFFF 100%);
box-shadow: 0px 9px 28px 8px rgba(0, 0, 0, 0.05);
border-radius: 12px;
}
.raido_title {
margin: 16px;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiM;
color: rgba(0, 0, 0, 0.85);
line-height: 24px;
}
.raido_title1 {
margin: 16px;
font-size: var(--font-size-16);
font-family: AlibabaPuHuiTiM;
color: rgba(0, 0, 0, 0.85);
line-height: 24px;
text-shadow: 0px 9px 28px rgba(0, 0, 0, 0.05);
}
.raido_title2 {
margin: 16px;
background: rgba(0, 0, 0, 0.04);
box-shadow: 0px 9px 28px 8px rgba(0, 0, 0, 0.05);
border-radius: 4px;
padding: 8px;
font-size: var(--font-size-14);
font-family: AlibabaPuHuiTiR;
color: rgba(0, 0, 0, 0.65);
line-height: 22px;
text-shadow: 0px 9px 28px rgba(0, 0, 0, 0.05);
}
.nut-radio-group {
display: grid;
grid-template-columns: repeat(2, 1fr);
background: #FFFFFF;
}
.nut-radio {
margin: 16px;
--nut-radio-label-margin-left: 8px;
--nut-radio-label-font-size: var(--font-size-16);
align-items: self-start;
font-family: AlibabaPuHuiTiR;
color: rgba(0, 0, 0, 0.85);
/* line-height: 24px; */
}
.bt_no {
flex: 1;
height: 48px;
background: rgba(0, 0, 0, 0.08);
border-radius: 8px;
margin-left: 16px;
margin-top: 16px;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiM;
color: rgba(0, 0, 0, 0.45);
line-height: 48px;
align-items: center;
justify-content: center;
text-align: center;
}
.bt_yes {
flex: 1;
height: 48px;
background: #3BB5FE;
border-radius: 8px;
margin: 16px;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiM;
color: white;
line-height: 48px;
align-items: center;
justify-content: center;
text-align: center;
}
.classgrid {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-gap: 12px;
/* margin: 16px; */
margin-top: -24px;
margin-left: 16px;
margin-right: 16px;
margin-bottom: 16px;
padding-bottom: 80px;
}
.classgrid1 {
display: grid;
grid-template-rows: repeat(2, 1fr);
grid-gap: 12px;
}
.ftitle {
margin-top: 21px;
margin-left: 16px;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiM;
color: #314E4D;
line-height: 24px;
}
.fcontent {
margin-top: 4px;
margin-left: 16px;
/* font-size: var(--font-size-12); */
font-size: 14px;
font-family: AlibabaPuHuiTiR;
color: rgba(0, 0, 0, 0.45);
line-height: 17px;
}
.second {
height: 88px;
background: url(../assets/second.png);
background-size: contain;
background-repeat: no-repeat;
}
.third {
height: 88px;
background: url(../assets/liviing.png);
background-size: 100% 100%;
background-repeat: no-repeat;
border-radius: 8px;
}
</style>

View File

@ -0,0 +1,137 @@
<template>
<div class="listcontain" style="background: var(--back-color-02);height:100vh;">
<headBar :title=title :backg=titbackge></headBar>
<div class="listcon">
<t-pull-down-refresh v-model="refreshing" @refresh="onRefresh" :loading-bar-height="36"
:loading-texts="['下拉刷新', '松开刷新', '正在刷新', '刷新完成']" :loading-props="{ theme: 'dots' }">
<t-list @scroll="onScroll" :async-loading="loading" v-if="list.length>0">
<div v-for="(item, $index) in list">
<div class="feedbg">
<div class="contenttext">{{ item.content }}</div>
<div class="datetext">{{ item.createTime.slice(0, 10) }}</div>
<nut-divider :style="{ color: '#00000014' }"></nut-divider>
<div style="display: flex;">
<img :src="rotbot" width="20" height="20">
<div class="replytext">{{ item.replyContent }} </div>
</div>
</div>
</div>
</t-list>
<nut-empty v-else>
<template #image>
<nut-image :src=sempty fit="cover"/>
</template>
<template #description>
<div style="font-size: var(--front-size-16);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 22px;margin-top: 16px;">暂无反馈记录</div>
</template>
</nut-empty>
</t-pull-down-refresh>
</div>
</div>
</template>
<script setup>
import sempty from '../assets/sempty.png'
import rotbot from '../assets/rotbot.png';
import {WXSHARE} from '../utils/wxshare-1.6.0';
import {advisequeryPage,frommywexin} from '../utils/api.js'
const titbackge=ref('#F6F7FBFF')
const title=ref('反馈记录')
const page = ref(1);
const loading = ref('');
const refreshing=ref(false);
const totalPage = ref(1)
const list= reactive(
[]
);
onMounted(()=>{
onLoad (page.value)
WXSHARE('反馈记录', '肝胆相照-肝胆病在线公共服务平台', window.location.href+frommywexin,"");
})
const onLoad = (page) => {
if (page > totalPage.value) {
return
}
loading.value = 'loading';
advisequeryPage(page).then((data) => {
console.log("advisequeryPage", data);
refreshing.value=false;
loading.value = '';
if (page == 1) {
list.length = 0;
list.push(...data.data.list)
}
else {
list.push(...data.data.list)
}
totalPage.value = data.data.pages ;
})
};
const onRefresh = () => {
console.log('onRefresh');
page.value = 1;
refreshing.value = true;
onLoad(page.value);
};
const onScroll = (scrollBottom) => {
if (scrollBottom < 100) {
console.log("scrollBottom");
page.value=page.value+1;
onLoad(page.value);
}}
</script>
<style scoped>
.listcontain{
display: flex;
height: 100vh;
flex-direction: column;
}
.listcon{
flex: 1;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
.t-pull-down-refresh {
overflow: hidden;
height: auto;
}
.feedbg{
margin: 16px;
padding: 16px;
background: #FFFFFF;
box-shadow: 0px 4px 12px 0px rgba(171,209,239,0.1);
border-radius: 8px;
}
.contenttext{
/* font-size: var(--font-size-14); */
font-size: 16px;
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.85);
line-height: 22px;
}
.datetext{
font-size: 14px;
/* font-size: var(--font-size-12); */
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.24);
line-height: 16px;
margin-top: 11PX;
}
.replytext{
font-size: 16px;
/* font-size: var( --font-size-14); */
font-family: AlibabaPuHuiTiR;
color:rgba(0,0,0,0.85);
line-height: 22px;
margin-left: 6px;
}
</style>

89
src/views/information.vue Normal file
View File

@ -0,0 +1,89 @@
<template>
<div class="contentbox">
<div v-if="showsearch" class="topcon">
<div class="edu-head" v-if="from =='edu-center'">
<headBar :title=title backg="tranparent"></headBar>
<search :message="searchMessage" :ceecId=ceecId />
</div>
<div v-else>
<headBar :title=title :backg=titbackge ></headBar>
<searchblue :message=searchMessage :ceecId=ceecId ></searchblue>
</div>
<div style="margin-top: -40px;" v-if="from =='edu-center'"></div>
</div>
<div v-else class="topcon">
<headBar :title=title backg="tranparent"></headBar>
</div>
<div class="listcon" >
<paperList :url=url :parameter=[ceecId,name,name] @child-event="handleChildEvent"></paperList>
</div>
</div>
</template>
<script setup>
import { useRoute } from 'vue-router';
import {getCeecArticleList,fromwexin,roootUrl} from '../utils/api.js'
import {WXSHAREHOME} from '../utils/wxshare-1.6.0';
const title=ref('')
const titbackge=ref('#F1FAFFFF')
const searchMessage = ref('请输入文章标题/疾病/关键词…');
const router = useRoute();
const from=ref('')
const ceecId=ref(0)
const name=ref('')
const url=ref('')
const showsearch=ref(true)
onMounted(() => {
// console.log("history.state.data", history.state.data);
// title.value =JSON.parse(history.state.data).type;
// from.value=JSON.parse(history.state.data).from;
// ceecId.value=JSON.parse(history.state.data).ceecId;
title.value =router.query.type;
from.value=router.query.from;
ceecId.value=router.query.ceecId;
if(from.value =='edu-center')
{
url.value='/ceecArticleList';
}else if(from.value =='department')
{
url.value='/deparsArticleList';
}
WXSHAREHOME(title.value, '肝胆相照-肝胆病在线公共服务平台',roootUrl + localStorage.getItem("officeid") + '&appid=' +localStorage.getItem("appid")+fromwexin,"");
});
const list = reactive(
[ ])
function initdata()
{
getCeecArticleList(ceecId.value,0).then((data) => {
console.log("getCeecArticleList", data);
list.push(...data.data.list)
})
}
function handleChildEvent(eventData) {
showsearch.value= false
//
// console.log(eventData);
}
// onUpdated(()=>{
// document.title=""
// })
</script>
<style scoped>
.edu-head{
background-image: url(../assets/edubg1.png);
background-size: cover;
padding-bottom: 48px;
}
.contentbox{
height:100vh;
display: flex;
flex-direction: column;
}
.listcon{
flex:1;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
</style>

View File

@ -0,0 +1,209 @@
<template >
<headBar :title=titlet></headBar>
<div class="dsearch">
<div class="divsearch">
<IconFont size="20" :name=search :style="{ 'padding-top': '12px', 'padding-left': '12px' }"></IconFont>
<input placeholder="请输入关键词/字" type="text" v-model="inputValue">
<IconFont size="16" :name=deletes :style="{ 'padding-top': '12px', 'padding-left': '12px' }" @click="clearSearch"></IconFont>
</div>
<div style="font-size: var(--front-size-14);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 40px;text-align: center;margin-left: 12px;" @click="onRefresh">搜索</div>
</div>
<div style="height: 12px;background: #F6F7FB;margin-top: 16px;"></div>
<div style="height: 16px;background: white"></div>
<t-pull-down-refresh v-model="refreshing" @refresh="onRefresh" :loading-bar-height="36"
:loading-texts="['下拉刷新', '松开刷新', '正在刷新', '刷新完成']" :loading-props="{ theme: 'dots' }">
<t-list @scroll="onScroll" :async-loading="loading" v-if="list.length>0">
<div v-for="(item, index) in list">
<a :href=item.content>
<div class="first" :style="{ background:`url(${imgurl+item.img})`, 'background-size': '100% 100%','background-repeat':'no-repeat','border-radius': '8px'}" >
<div class="ftitle">{{ item.title }}</div>
</div>
</a>
</div>
<template #footer>
<div class="end" v-if="evisible"> END </div>
</template>
</t-list>
<nut-empty v-else>
<template #image>
<nut-image :src=sempty fit="cover"/>
</template>
<template #description>
<div style="font-size: var(--front-size-16);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 22px;margin-top: 16px;">暂无信息</div>
</template>
</nut-empty>
</t-pull-down-refresh>
</template>
<script setup >
import sempty from "../assets/sempty.png";
import { IconFont } from '@nutui/icons-vue';
import search from '../assets/searchb.png'
import deletes from '../assets/deletes.png'
import { useRouter } from 'vue-router';
import {WXSHAREHOME} from '../utils/wxshare-1.6.0';
import {queryPage,imgurl,fromwexin,roootUrl} from '../utils/api.js'
const searchMessage = ref('请输入关键词/字');
const titlet=ref('搜索列表')
const inputValue=ref('');
const page = ref(1);
const totalPage = ref(1)
const evisible = ref(false);
const refreshing=ref(false);
const loading = ref('');
const router = useRouter();
function clearSearch()
{
inputValue.value=''
}
onMounted(() => {
onLoad(page.value);
WXSHAREHOME("搜索列表", '肝胆相照-肝胆病在线公共服务平台',roootUrl + localStorage.getItem("officeid") + '&appid=' +localStorage.getItem("appid")+fromwexin,"");
})
const list=ref([])
const onLoad = (page) => {
if (page > totalPage.value) {
refreshing.value=false;
return
}
loading.value = 'loading';
queryPage(page,inputValue.value).then((data) => {
console.log("queryPage", data);
refreshing.value=false;
loading.value = '';
if (page == 1) {
list.value= [];
list.value.push(...data.data.list)
}
else {
list.value.push(...data.data.list)
}
totalPage.value = data.data.pages ;
if (page >= totalPage.value) {
evisible.value = true;
}
})
};
const onRefresh = () => {
console.log('onRefresh');
page.value = 1;
totalPage.value = 1;
evisible.value = false;
refreshing.value = true;
onLoad(page.value);
};
const onScroll = (scrollBottom) => {
if (scrollBottom < 100) {
console.log("scrollBottom");
page.value=page.value+1;
onLoad(page.value);
}}
</script>
<style scoped>
.first{
height: 96px;
margin-left: 16px;
margin-right: 16px;
margin-bottom: 12px;
}
.ftitle{
margin-right: 16px;
margin-left: 16px;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiM;
color: #314E4D;
line-height: 96px;
white-space: nowrap; /* 防止文字换行 */
overflow: hidden; /* 隐藏溢出的文字 */
text-overflow: ellipsis; /* 使用省略号表示被省略的文本 */
}
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
}
a:hover {
text-decoration: none;
}
a:active {
text-decoration: none;
}
.dsearch{
display: flex;
height: 40px;
margin-top: 16px;
margin-left: 16px;
margin-right: 16px;
justify-content: space-between;
}
.divsearch {
display: flex;
height: 40px;
flex: 1;
background: #FFFFFF;
border-radius: 21px;
border: 2px solid rgba(0,0,0,0.06);
backdrop-filter: blur(25px);
}
.dicon{
margin-left: 16px;
}
input {
width: 70%;
margin-left: 5px;
font-size: var(--front-size-14);
background: transparent;
border: none;
-webkit-box-shadow: none;
box-shadow: none;
outline: none;
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
/* color: red; */
}
input:focus {
font-size: var(--front-size-14);
width: 70%;
margin-left: 5px;
border: none;
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
box-shadow: none;
}
.end {
display: flex;
align-items: center;
justify-content: center;
margin-top: 21px;
font-size: var(--font-size-14);
font-family: AlibabaPuHuiTiR;
color: rgba(0, 0, 0, 0.24);
line-height: 24px;
}
</style>

140
src/views/interact.vue Normal file
View File

@ -0,0 +1,140 @@
<template >
<searchblue :message=searchMessage searchtype="xuanjiao"></searchblue>
<t-pull-down-refresh v-model="refreshing" @refresh="onRefresh" :loading-bar-height="36"
:loading-texts="['下拉刷新', '松开刷新', '正在刷新', '刷新完成']" :loading-props="{ theme: 'dots' }" >
<t-list @scroll="onScroll" :async-loading="loading" v-if="list.length>0">
<div v-for="(item, index) in list">
<a :href=item.content>
<div class="first" :style="{ background:`url(${imgurl+item.img})`, 'background-size': '100% 100%','background-repeat':'no-repeat','border-radius': '8px'}" >
<div class="ftitle">{{ item.title }}</div>
</div>
</a>
</div>
</t-list>
<!-- <nut-empty v-else>
<template #image>
<nut-image :src=sempty fit="cover"/>
</template>
<template #description>
<div style="font-size: var(--front-size-16);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 22px;margin-top: 16px;">暂无信息</div>
</template>
</nut-empty> -->
</t-pull-down-refresh>
<TabTools></TabTools>
</template>
<script setup >
import searchblue from '../components/searchblue.vue'
import { useRouter } from 'vue-router';
import {WXSHARE} from '../utils/wxshare-1.6.0';
import {queryPage,imgurl} from '../utils/api.js'
const searchMessage = ref('请输入关键词/字');
const page = ref(1);
const totalPage = ref(1)
const refreshing=ref(false);
const loading = ref('');
const router = useRouter();
function click()
{
router.push({ path: '/search-things' });
}
onMounted(() => {
onLoad(page.value);
WXSHARE("健康互助", '肝胆相照-肝胆病在线公共服务平台', window.location.href,"");
})
const list=reactive([])
// function gotoPage(params) {
// router.push({ path: '/webs-view',query:{name:params} });
// }
const onLoad = (page) => {
if (page > totalPage.value) {
refreshing.value=false;
return
}
loading.value = 'loading';
queryPage(page).then((data) => {
console.log("queryPage", data);
refreshing.value=false;
loading.value = '';
if (page == 1) {
list.length = 0;
list.push(...data.data.list)
}
else {
list.push(...data.data.list)
}
totalPage.value = data.data.pages ;
})
};
const onRefresh = () => {
console.log('onRefresh');
page.value = 1;
refreshing.value = true;
onLoad(page.value);
};
const onScroll = (scrollBottom) => {
if (scrollBottom <100) {
console.log("scrollBottom");
page.value=page.value+1;
onLoad(page.value);
}
}
</script>
<style scoped>
.first{
height: 96px;
margin-left: 16px;
margin-right: 16px;
margin-bottom: 12px;
}
.ftitle{
margin-right: 16px;
margin-left: 16px;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiM;
color: #314E4D;
line-height: 96px;
white-space: nowrap; /* 防止文字换行 */
overflow: hidden; /* 隐藏溢出的文字 */
text-overflow: ellipsis; /* 使用省略号表示被省略的文本 */
}
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
}
a:hover {
text-decoration: none;
}
a:active {
text-decoration: none;
}
.t-list{
padding-bottom: 80px;
}
.t-pull-down-refresh{
height:calc(100% - 73px)
}
</style>

View File

@ -0,0 +1,91 @@
<template>
<div style="background: var(--back-color-02);width:100vw;min-height:100vh;">
<headBar :title=title :backg=titbackge></headBar>
<div class="tip">
<div style="display: flex;padding-top:10px;margin-left: 16px;align-items: center;">
<img :src="rotbot" width="20" height="20">
<div style="font-size: var( --font-size-16);font-family: AlibabaPuHuiTiM;color: #3BB5FE;line-height: 22px;margin-left: 8px;">听您意见为您服务! </div>
</div>
<div style="font-size: var(--font-size-14);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);
line-height: 18px; margin-left: 16px;margin-top: 8px;margin-left: 16px;padding-bottom: 10px;">如果您对我们科室有任何的意见和建议都可以发送给我们知道希望通过您的意见和建议进一步提高我们的服务水平</div>
</div>
<div style="display: flex;margin-top: 16px;margin-left: 16px; margin-right: 16px;
align-items: center;justify-content: space-between;">
<div style="font-size: var(--font-size-18);font-family: AlibabaPuHuiTiM;color: rgba(0,0,0,0.85);">反馈描述</div>
<div style="display: flex;vertical-align: middle; align-items: center;" @click="gotofeedBack"><img src='../assets/his.png' width="16" height="16">
<div style="font-size: var(--font-size-16);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.85);">反馈记录</div>
</div>
</div>
<div style="margin-left: 16px;margin-right: 16px;margin-top: 12px;">
<nut-textarea v-model="value" limit-show max-length="500" placeholder="请详细描述问题或意见" />
</div>
<div class="submit" @click="submit">提交</div>
</div>
</template>
<script setup>
import { useRouter } from 'vue-router';
import {advise,frommywexin} from '../utils/api.js'
import rotbot from '../assets/rotbot.png';
import { showToast } from '@nutui/nutui';
import {WXSHARE} from '../utils/wxshare-1.6.0';
const router = useRouter();
const titbackge=ref('#F6F7FBFF')
const title=ref('留言反馈')
const value = ref('');
function gotofeedBack()
{
router.push({ path: '/feedback-history'});
}
function submit()
{
advise(value.value).then((data) => {
if(data.code==200)
{
showToast.text('提交成功');
value.value=''
}
else
{
showToast.text(data.msg);
}
console.log("advise", data);
})
}
onMounted(() => {
WXSHARE("留言反馈", '肝胆相照-肝胆病在线公共服务平台', window.location.href+frommywexin,"");
})
</script>
<style scoped>
.tip{
margin: 16px;
background: #FFFFFF;
border-radius: 8px;
}
.nut-textarea {
--nut-textarea-font:17px;
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
line-height: 22px;
height: 232px;
background: #FFFFFF;
box-shadow: 0px 4px 12px 0px rgba(171,209,239,0.1);
border-radius: 8px;
}
.submit{
margin: auto;
width: 279px;
height: 42px;
background: #3BB5FE;
border-radius: 22px;
font-size: var(--font-size-16);
font-family: AlibabaPuHuiTiR;
color: #FFFFFF;
text-align: center;
line-height: 42px;
margin-top: 24px;
}
</style>

221
src/views/live.vue Normal file
View File

@ -0,0 +1,221 @@
<template>
<div class="listcontain">
<headBar :title=title></headBar>
<div class="listcon">
<t-pull-down-refresh v-model="refreshing" @refresh="onRefresh" :loading-bar-height="36"
:loading-texts="['下拉刷新', '松开刷新', '正在刷新', '刷新完成']" :loading-props="{ theme: 'dots' }">
<t-list @scroll="onScroll" :async-loading="loading" v-if="list.length>0">
<div class="classgrid">
<div v-for="(item, $index) in list" @click="click(item)">
<div :style="{background:`url(${imgurl+item.img})`,height:'136px',
'border-radius':'8px','background-size':'100% 100%','background-repeat':'no-repeat','border-radius': '8px' }">
<div v-if="item.state==2" style="display: flex; position: relative;" >
<div class="circle"><img :src=now style=" width: 20px;height: 20px;"></div>
<div class="liv">直播中</div>
</div>
<div style="height: 10px;"></div>
<div class="date" v-if="item.state==1&&item.beginDate.slice(0,-9)==item.endDate.slice(0,-9)">
{{ item.beginDate.slice(5).slice(0,-3).replace(/-/, "/")+'-'+ item.endDate.slice(11).slice(0,-3) }}</div>
<div class="date1" v-else-if="item.state==1">
{{ item.beginDate.slice(5).slice(0,-3).replace(/-/, "/")+'-'+item.endDate.slice(5).slice(0,-3).replace(/-/, "/") }}</div>
</div>
<div class="title">
<!-- {{ item.title }} -->
<nut-ellipsis
:content=item.title
rows="2"
direction="end"
></nut-ellipsis>
</div>
</div>
</div>
<template #footer>
<div class="end" v-if="evisible"> END </div>
</template>
</t-list>
<nut-empty v-else>
<template #image>
<nut-image :src=sempty fit="cover"/>
</template>
<template #description>
<div style="font-size: var(--front-size-16);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 22px;margin-top: 16px;">暂无数据</div>
</template>
</nut-empty>
</t-pull-down-refresh>
</div>
</div>
</template>
<script setup>
import sempty from '../assets/sempty.png'
import now from '../assets/now.gif'
import { useRouter } from 'vue-router';
import {livequeryPage,imgurl,frommywexin} from '../utils/api.js'
import {WXSHARE} from '../utils/wxshare-1.6.0';
const evisible = ref(false);
const page = ref(1);
const totalPage = ref(1)
const router = useRouter();
const refreshing=ref(false);
const loading = ref('');
const title=ref('科普直播')
const list = ref([ ])
function click(item)
{
window.location.href = item.url;
// router.push({ path: '/video', query: { vid:1} });
}
onMounted(() => {
onLoad(page.value);
WXSHARE("科普直播", '肝胆相照-肝胆病在线公共服务平台', window.location.href+frommywexin,"");
})
const onLoad = (page) => {
if (page > totalPage.value) {
refreshing.value=false;
return
}
if(page == 1||!evisible.value)
{
loading.value = 'loading';
livequeryPage(page).then((data) => {
console.log("livequeryPage", data);
refreshing.value=false;
loading.value = '';
if (page == 1) {
list.value = [];
list.value.push(...data.data.list)
console.log("list", list);
}
else {
list.value.push(...data.data.list)
}
totalPage.value = data.data.pages ;
if (page >= totalPage.value) {
evisible.value=true;
}
})
}
};
const onRefresh = () => {
page.value = 1;
totalPage.value= 1;
evisible.value = false;
refreshing.value=true;
onLoad(page.value);
};
const onScroll = (scrollBottom) => {
if (scrollBottom < 100) {
page.value=page.value+1;
onLoad(page.value);
}
};
</script>
<style scoped>
.listcontain{
display: flex;
height: 100vh;
flex-direction: column;
}
.listcon{
flex: 1;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
.t-pull-down-refresh {
overflow: hidden;
height: auto;
}
.classgrid{
display: grid;
grid-template-columns: repeat(1, 1fr);
/* grid-template-columns: repeat(2, 1fr); */
grid-gap: 12px;
margin: 16px;
}
.circle {
width: 30px;
height: 30px;
background: #3BB5FEFF;
border-radius: 100%;
margin-left: 8px;
margin-top: 8px;
z-index: 1;
display: flex;
justify-content: center;
align-items: center;
}
.liv{
position: absolute;
left: 25px;
font-size:var(--font-size-11);
top: 12px;
font-family: AlibabaPuHuiTiR;
color: #FFFFFF;
line-height: 22px;
text-align: right;
width: 56px;
height: 22px;
padding-right: 6px;
background: rgba(0,0,0,0.56);
border-radius: 8px;
}
.date{
margin-top: 96px;
width: 120px;
height: 30px;
padding-left: 8px;
font-size:var(--font-size-13);
font-family: HarmonyOS_Sans_Medium;
color: #FFFFFF;
line-height: 30px;
background: linear-gradient(190deg, #A6D9FF 0%, #3BB5FE 100%);
border-radius: 0px 15px 15px 8px;
}
.date1{
margin-top: 96px;
width: 150px;
height: 30px;
padding-left: 8px;
font-size:var(--font-size-13);
font-family: HarmonyOS_Sans_Medium;
color: #FFFFFF;
line-height: 30px;
background: linear-gradient(190deg, #A6D9FF 0%, #3BB5FE 100%);
border-radius: 0px 15px 15px 8px;
}
.title{
margin-top: 8px;
margin-bottom: 8px;
font-size: 16px;
/* font-size: var(--font-size-14); */
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
line-height: 20px
}
.end {
display: flex;
align-items: center;
justify-content: center;
margin-top: 21px;
font-size: var(--font-size-14);
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.24);
line-height: 24px;
}
</style>

418
src/views/my.vue Normal file
View File

@ -0,0 +1,418 @@
<template >
<div class="edu-head">
<div>&nbsp;</div>
<!-- <nut-image :src=mybg alt="图片描述" class="mydiv" style="margin: auto;">
</nut-image> -->
<nut-image :src=photo alt="图片描述" round fit="cover"
style="width: 96px;height: 96px;margin: auto;position: relative;z-index: 1 ">
</nut-image>
<div class="mydiv1">
</div>
<div class="divname">
<!-- <nut-ellipsis
:content=name
rows="1"
direction="end"
></nut-ellipsis> -->
<div class="ddname">{{name}}</div>
</div>
<div class="myto" @click="gotoEdit">编辑信息 <img src='../assets/toto.png' alt="图片描述" style="width: 12px;height: 12px;margin-left: 4px;"/> </div>
<div class="divdepartment">
<div>{{dtitle}}</div>
</div>
<div class="changedepart" @click="changedepart"><img src='../assets/change_depart.png' alt="图片描述" style="width: 16px;height: 16px;" >
切换科室</div>
</div>
<div style="background: var(--back-color-02);">
<div class="containernew">
<div class="buttom" @click="clickhere('浏览记录')">
<img src='../assets/history.png' alt="图片描述" style="width: 24px;height: 24px;" >
<p>浏览记录</p>
</div>
<div class="buttom" @click="clickhere('我的收藏')">
<img src='../assets/collect.png' alt="图片描述" style="width: 24px;height: 24px;">
<p>我的收藏</p>
</div>
<div class="buttom" @click="clickhere('确认已读')" >
<img src='../assets/read.png' alt="图片描述" style="width: 24px;height: 24px;">
<p>确认已读</p>
</div>
</div>
<nut-overlay v-model:visible="show" :close-on-click-overlay="false">
<div class="wrapper">
<div class="content" v-if="showPop">
<div class="raido_title">切换科室</div>
<nut-radio-group v-model="radioVal" @change="handleChange" class="contentchild">
<div v-for="(item, index) in departemntlist">
<nut-radio :label=index>
<template #icon> <IconFont size="16" :name=radio_no :style="{ 'margin-top': '3px' }" /></template>
<template #checkedIcon> <IconFont size="16" :name=radio_sel :style="{ 'margin-top': '3px' }" /> </template>
{{ item.officeName }}
</nut-radio>
</div>
</nut-radio-group>
<div :style="{display:'flex',background: '#FFFFFF',
'border-radius': '0px 0px 12px 12px'}">
<div class="bt_no" @click.stop="handleclick(false)">取消</div>
<div class="bt_yes" @click.stop="handleclick(true)">确认</div>
</div>
</div>
<div class="content1" v-if="showPop1">
<div class="raido_title">温馨提示</div>
<div class="raido_title1">{{'您确定要跳转到:'+hospitaltmp+'-'+dtitletmp}}</div>
<div class="raido_title2">{{'您当前浏览的科室为:'+hospital+'-'+dtitle}}</div>
<div :style="{display:'flex'}">
<div class="bt_no" @click.stop="handleclick(false)">取消</div>
<div class="bt_yes" @click.stop="handleclick(true,true)">确认</div>
</div>
<div>
</div>
</div>
</div>
</nut-overlay>
<TabTools></TabTools>
</div>
</template>
<script setup >
import {getmy,imgurl,roootUrl} from '../utils/api.js'
import { IconFont } from '@nutui/icons-vue';
import { useRouter } from 'vue-router';
import {WXSHARE} from '../utils/wxshare-1.6.0';
// import toto from '../assets/toto.png';
// import change_depart from '../assets/change_depart.png'
// import history from '../assets/history.png';
// import collect from '../assets/collect.png';
// import read from '../assets/read.png';
import radio_no from '../assets/radio_no.png'
import radio_sel from '../assets/radio_sel.png'
const show = ref(false);
const name= ref('');
const photo= ref('');
onMounted(() => {
initData()
WXSHARE("我的", '肝胆相照-肝胆病在线公共服务平台', window.location.href,"");
})
function initData()
{
getmy().then((data) => {
console.log("getmy", data);
if(data.data.name==null||data.data.name=='')
{
name.value=data.data.nickname
}
else
{
name.value=data.data.name
}
if(data.data.photo==null||data.data.photo=='')
{
photo.value=data.data.headImgUrl
}
else
{
photo.value=imgurl+data.data.photo
}
hospital.value=data.data.appOffice.hospitalName
dtitle.value=data.data.appOffice.officeName
dtitletmp.value=data.data.appOffice.officeName
departemntlist.push(...data.data.appOfficeRecord)
});
}
const router = useRouter();
function click()
{
router.push({ path: '/education-centre' });
}
function clickhere(name)
{
router.push({ path: '/private-records', query: { type:name} });
}
function gotoEdit()
{
router.push({ path: '/personal-data' });
}
const hospital=ref('');
const dtitle = ref('');
const dtitletmp=ref('');
const hospitaltmp=ref('');
const radioVal = ref(dtitle.value);
const showPop1=ref(false)
const showPop=ref(true)
const urltmp=ref('');
let officeid = ''
const departemntlist=reactive([])
const handleChange = (value) => {
if (isNaN(value)) {
} else {
dtitletmp.value=departemntlist[value].officeName;
hospitaltmp.value=departemntlist[value].hospitalName;
officeid=departemntlist[value].officeId
urltmp.value=roootUrl+departemntlist[value].officeId+'&appid='+departemntlist[value].appid
}
};
function handleclick(choose,close)
{
if(close)
{
localStorage.setItem("officeid", officeid);
window.location.href=urltmp.value
// showPop.value=true;
// showPop1.value=false;
// show.value=false;
// dtitle.value=dtitletmp.value;
// click()
}
else if(choose)
{
if(dtitle.value==dtitletmp.value)
{
show.value=false;
}
else
{
showPop.value=false;
showPop1.value=true;
}
}
else
{
showPop.value=true;
showPop1.value=false;
show.value=false;
radioVal.value=dtitle.value
dtitletmp.value=dtitle.value
}
}
function changedepart() {
if (departemntlist.length > 0) {
show.value = true
}
else {
showToast.text('暂无可切换的科室');
}
}
</script>
<style scoped>
.edu-head{
background-image: url(../assets/edubg.png);
background-size: cover;
}
.mydiv1{
position: absolute;
top: 36px;
background-image: url(../assets/mybg.png);
height: 224px;
width: 100%;
background-position:center;
background-size: cover;
background-repeat: no-repeat;
}
.mydiv{
position: absolute;
top: 34px;
height: 224px;
pointer-events: none;
}
.divname{
display:flex ;
position: absolute;
top: 120px;
left: 36px;
font-size: var(--font-size-20);
font-family: AlibabaPuHuiTiM;
color: white;
line-height: 24px;
}
.myto{
position: absolute;
font-size:14px;
/* font-size: var(--font-size-12); */
font-family: AlibabaPuHuiTiM;
color: white;
align-items: center;
display: flex;
right: 36px;
top: 125px;
}
.divdepartment{
display:flex ;
position: absolute;
top: 169px;
left: 48px;
font-size: 16px;
/* font-size: var(--font-size-14); */
font-family: AlibabaPuHuiTiM;
color: #2E2E30;
line-height: 24px
}
.changedepart{
align-items: center;
display: flex;
position: absolute;
right: 48px;
top: 169px;
font-size: 14px;
/* font-size: var(--font-size-12); */
background: rgba(183,226,252,0.32);
border-radius: 14px;
line-height: 17px;
padding: 3px 10px 3px 8px;
}
.containernew {
position: absolute;
top: 230px;
display: flex;
height: 88px;
background: #FFFFFF;
border-radius: 8px;
left: 16px;
right: 16px;
box-shadow: 2px 2px 5px 5px var(--back-color-02);
}
.buttom{
flex: 1;
display: flex;
flex-direction:column;
justify-content: center;
align-items: center;
font-size: 16px;
/* font-size: var(--font-size-14); */
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
line-height: 24px;
}
.wrapper {
display: flex;
height: 100%;
align-items: center;
justify-content: center;
}
.content {
width: 80%;
min-height: 256px;
/* height: 256px; */
background: url(../assets/popbg.png);
background-size: contain;
background-repeat:no-repeat;
}
.contentchild{
/* height: 300px; */
min-height: 100px;
max-height: 300px;
overflow: scroll
}
.content1 {
width: 80%;
min-height: 256px;
/* height: 256px; */
background: linear-gradient(184deg, #F1FAFF 0%, #FFFFFF 100%);
box-shadow: 0px 9px 28px 8px rgba(0,0,0,0.05);
border-radius: 12px;
}
.raido_title{
margin: 16px;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
line-height: 24px;
}
.raido_title1{
margin: 16px;
font-size: var(--font-size-16);
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
line-height: 24px;
text-shadow: 0px 9px 28px rgba(0,0,0,0.05);
}
.raido_title2{
margin: 16px;
background: rgba(0,0,0,0.04);
box-shadow: 0px 9px 28px 8px rgba(0,0,0,0.05);
border-radius: 4px;
padding: 8px;
font-size: var(--font-size-14);
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
line-height: 22px;
text-shadow: 0px 9px 28px rgba(0,0,0,0.05);
}
.nut-radio-group{
display: grid;
grid-template-columns: repeat(2, 1fr);
background: #FFFFFF;
}
.nut-radio{
margin: 16px;
--nut-radio-label-margin-left:8px;
--nut-radio-label-font-size:var(--font-size-16);
align-items:self-start;
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.85);
/* line-height: 24px; */
}
.bt_no{
flex: 1;
height: 48px;
background: rgba(0,0,0,0.08);
border-radius: 8px;
margin-left: 16px;
margin-top: 16px;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.45);
line-height: 48px;
align-items: center;
justify-content: center;
text-align: center;
}
.bt_yes{
flex: 1;
height: 48px;
background: #3BB5FE;
border-radius: 8px;
margin: 16px;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiM;
color: white;
line-height: 48px;
align-items: center;
justify-content: center;
text-align: center;
}
.ddname{
white-space: nowrap; /* 防止自动换行 */
overflow: hidden; /* 隐藏溢出内容 */
text-overflow: ellipsis; /* 显示省略号 */
width: 200px; /* 设置div的宽度 */
}
</style>

782
src/views/personal-data.vue Normal file
View File

@ -0,0 +1,782 @@
<template>
<div style="background: var(--back-color-02);min-height: 100vh;">
<headBar :title=title :backg=titbackge></headBar>
<div class="tip">为方便接收全方位的科普服务请确认您的真实信息</div>
<div class="wdiv">
<div class="item">
<div class="itm1">姓名</div>
<div class="dright"> <input placeholder="暂未填写" type="text" v-model="inputValuename">
</div>
<div class="dimg"></div>
</div>
<nut-divider/>
<div class="item" >
<div class="itm1">性别</div>
<div class="dright"> <input placeholder="暂未填写" type="text" v-model="inputValuesex" readonly @click="click('性别',sexs)">
</div>
<img :src=gotosle class="dimg">
</div>
<nut-divider/>
<div class="item" >
<div class="itm1">地区</div>
<div class="dright"> <input placeholder="暂未填写" type="text" v-model="inputValuearea" readonly @click="click('地区',areaList)">
</div>
<img :src=gotosle class="dimg">
</div>
<nut-divider/>
<div class="item" >
<div class="itm1">出生日期</div>
<div class="dright"> <input placeholder="暂未填写" type="text" v-model="inputValuedate" readonly @click="click('出生日期')">
</div>
<img :src=gotosle class="dimg">
</div>
<nut-divider/>
<div class="item">
<div class="itm1">身高cm</div>
<div class="dright"> <input placeholder="暂未填写" type="text" v-model="inputValueheight">
</div>
<div class="dimg"></div>
</div>
<nut-divider/>
<div class="item">
<div class="itm1">体重kg</div>
<div class="dright"> <input placeholder="暂未填写" type="text" v-model="inputValueweight">
</div>
<div class="dimg"></div>
</div>
<nut-divider/>
<div class="item" >
<div class="itm1">职业</div>
<div class="dright"> <input placeholder="暂未填写" type="text" v-model="inputValuecareer" readonly @click="click('职业',career)">
</div>
<img :src=gotosle class="dimg">
</div>
<nut-divider/>
<div class="item" >
<div class="itm1">受教育水平</div>
<div class="dright"> <input placeholder="暂未填写" type="text" v-model="inputValueeducation" readonly @click="click('受教育水平',education)">
</div>
<img :src=gotosle class="dimg">
</div>
<nut-divider/>
<div class="item">
<div class="itm1">手机号</div>
<div class="dright"> <input placeholder="暂未填写" type="text" v-model="inputValuephone">
</div>
<div class="dimg"></div>
</div>
<nut-divider/>
<div class="itemn" >
<div class="itm1">所患疾病</div>
<div class="dright" @click="click('所患疾病')">
<input placeholder="暂未填写" type="text" v-model="inputValuedisease" readonly @click="click('所患疾病')">
<!-- <div v-if="inputValuedisease==''">
暂未填写
</div>
{{inputValuedisease}} -->
</div>
<img :src=gotosle class="dimg">
</div>
</div>
<div class="subbutton" @click="Update">提交</div>
<div style="height: 20px;"></div>
</div>
<nut-popup position="bottom" v-model:visible="show" round :style="{'--nut-popup-border-radius':'8px'}" :close-on-click-overlay="false">
<nut-picker v-model="value" :columns="columns" :title=setitle @confirm="confirm" @cancel="show = false" class="tpicker">
</nut-picker>
</nut-popup>
<nut-popup position="bottom" v-model:visible="showearea" round :style="{'--nut-popup-border-radius':'8px'}" :close-on-click-overlay="false" >
<nut-picker v-model="value" :columns="areaList" :field-names="fieldNames" :title=setitle @confirm="confirm" @cancel="showearea = false" class="tpicker" >
</nut-picker>
</nut-popup>
<nut-popup position="bottom" v-model:visible="showcareer" round :style="{'--nut-popup-border-radius':'8px'}" :close-on-click-overlay="false" >
<nut-picker v-model="value" :columns="career" :field-names="fieldNamee" :title=setitle @confirm="confirm" @cancel="showcareer = false" class="tpicker" >
</nut-picker>
</nut-popup>
<nut-popup position="bottom" v-model:visible="showe" round :style="{'--nut-popup-border-radius':'8px'}" :close-on-click-overlay="false">
<nut-picker v-model="value" :columns="education" :field-names="fieldNamee" :title=setitle @confirm="confirm" @cancel="showe = false" class="tpicker" >
</nut-picker>
</nut-popup>
<nut-popup position="bottom" v-model:visible="showdate" round :style="{'--nut-popup-border-radius':'8px'}" :close-on-click-overlay="false">
<nut-date-picker
v-model="currentDate"
:min-date="minDate"
:max-date="maxDate"
@confirm="popupConfirm"
:is-show-chinese="true"
:threeDimensional="false"
title="日期选择"
class="tpicker"
@cancel="showdate = false"
>
</nut-date-picker>
</nut-popup>
<nut-popup position="bottom" v-model:visible="showdis" :style="{ height: '70%','--nut-popup-border-radius':'8px', overflow: 'hidden'}" round :close-on-click-overlay="false">
<div class="nut-picker__bar">
<div class="nut-picker__left1" @click="changeNo">取消</div>
<div class="nut-picker__title">所患疾病(最多选3项)</div>
<div class="nut-picker__right1" @click="showdis = false">确认</div>
</div>
<div class="divtlist">
<t-list >
<div v-for="item in list" >
<div @click="changeBox(item)" class="checkbox">
{{ item.name }}
<IconFont size="20" :name=select_yes v-if="item.value == 1"></IconFont>
<IconFont size="20" :name=select_no v-else-if="selnum>=3"></IconFont>
<IconFont size="20" :name=select_not v-else></IconFont>
</div>
</div>
</t-list>
</div>
</nut-popup>
</template>
<script setup>
import {userInfo,positionList,userUpdate,diseaseList,educationalList,roootUrl,fromwexin} from '../utils/api.js'
import { showToast } from '@nutui/nutui';
import {WXSHAREHOME} from '../utils/wxshare-1.6.0';
import areaList from '../utils/areaList.js'
import { IconFont } from '@nutui/icons-vue';
import select_not from "../assets/select_not.png";
import select_no from "../assets/select_no.png";
import select_yes from "../assets/select_yes.png";
import gotosle from '../assets/gotosle.png'
const titbackge=ref('#F6F7FBFF')
const title=ref('个人信息')
const inputValuename=ref('');
const inputValuesex=ref('');
const sex=ref(1);
const inputValuearea=ref('');
const inputValuedate=ref('');
const inputValueheight=ref('');
const inputValuecareer=ref('');
const occupation=ref('');
const inputValueeducation=ref('');
const educational=ref(0);
const inputValuephone=ref('');
const inputValuedisease=ref('');
let inputValuediseaseor='';
const inputValueweight=ref('');
const show = ref(false);
const showearea= ref(false);
const showcareer= ref(false);
const showdate = ref(false);
const showdis = ref(false);
const showe = ref(false);
const desc = ref();
const value = ref();
const setitle=ref('')
const selnum=ref(0)
const province= ref('');
const city= ref('');
const district= ref('');
const provinceName= ref('');
const cityName= ref('');
const districtName= ref('');
const columns = ref([
]);
const diseasetmp = ref([
]);
let diseasetor = [];
const fieldNames = ref({
text: 'label',
value: 'code',
children: 'children'
});
const fieldNamec = ref({
text: 'valueName',
value: 'valueName',
});
const fieldNamee = ref({
text: 'name',
value: 'name',
id:'id'
});
const formData = {
birthday: undefined,
city:undefined,
disease: undefined,
district: undefined,
educational:undefined,
height:undefined,
mobile: undefined,
name: undefined,
occupation: undefined,
province: undefined,
sex:undefined,
weight: undefined,
provinceName: undefined,
cityName:undefined,
districtName:undefined
}
function click(item,list)
{
if(item=='出生日期')
{
showdate.value=true
}
else if(item=='所患疾病')
{
showdis.value=true
}
else if(item=='地区')
{
showearea.value=true
setitle.value=item
}
else if(item=='职业')
{
showcareer.value=true
setitle.value=item
}
else if(item=='受教育水平')
{
showe.value=true
setitle.value=item
}
else
{
show.value=true
setitle.value=item
columns.value= [];
columns.value.push(...list)
}
}
const sexs = ref([
{ text: '男', value: 1 },
{ text: '女', value: 2 },
]);
const career = ref([]);
const education = ref([]);
const confirm = ({ selectedValue, selectedOptions }) => {
// console.log('confirm',selectedValue)
// console.log('confirm',selectedOptions)
console.log('selectedValue',selectedValue)
console.log('selectedOptions',selectedOptions)
show.value=false
showearea.value=false
if(setitle.value=='性别')
{
inputValuesex.value=selectedOptions.map((val) => val.text).join(',')
sex.value=inputValuesex.value=='男'?1:2
}
else if(setitle.value=='地区')
{
inputValuearea.value=selectedOptions.map((val) => val.label).join('/')
province.value=selectedOptions[0].code
city.value=selectedOptions[1].code
district.value=selectedOptions[2].code
provinceName.value=selectedOptions[0].label
cityName.value=selectedOptions[1].label
districtName.value=selectedOptions[2].label
}
else if(setitle.value=='职业')
{
// inputValuecareer.value=selectedOptions.map((val) => val.text).join('/')
inputValuecareer.value=selectedOptions[0].name
occupation.value=selectedOptions[0].id
showcareer.value=false
}
else if(setitle.value=='受教育水平')
{
inputValueeducation.value=selectedValue[0]
showe.value=false
educational.value=selectedOptions.map((val) => val.id).join('')
}
console.log(selectedOptions.map((val) => val.text).join(','));
};
const minDate = new Date(1900, 0, 1);
const maxDate = new Date();
const currentDate = new Date();
const popupConfirm = ({ selectedValue, selectedOptions }) => {
inputValuedate.value = selectedValue[0]+'-'+selectedValue[1]+'-'+selectedValue[2]
// inputValuedate.value = selectedOptions.map((val) => val.text).join('');
showdate.value = false;
};
const list = ref([]);
let listor = [];
function changeBox(itemToChange)
{
// itemToChange'new value'
list.value.map(item => {
if (item.name == itemToChange.name) {
if( item.value==1)
{
if(selnum.value>0)
{
selnum.value=selnum.value-1
}
else
{
selnum.value=0
}
// selnum>0?selnum--:selnum=0
item.value=0
}
else
{
if(selnum.value>=3)
{
showToast.text('最多选择3项', {
duration:1000
});
return
}
selnum.value= selnum.value+1
item.value=1
}
// ?:;
// return
}
else {
// return item;
}
});
let filteredList = list.value.filter(item => item.value > 0);
diseasetmp.value=filteredList.map((val) => val.id)
inputValuedisease.value=filteredList.map((val) => val.name).join('|')
console.log("diseasetmp",diseasetmp)
}
function changeNo()
{
showdis.value=false
inputValuedisease.value=inputValuediseaseor
diseasetmp.value=[]
diseasetmp.value=JSON.parse(JSON.stringify(diseasetor))
list.value=[]
list.value=JSON.parse(JSON.stringify(listor))
let filteredList = list.value.filter(item => item.value > 0);
selnum.value=filteredList.length
console.log("diseasetmp111",listor)
}
onMounted(() => {
initData()
WXSHAREHOME("个人信息", '肝胆相照-肝胆病在线公共服务平台',roootUrl + localStorage.getItem("officeid") + '&appid=' +localStorage.getItem("appid")+fromwexin,"");
})
function initData()
{
userInfo().then((data) => {
console.log("userInfo", data);
if(data.data.name==null||data.data.name=='')
{
inputValuename.value=data.data.nickname
}
else
{
inputValuename.value=data.data.name
}
if(data.data.sex==1)
{
inputValuesex.value='男'
}
else if(data.data.sex==2)
{
inputValuesex.value='女'
}
else
{
inputValuesex.value=''
}
sex.value=data.data.sex
province.value=data.data.province
city.value=data.data.city
district.value=data.data.district
provinceName.value=data.data.provinceName
cityName.value=data.data.cityName
districtName.value=data.data.districtName
if(provinceName.value!=null&&provinceName.value!='')
{
inputValuearea.value=provinceName.value+'/'+cityName.value+'/'+ districtName.value
}
inputValuedate.value=data.data.birthday
inputValueheight.value=data.data.height
inputValueweight.value=data.data.weight
inputValuecareer.value=data.data.occupation
occupation.value=data.data.occupation
inputValueeducation.value=data.data.educational
educational.value=data.data.educational
inputValuephone.value=data.data.mobile
diseasetor=data.data.disease.map((val) => val.id)
inputValuediseaseor=data.data.disease.map((val) => val.name).join('|')
diseasetmp.value=data.data.disease.map((val) => val.id)
inputValuedisease.value=data.data.disease.map((val) => val.name).join('|')
diseaseList().then((data) => {
list.value.push(...data.data)
list.value = list.value.map((item) => {
return{
...item,
value:0,
}
})
list.value.map(item => {
if (inputValuedisease.value.includes(item.name)) {
item.value=1
}
else {
item.value=0
}
});
listor.push(...data.data)
listor = listor.map((item) => {
return{
...item,
value:0,
}
})
listor.map(item => {
if (inputValuediseaseor.includes(item.name)) {
item.value=1
}
else {
item.value=0
}
});
educationalList().then((data) => {
console.log("educationalList", data);
education.value.push(...data.data)
inputValueeducation.value= education.value.filter((val) => val.id==inputValueeducation.value)[0].name
})
})
positionList().then((data) => {
console.log("positionList", data);
career.value.push(...data.data)
inputValuecareer.value= career.value.filter((val) => val.id==inputValuecareer.value)[0].name
})
});
}
function Update()
{
if(sex.value == "null" || sex.value == null){
delete formData.sex
}else{
formData.sex = sex.value
}
if(inputValuedate.value == "null" || inputValuedate.value == null){
delete formData.birthday
}else{
formData.birthday = inputValuedate.value
}
if(city.value == "null" || city.value == null){
delete formData.city
delete formData.cityName
}else{
formData.city = city.value
formData.cityName = cityName.value
}
if(diseasetmp.value == "null" || diseasetmp.value == null|| diseasetmp.value == []|| diseasetmp.value.length <1){
delete formData.disease
}else{
formData.disease = diseasetmp.value
// formData.disease = []
}
if(district.value == "null" || district.value == null){
delete formData.district
delete formData.districtName
}else{
formData.district = district.value
formData.districtName = districtName.value
}
if(educational.value == "null" || educational.value == null){
delete formData.educational
}else{
formData.educational = educational.value
}
if(inputValueheight.value == "null" || inputValueheight.value == null){
delete formData.height
}else{
formData.height = inputValueheight.value
}
if(inputValuephone.value == "null" || inputValuephone.value == null){
delete formData.mobile
}else{
formData.mobile = inputValuephone.value
}
if(inputValuename.value == "null" || inputValuename.value == null){
delete formData.name
}else{
formData.name = inputValuename.value
}
if(inputValuecareer.value == "null" || inputValuecareer.value == null){
delete formData.occupation
}else{
formData.occupation = occupation.value
}
if(province.value == "null" || province.value == null){
delete formData.province
delete formData.provinceName
}else{
formData.province = province.value
formData.provinceName = provinceName.value
}
if(inputValueweight.value == "null" || inputValueweight.value == null){
delete formData.weight
}else{
formData.weight = inputValueweight.value
}
// userUpdate(inputValuedate.value,city.value,diseasetmp.value,district.value,
// educational.value,inputValueheight.value,inputValuephone.value,inputValuename.value,
// inputValuecareer.value,province.value,sex.value,inputValueweight.value)
userUpdate(formData)
.then((data) => {
console.log("userUpdate", data);
if(data.code==200)
{
showToast.text('提交成功');
window.history.back();
}
else
{
showToast.text(data.msg);
}
})
}
</script>
<style scoped>
.tip{
margin-top: 16px;
font-size: var(--font-size-12);
font-family: AlibabaPuHuiTiR;
color: #D48806;
line-height: 38px;
height: 38px;
background: #FFFBE6;
text-align: center;
}
.wdiv{
margin-left: 16px;
margin-right: 16px;
margin-top: 12px;
background: #FFFFFF;
box-shadow: 0px 4px 12px 0px rgba(171,209,239,0.1);
border-radius: 8px;
}
.subbutton
{
margin: auto;
width: 279px;
height: 42px;
background: #3BB5FE;
border-radius: 22px;
font-size: var(--font-size-16);
font-family: AlibabaPuHuiTiR;
color: #FFFFFF;
line-height: 42px;
margin-top: 42px;
text-align: center;
}
.item{
display: flex;
padding-left: 16px;
padding-right: 16px;
align-items: center;
font-size: var(--font-size-16);
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
height: 54px;
}
.itemn{
display: flex;
padding-left: 16px;
padding-right: 16px;
align-items: center;
font-size: var(--font-size-16);
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
height: 54px;
/* min-height: 54px; */
}
.itm1{
width: 90px;
line-height: 54px;
/* flex-grow: 0; */
}
.dimg{
width: 16px;
height: 16px;
/* flex-grow: 0; */
}
.dright{
width: calc(100% - 106px);
/* align-items: center; */
/* display:flex ;
align-items: center;
justify-content:space-between ; */
/* flex-grow: 1 ; */
}
.nut-divider{
--nut-divider-margin:0px;
--nut-divider-text-color:#0000000A;
margin-left: 16px;
margin-right: 16px;
width:calc(100% - 32px) ;
}
input {
/* flex-grow: 1 ; */
margin-left: 5px;
margin-right: 15px;
font-size: var(--front-size-16);
background: transparent;
border: none;
-webkit-box-shadow: none;
box-shadow: none;
outline: none;
height: 46px;
width: calc(100% - 16px) ;
vertical-align: middle;
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
}
input:focus {
font-size: var(--front-size-16);
/* flex-grow: 1 ; */
margin-left: 5px;
margin-right: 15px;
border: none;
width: 100% ;
height: 46px;
width: calc(100% - 16px) ;
vertical-align: middle;
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
box-shadow: none;
}
img{
width: 16px;
height: 16px;
}
.tpicker{
--nut-picker-ok-color:#3BB5FEFF;
--nut-picker-bar-title-font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiR;
--nut-picker-bar-ok-font-size: var(--font-size-18);
--nut-picker-bar-cancel-font-size:var(--font-size-18);
--nut-picker-item-text-font-size:var(--font-size-16);
/* --nut-popup-border-radius:8px; */
}
:deep() .nut-popup{
--nut-popup-border-radius:8px;
}
.nut-picker__bar{
display: flex;
height: 46px;
align-items: center;
justify-content: space-between;
}
.nut-picker__left1{
padding: var(--nut-picker-bar-button-padding, 0 15px);
display: flex;
align-items: center;
justify-content: center;
/* min-width: 50px; */
height: 100%;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.45);
}
.nut-picker__title {
flex: 1;
width: 100%;
text-align: center;
font-family: AlibabaPuHuiTiR;
color: var(--nut-picker-bar-title-color, var(--nut-title-color, #1a1a1a));
font-size: var(--font-size-18);
}
.nut-picker__right1{
padding: var(--nut-picker-bar-button-padding, 0 15px);
display: flex;
align-items: center;
justify-content: center;
/* min-width: 50px; */
height: 100%;
font-size: var(--font-size-18);
font-family: AlibabaPuHuiTiR;
color: #3BB5FEFF;
}
.checkbox{
display: flex;
align-items: center;
justify-content: space-between;
margin: 16px;
font-size: var(--font-size-16);
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.85);
}
.divtlist{
-webkit-overflow-scrolling:touch;
position: absolute;
width: 100%;
z-index: 1;
height: 100%;
overflow-y: scroll;
}
.t-list{
padding-bottom: 40px;
}
</style>

View File

@ -0,0 +1,61 @@
<template>
<div class="listcontain">
<headBar :title=title></headBar>
<div class="listcon">
<paperList :url=url :emptyimg=emptyimg :emptytxt=emptytxt :needTop="false" parameter=""></paperList>
</div>
</div>
</template>
<script setup>
import historyb from '../assets/historyb.png'
import readb from '../assets/readb.png'
import collectb from '../assets/collectb.png'
import { useRoute } from 'vue-router';
import {WXSHAREHOME} from '../utils/wxshare-1.6.0';
import {fromwexin,roootUrl} from '../utils/api.js'
const title = ref('')
const emptyimg = ref('')
const emptytxt = ref('')
const router = useRoute();
const url=ref('')
onMounted(() => {
title.value = router.query.type;
if( title.value=='浏览记录')
{
emptytxt.value='暂无浏览记录'
emptyimg.value=historyb
url.value='/article/queryClickArticle'
}
else if( title.value=='我的收藏')
{
emptytxt.value='您还未添加收藏'
emptyimg.value=collectb
url.value='/article/queryColectArticle'
}
else if( title.value=='确认已读')
{
emptytxt.value='暂无已读'
emptyimg.value=readb
url.value='/article/queryReadArticle'
}
});
WXSHAREHOME( title.value, '肝胆相照-肝胆病在线公共服务平台', roootUrl + localStorage.getItem("officeid") + '&appid=' +localStorage.getItem("appid")+fromwexin,"");
</script>
<style scoped>
.listcontain{
display: flex;
height: 100vh;
flex-direction: column;
}
.listcon{
flex: 1;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
.t-pull-down-refresh {
overflow: hidden;
height: auto;
}
</style>

240
src/views/questionnaire.vue Normal file
View File

@ -0,0 +1,240 @@
<template>
<div class="listcontain">
<headBar :title=title ></headBar>
<div class="listcon">
<t-pull-down-refresh v-model="refreshing" @refresh="onRefresh" :loading-bar-height="36"
:loading-texts="['下拉刷新', '松开刷新', '正在刷新', '刷新完成']" :loading-props="{ theme: 'dots' }">
<t-list @scroll="onScroll" :async-loading="loading" v-if="list.length>0">
<div v-for="(item, $index) in list" @click="clickArticle(item)">
<div :style="{background:`url(${imgurl+item.img})`,height:'136px',marginLeft:'16px',marginRight:'16px',marginTop:'16px',
'border-radius':'8px','background-size':'100% 100%','background-repeat':'no-repeat','justify-content': 'space-between' ,display:'flex' }">
</div>
<div style="display: flex;margin-left:16px;margin-right:16px;margin-top: 8px;">
<div class="title">
<nut-ellipsis
:content=item.title
rows="2"
direction="end"
></nut-ellipsis>
</div>
</div>
</div>
<template #footer>
<div class="end" v-if="evisible"> END </div>
</template>
</t-list>
<nut-empty v-else>
<template #image>
<nut-image :src=sempty fit="cover"/>
</template>
<template #description>
<div style="font-size: var(--front-size-16);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 22px;margin-top: 16px;">暂无数据</div>
</template>
</nut-empty>
</t-pull-down-refresh>
</div>
</div>
</template>
<script setup>
import sempty from '../assets/sempty.png'
import {imgurl,questionnaire,fromwexin,roootUrl} from '../utils/api.js'
import {WXSHAREHOME} from '../utils/wxshare-1.6.0';
const evisible = ref(false);
const page = ref(1);
const totalPage = ref(1)
const title=ref('调查问卷')
const refreshing=ref(false);
const list = ref([ ])
const loading = ref('');
onMounted(()=>{
onLoad(page.value);
WXSHAREHOME("调查问卷", '肝胆相照-肝胆病在线公共服务平台',roootUrl + localStorage.getItem("officeid") + '&appid=' +localStorage.getItem("appid")+fromwexin,"");
})
const onLoad = (page) => {
if (page > totalPage.value) {
refreshing.value=false;
return
}
if(page == 1||!evisible.value)
{
loading.value = 'loading';
questionnaire(page).then((data) => {
console.log("questionnaire", data);
refreshing.value=false;
loading.value = '';
if (page == 1) {
list.value = [];
list.value.push(...data.data.list)
}
else {
list.value.push(...data.data.list)
}
totalPage.value = data.data.pages ;
if (page >= totalPage.value) {
evisible.value=true;
}
})
}
};
const onRefresh = () => {
console.log('onRefresh');
page.value = 1;
totalPage.value= 1;
evisible.value = false;
refreshing.value=true;
onLoad(page.value);
};
const onScroll = (scrollBottom) => {
if (scrollBottom < 100) {
page.value=page.value+1;
onLoad(page.value);
}
};
function clickArticle(item)
{
console.log("item",item);
window.location.href =item.content
}
</script>
<style scoped>
.listcontain{
display: flex;
height: 100vh;
flex-direction: column;
}
.listcon{
flex: 1;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
.t-pull-down-refresh {
overflow: hidden;
height: auto;
}
.stickytop{
width: 50px;
height: 30px;
background: linear-gradient(32deg, #FFA39E 0%, #FE4E4F 100%);
border-radius: 8px 0px 8px 0px;
font-size: var(--front-size-12);
font-family: AlibabaPuHuiTiR;
color: #FFFFFF;
line-height: 30px;
text-align: center;
}
.stickybottom{
margin-top: 106px;
width: 50px;
height: 30px;
background: rgba(0,0,0,0.65);
border-radius: 8px 0px 8px 0px;
font-size: var(--front-size-12);
font-family: AlibabaPuHuiTiR;
color: #FFFFFF;
line-height: 30px;
text-align: center;
}
.type{
font-size:var(--font-size-11);
font-family: DingTalk-JinBuTi, DingTalk;
font-weight: normal;
color: #FFFFFF;
line-height: 20px;
text-align: center;
text-shadow: 0px 2px 3px #2DB27F;
width: 38px;
height: 20px;
background: linear-gradient(33deg, #4ECF9D 0%, #81EEC6 100%);
border-radius: 2px;
}
.type1{
font-size:var(--font-size-11);
font-family: DingTalk-JinBuTi, DingTalk;
font-weight: normal;
color: #FFFFFF;
line-height: 20px;
text-align: center;
text-shadow: 0px 2px 3px #299BDF;
width: 38px;
height: 20px;
background: linear-gradient(197deg, #A6D9FF 0%, #3BB5FE 100%);
border-radius: 2px;
}
.type2{
font-size: var(--font-size-11);
font-family: DingTalk-JinBuTi, DingTalk;
font-weight: normal;
color: #FFFFFF;
line-height: 20px;
text-align: center;
text-shadow: 0px 2px 3px #7963F1;
width: 38px;
height: 20px;
background: linear-gradient(196deg, #C4B9FF 0%, #9784FF 100%);
border-radius: 2px;
}
.end {
display: flex;
align-items: center;
justify-content: center;
margin-top: 21px;
font-size:16px;
/* font-size: var(--font-size-14); */
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.24);
line-height: 24px;
}
.title{
padding-left: 4px;
font-size: 16px;
/* font-size: var(--font-size-14); */
font-family: AlibabaPuHuiTiM;
color: #000000d9;
line-height: 24px;
flex: 1;
}
.types{
margin-top: 6px;
margin-right: 6px;
font-size:var(--font-size-12);
font-family: AlibabaPuHuiTiR;
color: #38A7FE;
line-height: 16px;
background: #ECF6FF;
border-radius: 12px;
padding: 4px 8px 4px 8px;
}
.nut-empty{
margin-top: var(--empty-top);
--nut-empty-padding:0px;
}
:deep().nut-empty__box {
width: 246px;
height: 159px;
}
</style>

233
src/views/searchthings.vue Normal file
View File

@ -0,0 +1,233 @@
<template>
<headBar :title=titlet></headBar>
<div class="dsearch">
<div class="divsearch">
<IconFont size="20" :name=search :style="{ 'padding-top': '12px', 'padding-left': '12px' }"></IconFont>
<input placeholder="输入医生姓名" type="text" v-model="inputValue">
<IconFont size="16" :name=deletes :style="{ 'padding-top': '12px', 'padding-left': '12px' }" @click="clearSearch"></IconFont>
</div>
<div style="font-size: var(--front-size-14);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 40px;text-align: center;margin-left: 12px;" @click="onRefresh">搜索</div>
</div>
<div style="height: 12px;background: #F6F7FB;margin-top: 16px;"></div>
<t-pull-down-refresh v-model="refreshing" @refresh="onRefresh" :loading-bar-height="36"
:loading-texts="['下拉刷新', '松开刷新', '正在刷新', '刷新完成']" :loading-props="{ theme: 'dots' }">
<t-list @scroll="onScroll" :async-loading="loading" v-if="list.length>0">
<div v-for="(item, $index) in list">
<div class="listbox" @click="gotoDoctor(item)">
<nut-image :src=imgurl+item.photo alt="图片描述" fit="cover"
width="90" height='90' round radius="50"
style="margin-left: 16px;"/>
<div style="width: 241px;margin-left: 12px; display: block;">
<div style="font-size: var(--font-size-16);
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
line-height: 22px;">
{{ item.name }}
</div>
<div class="personinfo">
{{ '职务: '+item.duties }}
</div>
<div class="personinfo">
{{ '职称: '+item.position }}
</div>
<div class="personinfo">
<nut-ellipsis
:content=zhuanchang+item.goodat
direction="end"
rows="2"
></nut-ellipsis>
</div>
</div>
</div>
</div>
<template #footer>
<div class="end" v-if="evisible"> END </div>
</template>
</t-list>
<nut-empty v-else>
<template #image>
<nut-image :src=sempty fit="cover"/>
</template>
<template #description>
<div style="font-size: var(--front-size-16);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 22px;margin-top: 16px;">暂无数据</div>
</template>
</nut-empty>
</t-pull-down-refresh>
</template>
<script setup>
import {medicalStaffqueryPage,imgurl,fromwexin,roootUrl} from '../utils/api.js'
import sempty from '../assets/sempty.png'
import { IconFont } from '@nutui/icons-vue';
import search from '../assets/searchb.png'
import deletes from '../assets/deletes.png'
import { useRouter } from 'vue-router';
import {WXSHAREHOME} from '../utils/wxshare-1.6.0';
const titlet=ref('搜索列表')
const inputValue=ref('');
const router = useRouter();
const evisible = ref(false);
const loading = ref('');
const page = ref(1);
const totalPage = ref(1)
const refreshing=ref(false);
const zhuanchang=ref('专长: ')
onMounted(() => {
onLoad(page.value);
WXSHAREHOME("搜索列表", '肝胆相照-肝胆病在线公共服务平台',roootUrl + localStorage.getItem("officeid") + '&appid=' +localStorage.getItem("appid")+fromwexin,"");
});
function clearSearch()
{
inputValue.value=''
}
const list = ref([]);
const onLoad = (page) => {
if (page > totalPage.value) {
refreshing.value=false;
return
}
if(page == 1||!evisible.value)
{
loading.value = 'loading';
medicalStaffqueryPage(page, inputValue.value).then((data) => {
console.log("medicalStaffqueryPage", data);
refreshing.value=false;
loading.value = '';
if (page == 1) {
list.value = [];
list.value.push(...data.data.list)
}
else {
list.value.push(...data.data.list)
}
totalPage.value = data.data.pages ;
if (page >= totalPage.value) {
evisible.value=true;
}
})
}
};
const onRefresh = () => {
evisible.value = false;
page.value = 1;
totalPage.value= 1;
refreshing.value=true;
onLoad(page.value);
};
const onScroll = (scrollBottom) => {
if (scrollBottom < 100) {
page.value=page.value+1;
onLoad(page.value);
}
};
function gotoDoctor(item)
{
router.push({ path: '/doctor-info',query:{id:item.id}});
}
</script>
<style scoped>
.headnav {
--td-navbar-height: 41px;
--td-navbar-left-arrow-size: 22px;
--nut-navbar-background: transparent;
--td-navbar-title-font-size:var(--font-size-title);
}
.dsearch{
display: flex;
height: 40px;
margin-top: 16px;
margin-left: 16px;
margin-right: 16px;
justify-content: space-between;
}
.divsearch {
display: flex;
height: 40px;
flex: 1;
background: #FFFFFF;
border-radius: 21px;
border: 2px solid rgba(0,0,0,0.06);
backdrop-filter: blur(25px);
}
.ss{
display: flex;
margin-right: 16px;
margin-left: 16px;
margin-bottom: 16px;
height: 40px;
align-items: center;
background: #FFFFFF;
border-radius: 21px;
border: 2px solid rgba(0,0,0,0.06);
font-size: var(--front-size-14);
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
line-height: 22px;
text-shadow: 0px 2px 4px #E0F2FF;
}
.dicon{
margin-left: 16px;
}
input {
width: 70%;
margin-left: 5px;
font-size: var(--front-size-14);
background: transparent;
border: none;
-webkit-box-shadow: none;
box-shadow: none;
outline: none;
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
/* color: red; */
}
input:focus {
font-size: var(--front-size-14);
width: 70%;
margin-left: 5px;
border: none;
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
box-shadow: none;
}
.personinfo{
font-size: var(--font-size-12);
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.65);
line-height: 20px;
}
.listbox{
display: flex;
padding-top: 16px;
}
.end {
display: flex;
align-items: center;
justify-content: center;
margin-top: 21px;
font-size: var(--font-size-14);
font-family: AlibabaPuHuiTiR;
color: rgba(0,0,0,0.24);
line-height: 24px;
}
</style>

188
src/views/searchview.vue Normal file
View File

@ -0,0 +1,188 @@
<template>
<div class="contentbox">
<headBar :title=title></headBar>
<div class="dsearch">
<div class="divsearch">
<IconFont size="20" :name=search :style="{ 'padding-top': '12px', 'padding-left': '12px' }"></IconFont>
<input placeholder="请输入文章标题/疾病/关键词…" type="text" v-model="inputValue">
<IconFont size="16" :name=deletes :style="{ 'padding-top': '12px', 'padding-left': '12px' }" @click="clearSearch"></IconFont>
</div>
<div style="font-size: var(--front-size-14);font-family: AlibabaPuHuiTiR;color: rgba(0,0,0,0.65);line-height: 40px;text-align: center;margin-left: 12px;" @click="gotosearch">搜索</div>
</div>
<t-tabs :value="currentValue" @change="onChange" >
<t-tab-panel value="first">
<template #label>
<div>图文</div>
</template>
</t-tab-panel>
<t-tab-panel value="second">
<template #label>音频</template>
</t-tab-panel>
<t-tab-panel value="third">
<template #label>视频</template>
</t-tab-panel>
</t-tabs>
<div style="background: var(--back-color-02);width:100vw;" class="listcon">
<paperList :url=url :parameter=[ceecId,input,mediaType]></paperList>
</div>
</div>
</template>
<script setup>
import {fromwexin,roootUrl} from '../utils/api.js'
import {WXSHAREHOME} from '../utils/wxshare-1.6.0';
import { IconFont } from '@nutui/icons-vue';
import paperList from '../components/paperList.vue'
import search from '../assets/searchb.png'
import deletes from '../assets/deletes.png'
import { useRoute } from 'vue-router';
const title=ref('搜索列表')
const inputValue=ref('');
const input=ref('');
const currentValue = ref('first');
const router = useRoute();
const from=ref('')
const ceecId=ref(0)
const url=ref('')
const mediaType=ref(1)
onMounted(() => {
from.value=router.query.from;
ceecId.value==router.query.ceecId;
// from.value=JSON.parse(history.state.data).from;
// ceecId.value=JSON.parse(history.state.data).ceecId;
if(from.value =='edu-center')
{
url.value='/ceecArticleList';
}else if(from.value =='department')
{
url.value='/deparsArticleList';
}
WXSHAREHOME("搜索列表", '肝胆相照-肝胆病在线公共服务平台',roootUrl + localStorage.getItem("officeid") + '&appid=' +localStorage.getItem("appid")+fromwexin,"");
});
function clearSearch()
{
inputValue.value=''
}
const onChange = (label) => {
currentValue.value=label
if(label=='first')
{
mediaType.value=1
}
else if(label=='second')
{
mediaType.value=2
}
else
{
mediaType.value=3
}
};
function gotosearch()
{
input.value=inputValue.value
}
</script>
<style scoped>
.listcon{
flex: 1;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
.contentbox{
height:100vh;
display: flex;
flex-direction: column;
}
.headnav {
--td-navbar-height: 41px;
--td-navbar-left-arrow-size: 22px;
--nut-navbar-background: transparent;
--td-navbar-title-font-size:var(--font-size-title);
}
.dsearch{
display: flex;
height: 40px;
margin-top: 16px;
margin-left: 16px;
margin-right: 16px;
justify-content: space-between;
}
.divsearch {
display: flex;
height: 40px;
flex: 1;
background: #FFFFFF;
border-radius: 21px;
border: 2px solid rgba(0,0,0,0.06);
backdrop-filter: blur(25px);
}
.ss{
display: flex;
margin-right: 16px;
margin-left: 16px;
margin-bottom: 16px;
height: 40px;
align-items: center;
background: #FFFFFF;
border-radius: 21px;
border: 2px solid rgba(0,0,0,0.06);
font-size: var(--front-size-14);
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
line-height: 22px;
text-shadow: 0px 2px 4px #E0F2FF;
}
.dicon{
margin-left: 16px;
}
input {
width: 70%;
margin-left: 5px;
font-size: var(--front-size-14);
background: transparent;
border: none;
-webkit-box-shadow: none;
box-shadow: none;
outline: none;
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
/* color: red; */
}
input:focus {
font-size: var(--front-size-14);
width: 70%;
margin-left: 5px;
border: none;
font-family: AlibabaPuHuiTiM;
color: rgba(0,0,0,0.85);
box-shadow: none;
}
.t-tabs{
margin-top: 12px;
font-size: var(--font-size-14);
font-family: AlibabaPuHuiTiR;
--td-tab-track-color: #3BB5FEFF;
--td-tab-nav-bg-color:transparent;
background: #FFFFFF;
--td-tab-item-active-color: #3BB5FEFF;
--td-tab-item-color:rgba(0,0,0,0.65);
--td-tab-border-color:transparent;
--td-tab-item-height:38px;
}
:deep().t-tabs__nav{
width: 188px;
}
</style>

Some files were not shown because too many files have changed in this diff Show More