框架整理完毕
@@ -3,7 +3,8 @@ export default defineAppConfig({
|
|||||||
'pages/index/index',
|
'pages/index/index',
|
||||||
'pages/kefu/kefu',
|
'pages/kefu/kefu',
|
||||||
'pages/user/user',
|
'pages/user/user',
|
||||||
'pages/study/study'
|
'pages/study/study',
|
||||||
|
'pages/page/index'
|
||||||
],
|
],
|
||||||
"subpackages": [
|
"subpackages": [
|
||||||
{
|
{
|
||||||
@@ -40,7 +41,14 @@ export default defineAppConfig({
|
|||||||
"index",
|
"index",
|
||||||
"detail"
|
"detail"
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
"root": "honor",
|
||||||
|
"pages": [
|
||||||
|
"index",
|
||||||
|
"detail"
|
||||||
|
]
|
||||||
|
},
|
||||||
],
|
],
|
||||||
window: {
|
window: {
|
||||||
backgroundTextStyle: 'dark',
|
backgroundTextStyle: 'dark',
|
||||||
@@ -51,7 +59,7 @@ export default defineAppConfig({
|
|||||||
tabBar: {
|
tabBar: {
|
||||||
custom: false,
|
custom: false,
|
||||||
color: "#8a8a8a",
|
color: "#8a8a8a",
|
||||||
selectedColor: "#9a23d4",
|
selectedColor: "#d81e06",
|
||||||
backgroundColor: "#ffffff",
|
backgroundColor: "#ffffff",
|
||||||
list: [
|
list: [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
page{
|
page{
|
||||||
background-color: #f5f5f5;
|
background-color: #ffefef;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-size: 100%;
|
background-size: 100%;
|
||||||
background-position: bottom;
|
background-position: bottom;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import {useEffect} from 'react'
|
import {useEffect} from 'react'
|
||||||
import Taro from '@tarojs/taro'
|
// import Taro from '@tarojs/taro'
|
||||||
import {useDidShow, useDidHide} from '@tarojs/taro'
|
import {useDidShow, useDidHide} from '@tarojs/taro'
|
||||||
|
|
||||||
// 全局样式
|
// 全局样式
|
||||||
@@ -12,7 +12,7 @@ function App(props) {
|
|||||||
|
|
||||||
// 对应 onShow
|
// 对应 onShow
|
||||||
useDidShow(() => {
|
useDidShow(() => {
|
||||||
Taro.hideTabBar()
|
// Taro.hideTabBar()
|
||||||
})
|
})
|
||||||
|
|
||||||
// 对应 onHide
|
// 对应 onHide
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 3.2 KiB |
@@ -1,28 +1,35 @@
|
|||||||
import { Tabbar } from '@nutui/nutui-react-taro'
|
import {Tabbar} from '@nutui/nutui-react-taro'
|
||||||
import { Home, User, Date } from '@nutui/icons-react-taro'
|
import {Home, User, Date} from '@nutui/icons-react-taro'
|
||||||
import Taro from '@tarojs/taro'
|
import Taro from '@tarojs/taro'
|
||||||
|
|
||||||
function TabBar(){
|
function TabBar() {
|
||||||
return (
|
return (
|
||||||
<Tabbar
|
<Tabbar
|
||||||
fixed
|
fixed
|
||||||
onSwitch={(index) => {
|
onSwitch={(index) => {
|
||||||
console.log(index)
|
console.log(index)
|
||||||
if(index == 0){
|
if (index == 0) {
|
||||||
Taro.switchTab({ url: '/pages/index/index' })
|
Taro.switchTab({url: '/pages/index/index'})
|
||||||
}
|
}
|
||||||
if(index == 1){
|
if (index == 1) {
|
||||||
Taro.navigateTo({ url: '/pages/study/study' })
|
Taro.switchTab({url: '/pages/study/study'})
|
||||||
}
|
}
|
||||||
if(index == 2){
|
if (index == 2) {
|
||||||
Taro.switchTab({ url: '/pages/user/user' })
|
Taro.switchTab({url: '/pages/user/user'})
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
style={{
|
||||||
<Tabbar.Item title="首页" icon={<Home size={18} />} />
|
display: 'none',
|
||||||
<Tabbar.Item title="AI问答" icon={<Date size={18} />} />
|
zIndex: 100,
|
||||||
<Tabbar.Item title="我的" icon={<User size={18} />} />
|
backgroundColor: '#fff',
|
||||||
</Tabbar>
|
boxShadow: '0 0 10px rgba(0, 0, 0, 0.1)',
|
||||||
)
|
}}
|
||||||
|
>
|
||||||
|
<Tabbar.Item title="首页" icon={<Home size={18}/>}/>
|
||||||
|
<Tabbar.Item title="AI问答" icon={<Date size={18}/>}/>
|
||||||
|
<Tabbar.Item title="我的" icon={<User size={18}/>}/>
|
||||||
|
</Tabbar>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default TabBar;
|
export default TabBar;
|
||||||
|
|||||||
4
src/honor/detail.config.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export default definePageConfig({
|
||||||
|
navigationBarTitleText: '详情',
|
||||||
|
navigationBarBackgroundColor: '#ffe0e0'
|
||||||
|
})
|
||||||
128
src/honor/detail.scss
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
.content {
|
||||||
|
padding: 32px;
|
||||||
|
line-height: 2.4rem;
|
||||||
|
|
||||||
|
// 富文本内容样式
|
||||||
|
:global {
|
||||||
|
// 段落样式
|
||||||
|
p {
|
||||||
|
margin: 16px 0;
|
||||||
|
line-height: 1.8;
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 标题样式
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
margin: 24px 0 16px 0;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 { font-size: 24px; }
|
||||||
|
h2 { font-size: 22px; }
|
||||||
|
h3 { font-size: 20px; }
|
||||||
|
h4 { font-size: 18px; }
|
||||||
|
h5 { font-size: 16px; }
|
||||||
|
h6 { font-size: 14px; }
|
||||||
|
|
||||||
|
// 图片样式
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 8px;
|
||||||
|
margin: 16px 0;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 列表样式
|
||||||
|
ul, ol {
|
||||||
|
margin: 16px 0;
|
||||||
|
padding-left: 24px;
|
||||||
|
|
||||||
|
li {
|
||||||
|
margin: 8px 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 引用样式
|
||||||
|
blockquote {
|
||||||
|
margin: 16px 0;
|
||||||
|
padding: 16px;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
border-left: 4px solid #ddd;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 代码样式
|
||||||
|
code {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
padding: 2px 6px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-family: 'Courier New', monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow-x: auto;
|
||||||
|
margin: 16px 0;
|
||||||
|
|
||||||
|
code {
|
||||||
|
background: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表格样式
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin: 16px 0;
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
padding: 12px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 链接样式
|
||||||
|
a {
|
||||||
|
color: #1890ff;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分割线样式
|
||||||
|
hr {
|
||||||
|
margin: 24px 0;
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 强调样式
|
||||||
|
strong, b {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
em, i {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
52
src/honor/detail.tsx
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import {useEffect, useState} from 'react'
|
||||||
|
import {Tag} from '@nutui/nutui-react-taro'
|
||||||
|
import {useRouter} from '@tarojs/taro'
|
||||||
|
import {Divider} from '@nutui/nutui-react-taro'
|
||||||
|
import {CmsArticle} from "@/api/cms/cmsArticle/model"
|
||||||
|
import {Eye} from '@nutui/icons-react-taro'
|
||||||
|
// 显示html富文本
|
||||||
|
import {View, RichText} from '@tarojs/components'
|
||||||
|
import './detail.scss'
|
||||||
|
import Line from "@/components/Gap";
|
||||||
|
import {getCmsArticle} from "@/api/cms/cmsArticle";
|
||||||
|
|
||||||
|
function Detail() {
|
||||||
|
const {params} = useRouter();
|
||||||
|
// 文章详情
|
||||||
|
const [item, setItem] = useState<CmsArticle>()
|
||||||
|
// 浏览量
|
||||||
|
const [views, setViews] = useState<number>()
|
||||||
|
|
||||||
|
const reload = () => {
|
||||||
|
getCmsArticle(Number(params.id)).then(data => {
|
||||||
|
if (data) {
|
||||||
|
setItem(data)
|
||||||
|
setViews(data.actualViews)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
reload();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={'bg-white'}>
|
||||||
|
<div className={'p-3 font-bold text-lg'}>{item?.title}</div>
|
||||||
|
<div className={'flex justify-between px-3'}>
|
||||||
|
<Tag type={'success'}>{item?.categoryName}</Tag>
|
||||||
|
<div className={'flex items-center gap-2 text-sm text-gray-400'}><Eye size={14}/>{views}</div>
|
||||||
|
</div>
|
||||||
|
<Divider/>
|
||||||
|
<View className={'content text-gray-700 text-sm'}>
|
||||||
|
<RichText
|
||||||
|
nodes={item?.content || '暂无内容'}
|
||||||
|
space="nbsp"
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
<Line height={44}/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Detail
|
||||||
3
src/honor/index.config.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export default definePageConfig({
|
||||||
|
navigationBarTitleText: '图文列表'
|
||||||
|
})
|
||||||
86
src/honor/index.tsx
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import {useEffect, useState} from "react";
|
||||||
|
import {pageCmsArticle} from "@/api/cms/cmsArticle";
|
||||||
|
import {CmsArticle} from "@/api/cms/cmsArticle/model";
|
||||||
|
import Taro from '@tarojs/taro'
|
||||||
|
import {useRouter} from '@tarojs/taro'
|
||||||
|
import {Image} from '@nutui/nutui-react-taro'
|
||||||
|
import {getCmsNavigation} from "@/api/cms/cmsNavigation";
|
||||||
|
import {CmsNavigation} from "@/api/cms/cmsNavigation/model";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文章终极列表
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
const Index = () => {
|
||||||
|
const {params} = useRouter();
|
||||||
|
const [navigation, setNavigation] = useState<CmsNavigation>()
|
||||||
|
const [list, setList] = useState<CmsArticle[]>([])
|
||||||
|
|
||||||
|
const reload = async () => {
|
||||||
|
// 获取栏目ID
|
||||||
|
const categoryId = Number(params.id);
|
||||||
|
// 当前栏目信息
|
||||||
|
const navs = await getCmsNavigation(categoryId);
|
||||||
|
// 终极新闻列表
|
||||||
|
const articles = await pageCmsArticle({categoryId});
|
||||||
|
|
||||||
|
// 当前栏目信息
|
||||||
|
if (navs) {
|
||||||
|
setNavigation(navs);
|
||||||
|
}
|
||||||
|
// 新闻列表
|
||||||
|
if (articles) {
|
||||||
|
setList(articles?.list || [])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
reload()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div style={{padding: navigation?.span + 'px'}}>
|
||||||
|
<Image src={navigation?.style} width={'100%'}
|
||||||
|
height={'auto'}/>
|
||||||
|
</div>
|
||||||
|
<div className={'bg-white rounded-lg py-3 px-3'}>
|
||||||
|
{
|
||||||
|
// 终极文章列表
|
||||||
|
list.map((item, index) => {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={index}
|
||||||
|
className={'relative'}
|
||||||
|
style={{
|
||||||
|
background: 'url(https://oss.wsdns.cn/20250706/4dd93518d88f4b4a9028a769ad010295.png)',
|
||||||
|
backgroundSize: '100%',
|
||||||
|
backgroundRepeat: 'no-repeat',
|
||||||
|
margin: '10px 0',
|
||||||
|
width: '100%',
|
||||||
|
height: '66px',
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center'
|
||||||
|
}}
|
||||||
|
onClick={() => Taro.navigateTo({url: `./detail?id=${item.articleId}`})}
|
||||||
|
>
|
||||||
|
{/* 标题 */}
|
||||||
|
<div
|
||||||
|
className={'absolute z-50 text-sm text-center text-[#F2FE03] font-bold leading-tight px-1'}
|
||||||
|
style={{
|
||||||
|
backgroundImage: `url(https://oss.wsdns.cn/20250706/4dd93518d88f4b4a9028a769ad010295.png})`,
|
||||||
|
width: '100%',
|
||||||
|
height: 'auto'
|
||||||
|
}}>
|
||||||
|
A {item.title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default Index
|
||||||
@@ -3,7 +3,7 @@ page {
|
|||||||
|
|
||||||
.mobile-container {
|
.mobile-container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 100vh;
|
min-height: 90vh;
|
||||||
|
|
||||||
// PC端样式
|
// PC端样式
|
||||||
//@media screen and (min-width: 768px) {
|
//@media screen and (min-width: 768px) {
|
||||||
|
|||||||
128
src/pages/page/index.scss
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
.content {
|
||||||
|
padding: 32px;
|
||||||
|
line-height: 2.4rem;
|
||||||
|
|
||||||
|
// 富文本内容样式
|
||||||
|
:global {
|
||||||
|
// 段落样式
|
||||||
|
p {
|
||||||
|
margin: 16px 0;
|
||||||
|
line-height: 1.8;
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 标题样式
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
margin: 24px 0 16px 0;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 { font-size: 24px; }
|
||||||
|
h2 { font-size: 22px; }
|
||||||
|
h3 { font-size: 20px; }
|
||||||
|
h4 { font-size: 18px; }
|
||||||
|
h5 { font-size: 16px; }
|
||||||
|
h6 { font-size: 14px; }
|
||||||
|
|
||||||
|
// 图片样式
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 8px;
|
||||||
|
margin: 16px 0;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 列表样式
|
||||||
|
ul, ol {
|
||||||
|
margin: 16px 0;
|
||||||
|
padding-left: 24px;
|
||||||
|
|
||||||
|
li {
|
||||||
|
margin: 8px 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 引用样式
|
||||||
|
blockquote {
|
||||||
|
margin: 16px 0;
|
||||||
|
padding: 16px;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
border-left: 4px solid #ddd;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 代码样式
|
||||||
|
code {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
padding: 2px 6px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-family: 'Courier New', monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow-x: auto;
|
||||||
|
margin: 16px 0;
|
||||||
|
|
||||||
|
code {
|
||||||
|
background: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表格样式
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin: 16px 0;
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
padding: 12px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 链接样式
|
||||||
|
a {
|
||||||
|
color: #1890ff;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分割线样式
|
||||||
|
hr {
|
||||||
|
margin: 24px 0;
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 强调样式
|
||||||
|
strong, b {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
em, i {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
47
src/pages/page/index.tsx
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import {useEffect, useState} from 'react'
|
||||||
|
import {useRouter} from '@tarojs/taro'
|
||||||
|
import {Divider} from '@nutui/nutui-react-taro'
|
||||||
|
import {CmsArticle} from "@/api/cms/cmsArticle/model"
|
||||||
|
// 显示html富文本
|
||||||
|
import {View, RichText} from '@tarojs/components'
|
||||||
|
import './index.scss'
|
||||||
|
import {getCmsNavigation} from "@/api/cms/cmsNavigation";
|
||||||
|
|
||||||
|
function Detail() {
|
||||||
|
const {params} = useRouter();
|
||||||
|
// 文章详情
|
||||||
|
const [item, setItem] = useState<CmsArticle>()
|
||||||
|
// 正文
|
||||||
|
const [content, setContent] = useState<string>('')
|
||||||
|
|
||||||
|
const reload = async () => {
|
||||||
|
const nav = await getCmsNavigation(Number(params.id));
|
||||||
|
if(nav){
|
||||||
|
setItem(nav)
|
||||||
|
}
|
||||||
|
if(nav.design?.content){
|
||||||
|
setContent(nav.design?.content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
reload().then();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="mobile-container">
|
||||||
|
<div className={'bg-white'}>
|
||||||
|
<div className={'p-3 font-bold text-lg'}>{item?.title}</div>
|
||||||
|
<Divider/>
|
||||||
|
<View className={'content text-gray-700 text-sm'}>
|
||||||
|
<RichText
|
||||||
|
nodes={content || '暂无内容'}
|
||||||
|
space="nbsp"
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Detail
|
||||||
@@ -1,112 +1,79 @@
|
|||||||
import {Button} from '@nutui/nutui-react-taro'
|
|
||||||
import {Avatar, Tag, Space} from '@nutui/nutui-react-taro'
|
import {Avatar, Tag, Space} from '@nutui/nutui-react-taro'
|
||||||
import Taro from '@tarojs/taro';
|
|
||||||
import {useEffect, useState} from "react";
|
import {useEffect, useState} from "react";
|
||||||
import {User} from "@/api/system/user/model";
|
import {User} from "@/api/system/user/model";
|
||||||
import navTo from "@/utils/common";
|
import navTo from "@/utils/common";
|
||||||
import {TenantId} from "@/utils/config";
|
import Taro from '@tarojs/taro'
|
||||||
|
import {getUserInfo} from "@/api/layout";
|
||||||
|
|
||||||
function UserCard() {
|
function UserCard() {
|
||||||
const [IsLogin, setIsLogin] = useState<boolean>(false)
|
const [IsLogin, setIsLogin] = useState<boolean>(false)
|
||||||
const [userInfo, setUserInfo] = useState<User>()
|
const [userInfo, setUserInfo] = useState<User>()
|
||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
reload()
|
reload().then()
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const reload = () => {
|
const reload = async () => {
|
||||||
|
setIsLogin(true)
|
||||||
};
|
if(Taro.getStorageSync('UserId')){
|
||||||
|
setUserInfo(await getUserInfo())
|
||||||
/* 获取用户手机号 */
|
|
||||||
const handleGetPhoneNumber = ({detail}) => {
|
|
||||||
const {code, encryptedData, iv} = detail
|
|
||||||
Taro.login({
|
|
||||||
success: function () {
|
|
||||||
if (code) {
|
|
||||||
Taro.request({
|
|
||||||
url: 'https://server.gxwebsoft.com/api/wx-login/loginByMpWxPhone',
|
|
||||||
method: 'POST',
|
|
||||||
data: {
|
|
||||||
code,
|
|
||||||
encryptedData,
|
|
||||||
iv,
|
|
||||||
notVerifyPhone: true,
|
|
||||||
refereeId: 0,
|
|
||||||
sceneType: 'save_referee',
|
|
||||||
tenantId: TenantId
|
|
||||||
},
|
|
||||||
header: {
|
|
||||||
'content-type': 'application/json',
|
|
||||||
TenantId
|
|
||||||
},
|
|
||||||
success: function (res) {
|
|
||||||
Taro.setStorageSync('access_token', res.data.data.access_token)
|
|
||||||
Taro.setStorageSync('UserId', res.data.data.user.userId)
|
|
||||||
setUserInfo(res.data.data.user)
|
|
||||||
setIsLogin(true)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
console.log('登录失败!')
|
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className={'p-4'}>
|
<div className={'p-4 bg-[#BE1717]'}>
|
||||||
<div
|
<div
|
||||||
className={'user-card w-full bg-blue-900 flex flex-col justify-center rounded-xl'}
|
className={'user-card w-full flex flex-col justify-center rounded-xl'}
|
||||||
style={{
|
style={{
|
||||||
background: 'linear-gradient(to bottom, #e1dfff, #f3f2f7)', // 这种情况建议使用类名来控制样式(引入外联样式)
|
// background: 'linear-gradient(to bottom, #ff0000, #f3f2f7)', // 这种情况建议使用类名来控制样式(引入外联样式)
|
||||||
// width: '720rpx',
|
// width: '720rpx',
|
||||||
// margin: '10px auto 0px auto',
|
// margin: '10px auto 0px auto',
|
||||||
height: '144px',
|
height: '144px',
|
||||||
// borderRadius: '22px 22px 0 0',
|
// borderRadius: '22px 22px 0 0',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div className={'user-card-header flex w-full justify-between items-center'}>
|
<div className={'user-card-header flex w-full justify-between items-center'}>
|
||||||
<div className={'flex items-center mx-4'}>
|
<div className={'flex items-center mx-4'}>
|
||||||
{
|
{
|
||||||
IsLogin ? (
|
IsLogin && (
|
||||||
<Avatar size="large" src={userInfo?.avatar} shape="round"/>
|
<Avatar size="large" src={userInfo?.avatar} shape="round"/>
|
||||||
) : (
|
)
|
||||||
<Button className={'text-black'} open-type="getPhoneNumber" onGetPhoneNumber={handleGetPhoneNumber}>
|
}
|
||||||
<Avatar size="large" src={userInfo?.avatar} shape="round"/>
|
{
|
||||||
</Button>
|
!IsLogin && (
|
||||||
)
|
<Avatar size="large" src={userInfo?.avatar} shape="round"/>
|
||||||
}
|
)
|
||||||
<div className={'user-info flex flex-col px-2'}>
|
}
|
||||||
<div className={'py-1 text-black font-bold'}>{IsLogin ? userInfo?.mobile : '请点击头像登录'}</div>
|
<div className={'user-info flex flex-col px-2'}>
|
||||||
{IsLogin ? (
|
{IsLogin ? (
|
||||||
<Space className={'grade text-xs py-1'}>
|
<Space className={'grade text-xs py-1'}>
|
||||||
<Tag type="success" round>
|
<Tag type="warning" round>
|
||||||
<div className={'p-1'}>{'注册用户'}</div>
|
<div className={'p-1'}>{'注册用户'}</div>
|
||||||
</Tag>
|
</Tag>
|
||||||
{/*{*/}
|
{/*{*/}
|
||||||
{/* userInfo?.organizationName && (*/}
|
{/* userInfo?.organizationName && (*/}
|
||||||
{/* <Tag type="warning" round>*/}
|
{/* <Tag type="warning" round>*/}
|
||||||
{/* <div className={'p-1'}>{userInfo?.organizationName}</div>*/}
|
{/* <div className={'p-1'}>{userInfo?.organizationName}</div>*/}
|
||||||
{/* </Tag>*/}
|
{/* </Tag>*/}
|
||||||
{/* )*/}
|
{/* )*/}
|
||||||
{/*}*/}
|
{/*}*/}
|
||||||
</Space>
|
</Space>
|
||||||
) : ''}
|
) : ''}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className={'mx-4 text-sm px-3 py-1 text-white border-gray-200 border-solid border-2 rounded-3xl'}
|
||||||
|
onClick={() => navTo('/user/profile/profile', true)}>
|
||||||
|
{'个人资料'}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={'mx-4 text-sm px-3 py-1 text-black border-gray-400 border-solid border-2 rounded-3xl'}
|
</>
|
||||||
onClick={() => navTo('/user/profile/profile', true)}>
|
|
||||||
{'个人资料'}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default UserCard;
|
export default UserCard;
|
||||||
|
|||||||
@@ -2,16 +2,19 @@ import {Cell, InfiniteLoading} from '@nutui/nutui-react-taro'
|
|||||||
import navTo from "@/utils/common";
|
import navTo from "@/utils/common";
|
||||||
import UserFooter from "./UserFooter";
|
import UserFooter from "./UserFooter";
|
||||||
import Taro from '@tarojs/taro'
|
import Taro from '@tarojs/taro'
|
||||||
import {ArrowRight, ShieldCheck, Truck, LogisticsError} from '@nutui/icons-react-taro'
|
import {ArrowRight, Headphones} from '@nutui/icons-react-taro'
|
||||||
import {CSSProperties, useEffect, useState} from "react";
|
import {CSSProperties, useEffect} from "react";
|
||||||
|
|
||||||
const UserCell = () => {
|
const UserCell = () => {
|
||||||
const [roleName, setRoleName] = useState<string>('')
|
|
||||||
const InfiniteUlStyle: CSSProperties = {
|
const InfiniteUlStyle: CSSProperties = {
|
||||||
height: '88vh',
|
height: '88vh',
|
||||||
padding: '16px',
|
padding: '16px',
|
||||||
overflowY: 'auto',
|
overflowY: 'auto',
|
||||||
overflowX: 'hidden',
|
overflowX: 'hidden',
|
||||||
|
backgroundImage: 'url(https://oss.wsdns.cn/20250707/fc6234359d394788879ee64e27f76d2e.png?x-oss-process=image/resize,m_fixed,w_750/quality,Q_90)',
|
||||||
|
backgroundSize: 'cover',
|
||||||
|
backgroundRepeat: 'no-repeat',
|
||||||
|
backgroundPosition: 'bottom'
|
||||||
}
|
}
|
||||||
const onLogout = () => {
|
const onLogout = () => {
|
||||||
Taro.showModal({
|
Taro.showModal({
|
||||||
@@ -33,7 +36,7 @@ const UserCell = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setRoleName(Taro.getStorageSync('RoleCode'))
|
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -45,193 +48,18 @@ const UserCell = () => {
|
|||||||
className="nutui-cell-clickable"
|
className="nutui-cell-clickable"
|
||||||
title={
|
title={
|
||||||
<div style={{display: 'inline-flex', alignItems: 'center'}}>
|
<div style={{display: 'inline-flex', alignItems: 'center'}}>
|
||||||
<ShieldCheck size={16}/>
|
<Headphones size={16}/>
|
||||||
<span className={'pl-3 text-sm'}>实名认证</span>
|
<span className={'pl-3 text-sm'}>联系我们</span>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
align="center"
|
align="center"
|
||||||
extra={<ArrowRight color="#cccccc" size={18}/>}
|
extra={<ArrowRight color="#cccccc" size={18}/>}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
navTo('/user/userVerify/index', true)
|
Taro.navigateTo({url: '/pages/page/index?id=4355'})
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Cell.Group>
|
</Cell.Group>
|
||||||
{
|
|
||||||
(roleName === 'kuaidi' || roleName == 'zhandian') && (
|
|
||||||
<>
|
|
||||||
<Cell.Group divider={true}>
|
|
||||||
<Cell
|
|
||||||
className="nutui-cell-clickable"
|
|
||||||
title={
|
|
||||||
<div style={{display: 'inline-flex', alignItems: 'center'}}>
|
|
||||||
<ShieldCheck size={16}/>
|
|
||||||
<span className={'pl-3 text-sm'}>实名认证审核</span>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
align="center"
|
|
||||||
extra={<ArrowRight color="#cccccc" size={18}/>}
|
|
||||||
onClick={() => {
|
|
||||||
navTo('/user/userVerify/admin', true)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Cell.Group>
|
|
||||||
<Cell.Group divider={true}>
|
|
||||||
<Cell
|
|
||||||
className="nutui-cell-clickable"
|
|
||||||
title={
|
|
||||||
<div style={{display: 'inline-flex', alignItems: 'center'}}>
|
|
||||||
<Truck size={16}/>
|
|
||||||
<span className={'pl-3 text-sm'}>违章记录</span>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
align="center"
|
|
||||||
extra={<ArrowRight color="#cccccc" size={18}/>}
|
|
||||||
onClick={() => {
|
|
||||||
navTo('/hjm/violation/list', true)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Cell.Group>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
{
|
|
||||||
roleName === 'kuaidiyuan' && (
|
|
||||||
<>
|
|
||||||
<Cell.Group divider={true}>
|
|
||||||
<Cell
|
|
||||||
className="nutui-cell-clickable"
|
|
||||||
title={
|
|
||||||
<div style={{display: 'inline-flex', alignItems: 'center'}}>
|
|
||||||
<Truck size={16}/>
|
|
||||||
<span className={'pl-3 text-sm'}>车辆信息</span>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
align="center"
|
|
||||||
extra={<ArrowRight color="#cccccc" size={18}/>}
|
|
||||||
onClick={() => {
|
|
||||||
navTo('/user/car/index', true)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Cell.Group>
|
|
||||||
<Cell.Group divider={true}>
|
|
||||||
<Cell
|
|
||||||
className="nutui-cell-clickable"
|
|
||||||
title={
|
|
||||||
<div style={{display: 'inline-flex', alignItems: 'center'}}>
|
|
||||||
<LogisticsError size={16}/>
|
|
||||||
<span className={'pl-3 text-sm'}>报险记录</span>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
align="center"
|
|
||||||
extra={<ArrowRight color="#cccccc" size={18}/>}
|
|
||||||
onClick={() => {
|
|
||||||
navTo('/hjm/bx/bx', true)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Cell.Group>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
{
|
|
||||||
roleName === 'jiaojing' && (
|
|
||||||
<Cell.Group divider={true}>
|
|
||||||
<Cell
|
|
||||||
className="nutui-cell-clickable"
|
|
||||||
title={
|
|
||||||
<div style={{display: 'inline-flex', alignItems: 'center'}}>
|
|
||||||
<Truck size={16}/>
|
|
||||||
<span className={'pl-3 text-sm'}>违章记录</span>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
align="center"
|
|
||||||
extra={<ArrowRight color="#cccccc" size={18}/>}
|
|
||||||
onClick={() => {
|
|
||||||
navTo('/hjm/violation/list', true)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Cell.Group>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
{/*<Cell.Group divider={true} description={*/}
|
|
||||||
{/* <div style={{display: 'inline-flex', alignItems: 'center'}}>*/}
|
|
||||||
{/* <span style={{marginTop: '12px'}}>管理</span>*/}
|
|
||||||
{/* </div>*/}
|
|
||||||
{/*}>*/}
|
|
||||||
{/* <Cell*/}
|
|
||||||
{/* className="nutui-cell-clickable"*/}
|
|
||||||
{/* title={*/}
|
|
||||||
{/* <div style={{display: 'inline-flex', alignItems: 'center'}}>*/}
|
|
||||||
{/* <Presentation size={18}/>*/}
|
|
||||||
{/* <span style={{marginLeft: '5px'}}>分析</span>*/}
|
|
||||||
{/* </div>*/}
|
|
||||||
{/* }*/}
|
|
||||||
{/* align="center"*/}
|
|
||||||
{/* extra={<ArrowRight color="#cccccc" size={18}/>}*/}
|
|
||||||
{/* onClick={() => {*/}
|
|
||||||
{/* navTo('/bszx/bm-cert/bm-cert', true)*/}
|
|
||||||
{/* }}*/}
|
|
||||||
{/* />*/}
|
|
||||||
{/* <Cell*/}
|
|
||||||
{/* className="nutui-cell-clickable"*/}
|
|
||||||
{/* title={*/}
|
|
||||||
{/* <div style={{display: 'inline-flex', alignItems: 'center'}}>*/}
|
|
||||||
{/* <PickedUp size={18}/>*/}
|
|
||||||
{/* <span style={{marginLeft: '5px'}}>客户</span>*/}
|
|
||||||
{/* </div>*/}
|
|
||||||
{/* }*/}
|
|
||||||
{/* align="center"*/}
|
|
||||||
{/* extra={<ArrowRight color="#cccccc" size={18}/>}*/}
|
|
||||||
{/* onClick={() => {*/}
|
|
||||||
{/* navTo('/bszx/pay-log/pay-log', true)*/}
|
|
||||||
{/* }}*/}
|
|
||||||
{/* />*/}
|
|
||||||
{/* <Cell*/}
|
|
||||||
{/* className="nutui-cell-clickable"*/}
|
|
||||||
{/* title={*/}
|
|
||||||
{/* <div style={{display: 'inline-flex', alignItems: 'center'}}>*/}
|
|
||||||
{/* <Coupon size={18}/>*/}
|
|
||||||
{/* <span style={{marginLeft: '5px'}}>折扣</span>*/}
|
|
||||||
{/* </div>*/}
|
|
||||||
{/* }*/}
|
|
||||||
{/* align="center"*/}
|
|
||||||
{/* extra={<ArrowRight color="#cccccc" size={18}/>}*/}
|
|
||||||
{/* onClick={() => {*/}
|
|
||||||
{/* navTo('/user/profile/profile', true)*/}
|
|
||||||
{/* }}*/}
|
|
||||||
{/* />*/}
|
|
||||||
{/*</Cell.Group>*/}
|
|
||||||
{/*<Cell.Group divider={true} description={*/}
|
|
||||||
{/* <div style={{display: 'inline-flex', alignItems: 'center'}}>*/}
|
|
||||||
{/* <span style={{marginTop: '12px'}}>设置与帮助</span>*/}
|
|
||||||
{/* </div>*/}
|
|
||||||
{/*}>*/}
|
|
||||||
{/* <Cell*/}
|
|
||||||
{/* className="nutui-cell-clickable"*/}
|
|
||||||
{/* title="店铺设置"*/}
|
|
||||||
{/* align="center"*/}
|
|
||||||
{/* extra={<ArrowRight color="#cccccc" size={18}/>}*/}
|
|
||||||
{/* onClick={() => Taro.navigateTo({url: '/website/modify'})}*/}
|
|
||||||
{/* />*/}
|
|
||||||
{/* <Cell*/}
|
|
||||||
{/* className="nutui-cell-clickable"*/}
|
|
||||||
{/* title="帮助中心"*/}
|
|
||||||
{/* align="center"*/}
|
|
||||||
{/* extra={<ArrowRight color="#cccccc" size={18}/>}*/}
|
|
||||||
{/* onClick={() => {*/}
|
|
||||||
{/* navTo('/user/profile/profile', true)*/}
|
|
||||||
{/* }}*/}
|
|
||||||
{/* />*/}
|
|
||||||
{/* <Cell*/}
|
|
||||||
{/* className="nutui-cell-clickable"*/}
|
|
||||||
{/* title="问题反馈"*/}
|
|
||||||
{/* align="center"*/}
|
|
||||||
{/* extra={<ArrowRight color="#cccccc" size={18}/>}*/}
|
|
||||||
{/* onClick={() => {*/}
|
|
||||||
{/* navTo('/user/profile/profile', true)*/}
|
|
||||||
{/* }}*/}
|
|
||||||
{/* />*/}
|
|
||||||
{/*</Cell.Group>*/}
|
|
||||||
<Cell.Group divider={true} description={
|
<Cell.Group divider={true} description={
|
||||||
<div style={{display: 'inline-flex', alignItems: 'center'}}>
|
<div style={{display: 'inline-flex', alignItems: 'center'}}>
|
||||||
<span style={{marginTop: '12px'}}>账号管理</span>
|
<span style={{marginTop: '12px'}}>账号管理</span>
|
||||||
@@ -244,13 +72,13 @@ const UserCell = () => {
|
|||||||
extra={<ArrowRight color="#cccccc" size={18}/>}
|
extra={<ArrowRight color="#cccccc" size={18}/>}
|
||||||
onClick={() => navTo('/user/profile/profile', true)}
|
onClick={() => navTo('/user/profile/profile', true)}
|
||||||
/>
|
/>
|
||||||
<Cell
|
{/*<Cell*/}
|
||||||
className="nutui-cell-clickable"
|
{/* className="nutui-cell-clickable"*/}
|
||||||
title="短信登录"
|
{/* title="短信登录"*/}
|
||||||
align="center"
|
{/* align="center"*/}
|
||||||
extra={<ArrowRight color="#cccccc" size={18}/>}
|
{/* extra={<ArrowRight color="#cccccc" size={18}/>}*/}
|
||||||
onClick={() => navTo('/passport/sms-login', true)}
|
{/* onClick={() => navTo('/passport/sms-login', true)}*/}
|
||||||
/>
|
{/*/>*/}
|
||||||
<Cell
|
<Cell
|
||||||
className="nutui-cell-clickable"
|
className="nutui-cell-clickable"
|
||||||
title="退出登录"
|
title="退出登录"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {Popup} from '@nutui/nutui-react-taro'
|
|||||||
import {UserParam} from "@/api/system/user/model";
|
import {UserParam} from "@/api/system/user/model";
|
||||||
import {Button} from '@nutui/nutui-react-taro'
|
import {Button} from '@nutui/nutui-react-taro'
|
||||||
import {Form, Input} from '@nutui/nutui-react-taro'
|
import {Form, Input} from '@nutui/nutui-react-taro'
|
||||||
import {Copyright, Version} from "@/utils/config";
|
import {Version} from "@/utils/config";
|
||||||
const UserFooter = () => {
|
const UserFooter = () => {
|
||||||
const [openLoginByPhone, setOpenLoginByPhone] = useState(false)
|
const [openLoginByPhone, setOpenLoginByPhone] = useState(false)
|
||||||
const [clickNum, setClickNum] = useState<number>(0)
|
const [clickNum, setClickNum] = useState<number>(0)
|
||||||
@@ -48,7 +48,7 @@ const UserFooter = () => {
|
|||||||
<>
|
<>
|
||||||
<div className={'text-center py-4 w-full text-gray-300'} onClick={onLoginByPhone}>
|
<div className={'text-center py-4 w-full text-gray-300'} onClick={onLoginByPhone}>
|
||||||
<div className={'text-xs text-gray-400 py-1'}>当前版本:{Version}</div>
|
<div className={'text-xs text-gray-400 py-1'}>当前版本:{Version}</div>
|
||||||
<div className={'text-xs text-gray-400 py-1'}>Copyright © { new Date().getFullYear() } {Copyright}</div>
|
{/*<div className={'text-xs text-gray-400 py-1'}>Copyright © { new Date().getFullYear() } {Copyright}</div>*/}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Popup
|
<Popup
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ function User() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
}, []);
|
}, []);
|
||||||
return (
|
return (
|
||||||
<div className="mobile-container">
|
<div style={{ backgroundColor: '#ffefef', height: '100vh'}}>
|
||||||
<div className={'fixed w-full'}>
|
<div className={'fixed w-full'}>
|
||||||
<UserCard />
|
<UserCard />
|
||||||
<UserCell />
|
<UserCell />
|
||||||
|
|||||||