消息和积分ui

master
blak-kong 2 years ago
parent efe3f31f6c
commit 11bcd78cfe

@ -4,7 +4,27 @@ module.exports = {
},
defineConstants: {
},
mini: {},
mini: {
webpackChain: (chain, webpack) => {
chain.merge({
plugin: {
install: {
plugin: require('terser-webpack-plugin'),
args: [
{
terserOptions: {
compress: true, // 默认使用terser压缩
// mangle: false,
keep_classnames: true, // 不改变class名称
keep_fnames: true, // 不改变函数名称
},
},
],
},
},
})
},
},
h5: {
esnextModules: ['taro-ui']
}

@ -10,7 +10,8 @@ const config = {
sourceRoot: 'src',
outputRoot: 'dist',
plugins: [
'@tarojs/plugin-html'
'@tarojs/plugin-html',
'taro-plugin-compiler-optimization'
],
defineConstants: {
},
@ -21,11 +22,22 @@ const config = {
}
},
framework: 'react',
compiler: 'webpack5',
compiler: {
type: 'webpack5',
// 依赖预编译配置
prebundle: {
enable: true
}
},
cache: {
enable: false // Webpack 持久化缓存配置建议开启。默认配置请参考https://docs.taro.zone/docs/config-detail#cache
},
mini: {
enableExtract: true,
miniCssExtractPluginOption: {
//忽略css文件引入顺序
ignoreOrder: true
},
postcss: {
pxtransform: {
enable: true,
@ -40,13 +52,16 @@ const config = {
}
},
cssModules: {
enable: false, // 默认为 false如需使用 css modules 功能,则设为 true
enable: true, // 默认为 false如需使用 css modules 功能,则设为 true
config: {
namingPattern: 'module', // 转换模式,取值为 global/module
generateScopedName: '[name]__[local]___[hash:base64:5]'
}
}
}
},
optimizeMainPackage: {
enable: true,
},
},
h5: {
publicPath: '/',

601
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -58,7 +58,8 @@
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-redux": "^9.0.3",
"taro-ui": "^3.2.0"
"taro-ui": "^3.2.0",
"terser-webpack-plugin": "^5.3.9"
},
"devDependencies": {
"@babel/core": "^7.8.0",
@ -72,6 +73,7 @@
"@typescript-eslint/eslint-plugin": "^5.20.0",
"@typescript-eslint/parser": "^5.20.0",
"babel-preset-taro": "3.6.19",
"cache-loader": "^4.1.0",
"eslint": "^8.12.0",
"eslint-config-taro": "3.6.19",
"eslint-plugin-import": "^2.12.0",
@ -80,6 +82,8 @@
"postcss": "^8.4.18",
"react-refresh": "^0.11.0",
"stylelint": "9.3.0",
"taro-plugin-compiler-optimization": "^1.0.4",
"thread-loader": "^4.0.2",
"ts-node": "^10.9.1",
"typescript": "^4.1.0",
"webpack": "^5.78.0"

@ -14,6 +14,10 @@ export default defineAppConfig({
"pages/register/register",
'pages/instrument/instrument',
'pages/privacyPolicy/privacyPolicy',
'pages/about/about',
'pages/message/message',
'pages/consultant/consultant',
'pages/integral_list/integral_list',
'pages/template/template',
],
"tabBar": {
@ -55,6 +59,10 @@ export default defineAppConfig({
},
]
},
usingComponents: {
},
lazyCodeLoading: 'requiredComponents',
window: {
backgroundTextStyle: 'light',
navigationStyle: 'custom',

@ -130,3 +130,15 @@ page {
.van-popup {
z-index: 10001 !important;
}
.van-toast__container {
background: #333;
border-radius: 10rpx;
z-index: 10003 !important;
}
page {
fontfamily: -appleSystem, BlinkMacSystemFont, "Helvetica Neue", Helvetica,
Segoe UI, Arial, Roboto, "PingFang SC", "miui", "Hiragino Sans GB",
"Microsoft Yahei", sansSerif;
}

@ -6,14 +6,23 @@ import "./app.less";
// import "@tarojs/taro/html5.css";
import Taro from "@tarojs/taro";
import { go } from "./utils/traoAPI";
import { Provider } from "react-redux";
import store from "./store";
import "@antmjs/vantui/es/index.less";
import "taro-ui/rn/style/components/icon.scss";
import "@antmjs/vantui/es/datetime-picker/index.less";
import "@antmjs/vantui/es/popup/index.less";
import "@antmjs/vantui/es/dialog/index.less";
import "@antmjs/vantui/es/transition/index.less";
import "@antmjs/vantui/es/overlay/index.less";
import "@antmjs/vantui/es/nav-bar/index.less";
import "@antmjs/vantui/es/toast/index.less";
import "@antmjs/vantui/es/picker/index.less";
import "@antmjs/vantui/es/picker-column/index.less";
import "@antmjs/vantui/es/style/base.less";
class App extends Component<PropsWithChildren> {
// 可以使用所有的 React 生命周期方法
componentDidMount() {}
@ -25,10 +34,6 @@ class App extends Component<PropsWithChildren> {
return;
}
const isFirst = Taro.getStorageSync("isWelcome");
if (!isFirst) {
go("/pages/initiate/initiate");
}
// Taro.switchTab({
// url: "pages/index/index",
// });

@ -25,18 +25,23 @@
justify-content: space-between;
align-items: center;
background: #fff;
padding-bottom: 10rpx;
z-index: 99;
.logo {
display: inline-flex;
align-items: center;
justify-content: center;
width: 220rpx;
font-size: 32rpx;
font-weight: bold;
}
.back {
width: 80rpx;
padding: 20rpx 0;
text-align: center;
color: #666;
font-size: 42rpx;
display: flex;
justify-content: center;
}
}

@ -1,10 +1,11 @@
import { Component } from "react";
import Taro from "@tarojs/taro";
import { Block, View, Text, Image } from "@tarojs/components";
import { back } from "../../utils/traoAPI";
import "./navbar.less";
import { Block, View, Text, Image, Input, Button } from "@tarojs/components";
import { back } from "../../utils/traoAPI";
export default class Navbar extends Component<any, any> {
constructor(props) {
super(props);
@ -59,7 +60,7 @@ export default class Navbar extends Component<any, any> {
}
render() {
let { isBack } = this.props;
let { isBack, leftSlot, titleSlot } = this.props;
let { statusBarHeight, navigationBarHeight, navHeight } = this.state;
const statusBarHeightRpx = statusBarHeight * 2;
const navigationBarHeightRpx = navigationBarHeight * 2;
@ -77,13 +78,19 @@ export default class Navbar extends Component<any, any> {
<View className="back">
{isBack && (
<View
// style="padding: 10rpx"
className="at-icon at-icon-chevron-left"
onClick={this.back}
></View>
)}
{leftSlot}
</View>
<View className="logo">
<Image src="https://oss.flossom.com/logo2.png" mode="widthFix" />
{titleSlot ? (
titleSlot
) : (
<Image src="https://oss.flossom.com/logo2.png" mode="widthFix" />
)}
</View>
<View className="back"></View>
</View>

@ -19,6 +19,8 @@
.alert-popup-content {
font-size: 28rpx;
margin-bottom: 20rpx;
max-height: 600rpx;
overflow-y: auto;
}
.alert-popup-content.is-alert {
@ -48,12 +50,14 @@
background-color: #000;
}
// .alert-popup-btn:first-child {
// margin-left: 22rpx;
// background-color: transparent;
// }
.pupup-close {
position: absolute;
right: 30rpx;
top: 30rpx;
color: #000;
font-size: 36rpx;
}
// .confirm-popup-btn:last-child {
// color: #fff;
// background-color: #000;
// }
.text-left {
text-align: left;
}

@ -1,28 +1,18 @@
import classnames from "classnames";
import { Component } from "react";
import {
Block,
View,
Text,
Image,
Input,
Button,
PageMeta,
} from "@tarojs/components";
import { Block, View, Button, PageMeta } from "@tarojs/components";
import { Popup } from "@antmjs/vantui";
import "@antmjs/vantui/lib/popup/index.less";
import "@antmjs/vantui/lib/transition/index.less";
import "@antmjs/vantui/lib/overlay/index.less";
import "./popup-alert.less";
import "./popup.less";
import { go } from "../../utils/traoAPI";
/*** props
* isLarge
* isShow
* isClose
* title
* content
* confirmButtonText
@ -49,6 +39,10 @@ export default class PopupAlert extends Component<any, any> {
async initData() {}
onClose = () => {
this.props.close();
};
onConfirm = () => {
let { type } = this.props;
@ -65,21 +59,40 @@ export default class PopupAlert extends Component<any, any> {
};
render() {
let { title, content, confirmButtonText, textAlgin } = this.props;
let {
title,
content,
confirmButtonText,
textAlgin,
isShow,
isClose,
isLarge,
} = this.props;
return (
<Block>
<PageMeta pageStyle={this.props.isShow ? "overflow: hidden;" : ""} />
<PageMeta pageStyle={isShow ? "overflow: hidden;" : ""} />
<Popup
show={this.props.isShow}
show={isShow}
closeOnClickOverlay={false}
round
overlayStyle="width: 100vw;padding: 0;"
onClick={this.onClickStop}
>
<View className="alert-box">
<View className="alert-popup-title">{title}</View>
<View className="alert-popup-content-box">
{isClose && (
<View
className="at-icon at-icon-close common-close"
onClick={this.onClose}
></View>
)}
<View
className={classnames("common-box", {
large: isLarge,
})}
>
<View className="common-popup-title">{title}</View>
<View className="common-popup-content-box">
<View
className={classnames("alert-popup-content", {
className={classnames("common-popup-content", {
"text-left": textAlgin === "left",
"text-right": textAlgin === "right",
"text-center": textAlgin === "center",
@ -88,8 +101,8 @@ export default class PopupAlert extends Component<any, any> {
{content}
</View>
</View>
<View className="alert-popup-btns">
<Button className="alert-popup-btn" onClick={this.onConfirm}>
<View className="common-popup-btns">
<Button className="common-popup-btn" onClick={this.onConfirm}>
{confirmButtonText}
</Button>
</View>

@ -19,6 +19,8 @@
.confirm-popup-content {
font-size: 28rpx;
margin-bottom: 20rpx;
max-height: 600rpx;
overflow-y: auto;
}
.confirm-popup-content.is-confirm {
@ -55,3 +57,11 @@
color: #fff;
background-color: #000;
}
.pupup-close {
position: absolute;
right: 30rpx;
top: 30rpx;
color: #000;
font-size: 36rpx;
}

@ -1,34 +1,23 @@
import classnames from "classnames";
import { Component } from "react";
import {
Block,
View,
Text,
Image,
Input,
Button,
PageMeta,
} from "@tarojs/components";
import { Block, View, Button, PageMeta } from "@tarojs/components";
import { Popup } from "@antmjs/vantui";
// import "@antmjs/vantui/lib/index.less";
import "@antmjs/vantui/lib/popup/index.less";
import "@antmjs/vantui/lib/transition/index.less";
import "@antmjs/vantui/lib/overlay/index.less";
import "./popup-confirm.less";
import "./popup.less";
/*** props
* isLarge
* isShow
* isClose
* title
* content
* cancelButtonText
* confirmButtonText
* textAlgin left right center
* type: 1
* @confirm
* @close
* @confirm
* ***/
export default class PopupConfirm extends Component<any, any> {
constructor(props) {
@ -71,23 +60,43 @@ export default class PopupConfirm extends Component<any, any> {
};
render() {
let { title, content, cancelButtonText, confirmButtonText, textAlgin } =
this.props;
let {
title,
content,
cancelButtonText,
confirmButtonText,
textAlgin,
isShow,
isClose,
isLarge,
} = this.props;
return (
<Block>
<PageMeta pageStyle={this.props.isShow ? "overflow: hidden;" : ""} />
<PageMeta pageStyle={isShow ? "overflow: hidden;" : ""} />
<Popup
show={this.props.isShow}
show={isShow}
closeOnClickOverlay={false}
round
overlayStyle="width: 100vw;padding: 0;"
// onClose={this.onClose}
onClick={this.onClickStop}
>
<View className="confirm-box">
<View className="confirm-popup-title">{title}</View>
<View className="confirm-popup-content-box">
{isClose && (
<View
className="at-icon at-icon-close common-close"
onClick={this.onClose}
></View>
)}
<View
className={classnames("common-box", {
large: isLarge,
})}
>
<View className="common-popup-title">{title}</View>
<View className="common-popup-content-box">
<View
className={classnames("alert-popup-content", {
className={classnames("common-popup-content", {
"text-left": textAlgin === "left",
"text-right": textAlgin === "right",
"text-center": textAlgin === "center",
@ -96,11 +105,11 @@ export default class PopupConfirm extends Component<any, any> {
{content}
</View>
</View>
<View className="confirm-popup-btns">
<Button className="confirm-popup-btn" onClick={this.onClose}>
<View className="common-popup-btns">
<Button className="common-popup-btn2" onClick={this.onClose}>
{cancelButtonText}
</Button>
<Button className="confirm-popup-btn" onClick={this.onConfirm}>
<Button className="common-popup-btn2" onClick={this.onConfirm}>
{confirmButtonText}
</Button>
</View>

@ -0,0 +1,11 @@
.common-popup-btn {
width: 690rpx;
height: 90rpx;
line-height: 90rpx;
font-size: 30rpx;
text-align: center;
border: 1rpx solid #000;
border-radius: 45rpx;
color: #fff;
background: #000000;
}

@ -0,0 +1,108 @@
import classnames from "classnames";
import { Component } from "react";
import { Block, View, Button, PageMeta } from "@tarojs/components";
import { Popup } from "@antmjs/vantui";
import "./popup.less";
import "./popup-drawer.less";
/*** props
* isLarge
* isShow
* isClose
* postion left right top bottom
* title
* content
* confirmButtonText
* textAlgin left right center
* @confirm
* ***/
export default class PopupDrawer extends Component<any, any> {
constructor(props) {
super(props);
this.state = {
name: "抽屉组件",
};
}
async onLoad() {}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
async initData() {}
onClose = () => {
this.props.close();
};
onConfirm = () => {
this.props.confirm();
};
onClickStop = (e) => {
e.stopPropagation();
};
render() {
let {
title,
content,
confirmButtonText,
textAlgin,
isShow,
isClose,
isLarge,
postion,
} = this.props;
return (
<Block>
<PageMeta pageStyle={isShow ? "overflow: hidden;" : ""} />
<Popup
show={isShow}
closeOnClickOverlay={false}
position={postion || "bottom"}
round
overlayStyle="width: 100vw;padding: 0;"
onClick={this.onClickStop}
>
{isClose && (
<View
className="at-icon at-icon-close common-close"
onClick={this.onClose}
></View>
)}
<View
className={classnames("common-box", {
large: isLarge,
})}
>
<View className="common-popup-title">{title}</View>
<View className="common-popup-content-box">
<View
className={classnames("common-popup-content", {
"text-left": textAlgin === "left",
"text-right": textAlgin === "right",
"text-center": textAlgin === "center",
})}
>
{content}
</View>
</View>
<View className="common-popup-btns">
<Button className="common-popup-btn" onClick={this.onConfirm}>
{confirmButtonText}
</Button>
</View>
</View>
</Popup>
</Block>
);
}
}

@ -55,3 +55,11 @@
color: #fff;
background-color: #000;
}
.pupup-close {
position: absolute;
right: 30rpx;
top: 30rpx;
color: #000;
font-size: 36rpx;
}

@ -1,24 +1,21 @@
import classnames from "classnames";
import { Component } from "react";
import Taro from "@tarojs/taro";
import {
Block,
View,
Text,
Image,
Input,
Button,
PageMeta,
} from "@tarojs/components";
import { Block, View, Button, PageMeta } from "@tarojs/components";
import { Popup } from "@antmjs/vantui";
// import "@antmjs/vantui/lib/index.less";
import "@antmjs/vantui/lib/popup/index.less";
import "@antmjs/vantui/lib/transition/index.less";
import "@antmjs/vantui/lib/overlay/index.less";
import "./popup.less";
import "./popup-privacy.less";
import { go } from "../../utils/traoAPI";
/*** props
* isLarge
* isShow
* isClose
* @closePrivacy
* ***/
export default class PopupPrivacy extends Component<any, any> {
constructor(props) {
@ -34,15 +31,7 @@ export default class PopupPrivacy extends Component<any, any> {
componentWillUnmount() {}
componentDidShow() {
// 是否已授权隐私
// if (Taro.getStorageSync("isPrivacyPopup") !== "true") {
// // this.setState({
// // showPrivacyPopup: true,
// // });
// this.props.closePrivacy();
// }
}
componentDidShow() {}
componentDidHide() {}
@ -53,6 +42,7 @@ export default class PopupPrivacy extends Component<any, any> {
};
onPrivacyTap = () => {
// 跳转用户隐私协议
go("/pages/privacyPolicy/privacyPolicy");
};
onDisagreeTap = () => {
// 关闭小程序
@ -79,43 +69,53 @@ export default class PopupPrivacy extends Component<any, any> {
};
render() {
let { isShow, isClose, isLarge } = this.props;
return (
<Block>
<PageMeta
pageStyle={this.props.isShowPrivacyPopup ? "overflow: hidden;" : ""}
/>
<PageMeta pageStyle={isShow ? "overflow: hidden;" : ""} />
<Popup
show={this.props.isShowPrivacyPopup}
show={isShow}
closeOnClickOverlay={false}
round
overlayStyle="width: 100vw;padding: 0;"
// onClose={this.onClose}
onClick={this.onClickStop}
>
<View className="privacy-box">
<View className="privacy-popup-title"></View>
<View className="privacy-popup-content-box">
<View className="privacy-popup-content">
{isClose && (
<View
className="at-icon at-icon-close common-close"
onClick={this.onClose}
></View>
)}
<View
className={classnames("common-box", {
large: isLarge,
})}
>
<View className="common-popup-title"></View>
<View className="common-popup-content-box">
<View className="common-popup-content">
使FLOSSOM使
</View>
<View
className="privacy-popup-content is-privacy"
className="common-popup-content is-common"
onClick={this.onPrivacyTap}
>
</View>
<View className="privacy-popup-content is-last">
<View className="common-popup-content is-last">
使使
</View>
</View>
<View className="privacy-popup-btns">
<View className="common-popup-btns">
<Button
className="privacy-popup-btn"
className="common-popup-btn2"
onClick={this.onDisagreeTap}
>
退
</Button>
<Button
className="privacy-popup-btn"
className="common-popup-btn2"
openType="agreePrivacyAuthorization"
onAgreePrivacyAuthorization={
this.handleAgreePrivacyAuthorization

@ -0,0 +1,85 @@
@import "@antmjs/vantui/lib/popup/index.less";
@import "@antmjs/vantui/lib/transition/index.less";
@import "@antmjs/vantui/lib/overlay/index.less";
.large {
width: 670rpx;
}
.common-box {
padding: 38rpx 30rpx;
padding-bottom: 40rpx;
box-sizing: border-box;
.common-popup-title {
font-size: 36rpx;
font-weight: 700;
text-align: center;
color: #000;
}
}
.common-popup-content-box {
margin-top: 60rpx;
}
.common-popup-content {
font-size: 28rpx;
margin-bottom: 20rpx;
max-height: 600rpx;
overflow-y: auto;
}
.common-popup-content.is-common {
color: #41a9fc;
text-decoration: underline;
}
.common-popup-content.is-last {
margin-bottom: 0;
}
.common-popup-btns {
display: flex;
margin-top: 76rpx;
justify-content: center;
}
.common-popup-btn {
width: 480rpx;
height: 80rpx;
line-height: 80rpx;
font-size: 30rpx;
text-align: center;
border: 1rpx solid #000;
border-radius: 40rpx;
color: #fff;
background-color: #000;
}
.common-popup-btn2 {
width: 240rpx;
height: 80rpx;
line-height: 80rpx;
font-size: 30rpx;
text-align: center;
border: 1rpx solid #000;
border-radius: 40rpx;
}
.common-popup-btn2:first-child {
margin-left: 22rpx;
background-color: transparent;
}
.common-popup-btn2:last-child {
color: #fff;
background-color: #000;
}
.common-close {
position: absolute;
right: 36rpx;
top: 36rpx;
color: #000;
font-size: 36rpx;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

@ -0,0 +1,16 @@
page {
background: #f3f3f3;
}
.cell {
border-bottom: 1px solid #f3f3f3;
background: #fff;
padding: 30rpx;
font-size: 28rpx;
}
.cell .label {
color: #323232;
}
.cell .value {
color: #a19fa2;
}

@ -0,0 +1,50 @@
import { Component, PropsWithChildren, useEffect, useState } from "react";
import Taro from "@tarojs/taro";
import { Block, View, Text } from "@tarojs/components";
import Navbar from "../../components/navbar/navbar";
import { GetAboutUs } from "../../utils/Interface";
import "./about.less";
export default class About extends Component<any, any> {
constructor(props) {
super(props);
this.state = {
name: "更多设置",
version: "",
};
}
async onLoad() {
this.initData();
}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
async initData() {
let res = await GetAboutUs();
if (res.data.code === 200) {
this.setState({ version: res.data.data.value });
}
}
render() {
let { version } = this.state;
return (
<Block>
<Navbar titleSlot="更多设置" isBack={true} />
<View className="cell flex aitems sb" style="margin-top:20rpx;">
<View className="label"></View>
<View className="value">{version}</View>
</View>
</Block>
);
}
}

@ -0,0 +1,10 @@
.img {
width: 100%;
position: relative;
}
.tip {
color: #666666;
font-size: 30rpx;
margin: 50rpx 0;
text-align: center;
}

@ -0,0 +1,54 @@
import { Component, PropsWithChildren, useEffect, useState } from "react";
import Taro from "@tarojs/taro";
import { Block, View, Text, Image, Input, Button } from "@tarojs/components";
import Navbar from "../../components/navbar/navbar";
import "./consultant.less";
import { getContactWorker } from "../../utils/Interface";
export default class Consultant extends Component<any, any> {
constructor(props) {
super(props);
this.state = {
name: "consultant",
pictureUrl: "",
};
}
async onLoad() {
this.initData();
}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
async initData() {
let res = await getContactWorker();
console.log("initData", res);
if (res.data.code === 200) {
this.setState({ pictureUrl: res.data.data.pictureUrl });
}
}
render() {
const { pictureUrl } = this.state;
return (
<Block>
<Navbar titleSlot="联系客服" isBack={true} />
<View className="img">
<Image
src={pictureUrl}
show-menu-by-longpress
mode="widthFix"
></Image>
</View>
</Block>
);
}
}

@ -65,7 +65,7 @@ export default class Entry extends Component<any, any> {
Taro.getStorageSync("MpSplashDetail_type1") || undefined;
if (MpSplashDetail_type1) {
let detail = JSON.parse(MpSplashDetail_type1);
let list = detail.filter((item: any) => item.fileSuffix === "page");
let list = detail.filter((item: any) => item.fileSuffix === "images");
let welcomeList = list.map((item) => {
return {
image: item.fileUrl,

@ -1,20 +1,8 @@
import { MpSplashDetail, WCUserLogin } from "../../utils/Interface";
import { Component, PropsWithChildren, useEffect, useState } from "react";
import Taro from "@tarojs/taro";
// 引入 Swiper, SwiperItem 组件
import {
View,
Text,
Image,
Video,
Swiper,
SwiperItem,
} from "@tarojs/components";
import "taro-ui/dist/style/components/button.scss"; // 按需引入
import "./template.less";
const app = Taro.getApp();
import { View, Text, Image } from "@tarojs/components";
import "./errorpage.less";
export default class Index extends Component<any, any> {
constructor(props) {

@ -9,52 +9,28 @@ page {
color: transparent;
}
.titlemain {
position: fixed;
z-index: 99;
width: 100%;
top: 0;
/* box-shadow: 0px 1.5px 6px rgba(0, 0, 0, 0.16) */
}
.titlemain .logoicon {
width: 223rpx;
}
.titlemain .logoicon image {
border-radius: 0;
}
.titlemain .title {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 32rpx;
}
.titlemain .message {
.message {
position: relative;
width: 40rpx;
}
height: 40rpx;
image {
width: 40rpx;
height: 40rpx;
}
.titlemain .right_seat {
width: 40rpx;
.tip {
position: absolute;
top: -6rpx;
right: -12rpx;
width: 12rpx;
height: 12rpx;
background: #eb5858;
border-radius: 50%;
}
}
.titlemain .message image {
.right_seat {
width: 40rpx;
height: 40rpx;
}
.titlemain .message .tip {
position: absolute;
top: -6rpx;
right: -12rpx;
width: 12rpx;
height: 12rpx;
background: #eb5858;
border-radius: 50%;
}
.infobox4 {

@ -15,10 +15,11 @@ import PopupPrivacy from "../../components/popup/popup-privacy";
import PopupAlert from "../../components/popup/popup-alert";
import type CustomTabBar from "../../custom-tab-bar";
import Navbar from "../../components/navbar/navbar";
import RegisterModal from "../../components/modal/registerModal/registerModal";
/** 自定义组件 **/
import { GetUserMobile, RefreshWxUserInfo } from "../../utils/Interface";
import { Toast } from "@antmjs/vantui";
import { RefreshWxUserInfo, GetNoReadMessageNum } from "../../utils/Interface";
// css引入
import "taro-ui/rn/style/components/calendar.scss";
@ -46,7 +47,7 @@ class Index extends Component<any, any> {
},
list: [],
params: "",
messagecount: 0,
messageCount: Taro.getStorageSync("messageCount") || 0,
offlineDialogType: 1, //1离线弹窗 2升级弹窗
offlineDialogForce: 0, //0可选是否升级 1强制升级
versioninfo: {}, //仪器版本号,
@ -55,10 +56,16 @@ class Index extends Component<any, any> {
currentDate: dayjs().format("YYYY-MM-DD"),
isNotRegister: false, // 是否未注册
isDev: false, // 正在开发提示
};
}
async onLoad() {
const isFirst = Taro.getStorageSync("isWelcome");
if (!isFirst) {
go("/pages/initiate/initiate");
}
const menu = Taro.getMenuButtonBoundingClientRect();
this.setState({ menu });
}
@ -79,16 +86,26 @@ class Index extends Component<any, any> {
showInit() {
const isFirst = Taro.getStorageSync("isWelcome");
if (isFirst) {
// this.RefreshWxUserInfo();
this.checkShowPrivacyPopup();
this.GetNoReadMessageNum(); // 查询是否有消息
this.RefreshWxUserInfo();
}
}
// 检测是否弹出隐私协议
checkShowPrivacyPopup() {
const isPrivacy = Taro.getStorageSync("isPrivacy");
if (isPrivacy !== "true") {
Taro.getPrivacySetting({
success: (res) => {
console.log(res); // 返回结果为: res = { needAuthorization: true/false, privacyContractName: '《xxx隐私保护指引》' }
// console.log(res); // 返回结果为: res = { needAuthorization: true/false, privacyContractName: '《xxx隐私保护指引》' }
if (res.needAuthorization) {
// 需要弹出隐私协议
const isPrivacyPopup = Taro.getStorageSync("isPrivacyPopup");
if (!isPrivacyPopup) {
// 隐私确认弹窗
this.setState({ isShowPrivacyPopup: true });
Taro.setStorageSync("isPrivacy", "true");
}
} else {
// 用户已经同意过隐私协议,所以不需要再弹出隐私协议,也能调用隐私接口
@ -100,8 +117,7 @@ class Index extends Component<any, any> {
}
}
getUserInfo() {}
// 刷新用户信息
RefreshWxUserInfo = async () => {
let res = await RefreshWxUserInfo();
if (res.data.code === 200) {
@ -109,13 +125,24 @@ class Index extends Component<any, any> {
}
};
GetNoReadMessageNum = async () => {
let res = await GetNoReadMessageNum();
if (res.data.code === 200) {
console.log("GetNoReadMessageNum", res);
Taro.setStorageSync("messageCount", res.data.data);
}
};
goRegister() {
go("/pages/register/register");
}
// 新增设备
addNewDevice = () => {
this.isRegister();
if (this.isRegister()) {
// todo
go("/pages/instrument/instrument");
}
};
@ -142,12 +169,13 @@ class Index extends Component<any, any> {
};
public alertRegister = () => {
if (!this.props.mobile) {
this.setState({ isNotRegister: true }); // 打开弹窗
return;
} else {
go("/pages/instrument/instrument");
}
this.setState({ isNotRegister: true }); // 打开弹窗
// if (!this.props.mobile) {
// this.setState({ isNotRegister: true }); // 打开弹窗
// return;
// } else {
// go("/pages/instrument/instrument");
// }
};
onTimeChange = (value) => {
@ -157,18 +185,33 @@ class Index extends Component<any, any> {
// 护理记录
toNursingRecords = () => {
this.setState({ isNotRegister: true }); // 打开弹窗
if (this.isRegister()) {
// todo
this.setState({ isDev: true });
}
};
gourl = (e) => {
const { url } = e.currentTarget.dataset;
if (this.isRegister()) {
go(url);
}
};
closeDev = () => {
this.setState({ isDev: false });
};
render() {
let { currentDate, isShowPrivacyPopup, isNotRegister } = this.state;
let {
currentDate,
isShowPrivacyPopup,
isNotRegister,
messagecount,
isDev,
} = this.state;
return (
<Block>
{/* {isNotRegister ? <RegisterModal /> : ""} */}
<PopupAlert
isShow={isNotRegister}
title="提示"
@ -178,18 +221,43 @@ class Index extends Component<any, any> {
type="1"
confirm={this.closeAlert}
/>
<PopupAlert
isShow={isDev}
title="提示"
content="页面正在开发中"
confirmButtonText="确定"
textAlgin="center"
type="1"
confirm={this.closeDev}
/>
<PopupPrivacy
isShowPrivacyPopup={isShowPrivacyPopup}
isShow={isShowPrivacyPopup}
closePrivacy={this.closePrivacy}
/>
<Navbar></Navbar>
<Navbar
leftSlot={
<Block>
<View
className="message"
onClick={this.gourl}
data-url="/pages/message/message"
>
<Image
className="message-img"
src={require("../../img/index/message.png")}
mode="aspectFill"
></Image>
{messagecount ? <View className="tip"></View> : ""}
</View>
</Block>
}
></Navbar>
<View className="index">
<View className="date-title" onClick={this.toNursingRecords}>
<Text style={{ fontSize: "26rpx", color: "#666" }}></Text>
<View className="at-icon at-icon-chevron-right"></View>
</View>
<View className="bg-while">
{/* <Calendar2 userInfo={userInfo}></Calendar2> */}
<AtCalendar
hideArrow={true}
isSwiper={false}
@ -228,6 +296,7 @@ class Index extends Component<any, any> {
<View className="tips"></View>
</View>
</View>
<Toast id="toast"></Toast>
</Block>
);
}

@ -43,7 +43,7 @@
font-size: 40rpx;
font-weight: 500;
color: #ffffff;
line-height: 38rpx;
line-height: 60rpx;
text-align: center;
z-index: 100;
}

@ -12,6 +12,9 @@ import {
SwiperItem,
} from "@tarojs/components";
import { Toast } from "@antmjs/vantui";
const Toast_ = Toast.createOnlyToast();
/*** redux ***/
import { connect } from "react-redux";
import { setMobile } from "../../store/features/userInfo";
@ -85,6 +88,10 @@ class Initiate extends Component<any, any> {
url = bgObj.filePath;
this.setState({ url });
}
} else {
Toast_.fail({
message: "获取首页视频失败!",
});
}
}
@ -183,6 +190,8 @@ class Initiate extends Component<any, any> {
</SwiperItem>
</Swiper>
</View>
<Toast_ />
</Block>
);
}

@ -14,12 +14,7 @@ import {
ScrollView,
} from "@tarojs/components";
// import "@taroify/core/button/style";
// import "@taroify/core/navbar/style";
// import Button from "@taroify/core/button";
// import { Navbar } from "@taroify/core";
import { NavBar, Toast } from "@antmjs/vantui";
import { Toast } from "@antmjs/vantui";
import {
BuyPropertyList,
InstrumentBindingAdd,
@ -35,11 +30,11 @@ import { isVideo } from "../../utils/util";
import utilHtml from "../../utils/utilhtml";
const log = require("../../utils/log");
import Navbar from "../../components/navbar/navbar";
// import "taro-ui/dist/style/components/button.scss"; // 按需引入
import "./instrument.less";
const app = Taro.getApp();
export default class Instrument extends Component<any, any> {
constructor(props) {
super(props);
@ -300,12 +295,7 @@ export default class Instrument extends Component<any, any> {
let { isVideo, channelInfo, inputType, style, equipmentList } = this.state;
return (
<Block>
<NavBar
title="仪器绑定"
leftArrow
onClickLeft={() => Toast.show({ message: "点击按钮 返回" })}
onClickRight={() => Toast.show({ message: "点击按钮 right" })}
/>
<Navbar titleSlot="仪器绑定" isBack={true} />
<View></View>
<View className="main">
<View className="top">

@ -0,0 +1,165 @@
page {
background: #ffffff;
}
.infobox1 {
height: 320rpx;
border-radius: 30rpx;
position: relative;
overflow: hidden;
z-index: 9;
.point_bg {
position: absolute;
top: 0;
left: 0;
z-index: -1;
}
.info1 {
justify-content: flex-end;
position: absolute;
top: 20rpx;
right: 0rpx;
min-width: 193rpx;
height: 50rpx;
background: #ffffff;
border-radius: 25rpx 0rpx 0rpx 25rpx;
padding-right: 25rpx;
.tip1 {
padding-right: 23rpx;
font-size: 26rpx;
font-weight: 500;
color: #818181;
}
.icon {
width: 10rpx;
height: 20rpx;
}
}
.info2 {
text-align: center;
padding-top: 22rpx;
font-size: 72rpx;
font-weight: 600;
color: #000000;
}
.info3 {
text-align: center;
font-size: 26rpx;
font-weight: 500;
color: #000000;
padding-top: 55rpx;
}
.info4 {
margin: 30rpx auto 0;
text-align: center;
.tip1 {
font-weight: bold;
width: 210rpx;
height: 60rpx;
line-height: 60rpx;
background: #000000;
border-radius: 30rpx;
font-size: 26rpx;
font-weight: bold;
color: #ffffff;
}
.icon {
width: 30rpx;
}
}
}
.infobox2 {
.nodata {
width: 160rpx;
height: 160rpx;
margin: 0 auto;
margin-top: 310rpx;
.nodata_img {
margin-bottom: 34rpx;
}
}
.list_block {
width: 100%;
border-bottom: 2rpx solid #dddddd;
padding: 27rpx 0;
}
.list {
background: #fff;
padding: 0rpx 30rpx;
.left {
.tip1 {
font-size: 28rpx;
font-weight: 500;
color: #030000;
}
.tip2 {
margin-top: 14rpx;
font-size: 24rpx;
font-weight: 500;
color: #999999;
/*line-height: 36rpx;*/
}
}
.right {
font-size: 40rpx;
color: #adadad;
}
.rights {
font-size: 32rpx;
font-weight: 700;
color: #000000;
}
}
}
.popbox3 {
.title {
text-align: center;
padding: 38rpx 0;
font-size: 36rpx;
font-weight: bold;
color: #030000;
line-height: 60rpx;
}
.tipimg {
margin: 20rpx 28rpx 0;
}
.tiptext {
/* text-align: center;
color: #4E4E4E; */
margin-top: 4rpx;
padding: 0 20rpx;
/* font-size: 32rpx; */
max-height: 800rpx;
overflow-y: scroll;
}
.popbox3btn {
display: flex;
align-items: center;
justify-content: space-between;
.nextbtn {
background: #000000;
width: 270rpx;
height: 90rpx;
text-align: center;
color: #fff;
font-size: 32rpx;
line-height: 90rpx;
margin: 41rpx auto 44rpx;
border-radius: 45rpx;
font-weight: bold;
}
.prebtn {
width: 180rpx;
height: 60rpx;
text-align: center;
color: #d3bc8d;
font-size: 30rpx;
line-height: 60rpx;
margin: 50rpx auto 30rpx;
border-radius: 30rpx;
border: 1px solid #d3bc8d;
}
}
}

@ -0,0 +1,155 @@
import { Component, PropsWithChildren, useEffect, useState } from "react";
import Taro from "@tarojs/taro";
import { Block, View, Text, Image, RichText } from "@tarojs/components";
import "./integral_list.less";
/** 自定义组件 **/
import Navbar from "../../components/navbar/navbar";
/** 自定义组件 **/
import PopupAlert from "../../components/popup/popup-alert";
import { GetIntegralRule, GetObtainUserIntegral } from "../../utils/Interface";
export default class IntegralList extends Component<any, any> {
constructor(props) {
super(props);
this.state = {
name: "我的积分",
userinfo: {},
page: 1,
list: [],
isIntegral: false,
nodes: "",
pageNum: 1,
pageSize: 10,
};
}
async onLoad() {}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {
this.initData();
this.GetIntegralRule();
}
componentDidHide() {}
async initData() {
this.GetObtainUserIntegral();
}
GetObtainUserIntegral = async () => {
let { list, pageNum, pageSize } = this.state;
let res = await GetObtainUserIntegral({
pageNum,
pageSize,
});
console.log("GetObtainUserIntegral", res);
if (res.data.code === 200) {
if (res.data.rows.length) {
list = [].concat(list, res.data.rows);
this.setState({ list: list });
}
}
};
GetIntegralRule = async () => {
let res = await GetIntegralRule();
console.log("GetIntegralRule", res);
if (res.data.code === 200) {
this.setState({ nodes: res.data.data.value });
}
};
integralPopupShow = () => {
this.setState({ isIntegral: true });
};
navigateToMiniProgram = () => {};
integralPopupClose = () => {
this.setState({ isIntegral: false });
};
render() {
let { list, userinfo, isIntegral, nodes } = this.state;
return (
<Block>
<PopupAlert
isLarge={true}
isClose={true}
isShow={isIntegral}
title="积分规则"
content={<RichText nodes={nodes} />}
confirmButtonText="我知道了"
textAlgin="center"
close={this.integralPopupClose}
confirm={this.integralPopupClose}
></PopupAlert>
<Navbar titleSlot="我的积分" isBack={true}></Navbar>
<View style="background: #f3f3f3;padding: 33rpx 30rpx 31rpx;">
<View className="infobox1">
<View
className="info1 flex aitems"
onClick={this.integralPopupShow}
>
<View className="tip1"></View>
<View className="icon">
<Image
src={require("../../img/user/right.png")}
mode="aspectFill"
/>
</View>
</View>
<View className="info3"></View>
<View className="info2">{userinfo.credit2}</View>
<View className="info4 flex aitems jcenter">
<View className="tip1" onClick={this.navigateToMiniProgram}>
</View>
</View>
<Image
className="point_bg"
src={require("../../img/user/point-bg.png")}
mode="aspectFill"
></Image>
</View>
</View>
<View className="infobox2">
{list.length === 0 && (
<View className="nodata">
<Image
className="nodata_img"
src={require("../../img/user/points.png")}
mode="aspectFill"
></Image>
<View></View>
</View>
)}
{list.map((item: any, key: number) => {
return (
<View className="list" key={key}>
<View className="list_block flex aitems sb">
<View className="left">
<View className="tip1">{item.log}</View>
<View className="tip2">{item.addtime}</View>
</View>
<View className="rights" style={item.style}>
{item.credit}
</View>
</View>
</View>
);
})}
</View>
</Block>
);
}
}

@ -0,0 +1,54 @@
page {
background: #f3f3f3;
}
.infobox1 {
background: #fff;
border-radius: 30rpx;
margin: 20rpx 30rpx 0;
padding: 20rpx 34rpx 48rpx;
box-sizing: border-box;
.info1 {
.left {
.icon {
width: 80rpx;
height: 80rpx;
overflow: hidden;
border-radius: 50%;
}
.tip1 {
font-weight: bold;
margin-left: 28rpx;
font-size: 28rpx;
color: #000000;
}
}
.right {
font-size: 24rpx;
font-weight: 500;
color: #999999;
}
}
.info2 {
margin-top: 40rpx;
.content {
line-height: 50rpx;
font-size: 26rpx;
font-weight: 500;
color: #666666;
}
}
}
.no_message {
text-align: center;
margin-top: 200rpx;
& > .icon {
width: 200rpx;
margin: auto;
}
& > .tip {
text-align: center;
color: #666666;
font-size: 28rpx;
margin-top: 20rpx;
}
}

@ -0,0 +1,110 @@
import { MpSplashDetail, WCUserLogin } from "../../utils/Interface";
import { Component, PropsWithChildren, useEffect, useState } from "react";
import Taro from "@tarojs/taro";
import { Block, View, Text, Image, Button } from "@tarojs/components";
import "./message.less";
/** 自定义组件 **/
import Navbar from "../../components/navbar/navbar";
/** 自定义组件 **/
import { GetHasBeenRead, GetMessageList } from "../../utils/Interface";
export default class Message extends Component<any, any> {
constructor(props) {
super(props);
this.state = {
name: "message",
list: [],
pageNum: 1,
pageSize: 10,
};
}
async onLoad() {}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {
this.initData(); // 每次进入清空所有消息
}
componentDidHide() {}
async initData() {
this.GetHasBeenRead();
this.GetMessageList();
}
godetail = () => {};
// 获取消息分页
GetMessageList = async () => {
let { list } = this.state;
let res = await GetMessageList({
pageNum: this.state.pageNum,
pageSize: this.state.pageSize,
});
if (res.data.code === 200) {
if (res.data.rows.length) {
list = [].concat(list, res.data.rows);
this.setState({ list: list });
}
}
};
// 清除所有消息数
GetHasBeenRead = async () => {
let res = await GetHasBeenRead();
if (res.data.code === 200) {
Taro.setStorageSync("messageCount", res.data.data);
}
};
render() {
let { list } = this.state;
return (
<Block>
<Navbar isBack={true}></Navbar>
<View style="padding-top: 13rpx">
{list.map((item: any, key: number) => {
<Block>
<View
className="infobox1"
onClick={this.godetail}
data-item={item}
key={key}
>
<View className="info1 flex aitems sb">
<View className="left flex aitems">
<View className="icon">
<Image
src={require("../../img/logos.png")}
mode="aspectFill"
/>
</View>
<View className="tip1"></View>
</View>
<View className="right">{item.addtime}</View>
</View>
<View className="info2">
<View className="content">
<Text>
[]: {item.content ? item.content : ""}
</Text>
</View>
</View>
</View>
</Block>;
})}
</View>
<View style="height: 100rpx;"></View>
{list.length == 0 && <View className="nodata"></View>}
</Block>
);
}
}

@ -0,0 +1,10 @@
.nodes {
padding: 30rpx;
word-break: break-all;
box-sizing: border-box;
}
pre {
white-space: pre-wrap;
word-wrap: break-word;
}

@ -1,19 +1,10 @@
import { MpSplashDetail, WCUserLogin } from "../../utils/Interface";
import { Component, PropsWithChildren, useEffect, useState } from "react";
import Taro from "@tarojs/taro";
// 引入 Swiper, SwiperItem 组件
import {
View,
Text,
Image,
Video,
Swiper,
SwiperItem,
} from "@tarojs/components";
import { Block, View, RichText } from "@tarojs/components";
import "./privacyPolicy.less";
import Navbar from "../../components/navbar/navbar";
const app = Taro.getApp();
import "./privacyPolicy.less";
import { getPrivacyAgreement } from "../../utils/Interface";
@ -22,10 +13,12 @@ export default class PrivacyPolicy extends Component<any, any> {
super(props);
this.state = {
name: "隐私政策",
nodes: "",
};
}
async onLoad() {
this.initData();
}
componentDidMount() {}
@ -37,11 +30,27 @@ export default class PrivacyPolicy extends Component<any, any> {
initData = async () => {
let res = await getPrivacyAgreement();
console.log("getPrivacyAgreement", res);
if (res.data.code === 200) {
this.setState({ nodes: res.data.data.value });
}
};
render() {
let { name } = this.state;
return <View>{name}</View>;
let { nodes } = this.state;
return (
<Block>
<Navbar titleSlot="隐私政策" isBack={true} />
<View className="nodes">
<RichText
nodes={
"<pre style=' white-space: pre-wrap;word-wrap: break-word;'>" +
nodes +
"</pre>"
}
/>
</View>
</Block>
);
}
}

@ -81,24 +81,24 @@ export default class Register extends Component<any, any> {
this.onSkip();
};
checkPrivacy = () => {
const res = compareVersion("2.32.3");
if (res >= 0) {
// 弹出弹窗
Taro.getPrivacySetting({
success: (res) => {
if (res.needAuthorization) {
this.setState({
showPrivacyPopup: true,
});
app.globalData.needAuthorization = true;
}
},
fail: (err) => {},
complete: (res) => {},
});
}
};
// checkPrivacy = () => {
// const res = compareVersion("2.32.3");
// if (res >= 0) {
// // 弹出弹窗
// Taro.getPrivacySetting({
// success: (res) => {
// if (res.needAuthorization) {
// this.setState({
// showPrivacyPopup: true,
// });
// app.globalData.needAuthorization = true;
// }
// },
// fail: (err) => {},
// complete: (res) => {},
// });
// }
// };
onDisagreeTap = () => {
// 关闭小程序
@ -124,13 +124,6 @@ export default class Register extends Component<any, any> {
app.globalData.needAuthorization = false;
};
// getBg = async () => {
// const { data } = await MpLoginDetail();
// if (data.code === 200) {
// this.setState({ bg: data.data.data.image });
// }
// };
onCheck = () => {
const { isChecked } = this.state;
this.setState({ isChecked: !isChecked });
@ -139,7 +132,7 @@ export default class Register extends Component<any, any> {
onSubmit = async (event) => {
if (event.detail.errMsg !== "getPhoneNumber:ok") {
this.changeGetPhoneNumberBtn();
return msg("获取失败");
return msg("手机号获取失败");
}
const { code } = event.detail;
@ -149,7 +142,7 @@ export default class Register extends Component<any, any> {
if (res.data) {
const mobile = res.data.data;
Taro.setStorageSync("mobile", mobile);
msg("获取成功");
msg("注册成功");
this.changeGetPhoneNumberBtn();
}
} catch (error) {

@ -1,14 +1,9 @@
import { MpSplashDetail, WCUserLogin } from "../../utils/Interface";
import { Component, PropsWithChildren, useEffect, useState } from "react";
import Taro from "@tarojs/taro";
// 引入 Swiper, SwiperItem 组件
import { Block, View, Text, Image, Input, Button } from "@tarojs/components";
import "taro-ui/dist/style/components/button.scss"; // 按需引入
import "./template.less";
const app = Taro.getApp();
export default class Index extends Component<any, any> {
constructor(props) {
super(props);

@ -188,3 +188,31 @@ page {
font-weight: 500;
color: #000000;
}
.service-title {
display: flex;
justify-content: center;
font-size: 36rpx;
font-family: PingFang SC;
font-weight: bold;
color: #030000;
line-height: 60rpx;
}
.service-textarea {
// width: 690rpx;
display: flex;
height: 330rpx;
background: #ffffff;
border: 1px solid #dddddd;
border-radius: 3rpx;
padding: 38rpx 30rpx;
width: auto;
box-sizing: border-box;
}
.textarea-placeholder {
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 500;
color: #cccccc;
line-height: 60rpx;
}

@ -1,8 +1,13 @@
import { MpSplashDetail, WCUserLogin } from "../../utils/Interface";
import { SaveMessage } from "../../utils/Interface";
import { Component, PropsWithChildren, useEffect, useState } from "react";
import Taro from "@tarojs/taro";
// 引入 Swiper, SwiperItem 组件
import { View, Block, Text, Image } from "@tarojs/components";
import { View, Block, Textarea, Image } from "@tarojs/components";
import { Toast } from "@antmjs/vantui";
const Toast_ = Toast.createOnlyToast();
import { go, loading, msg } from "../../utils/traoAPI";
/*** redux ***/
import { connect } from "react-redux";
@ -14,7 +19,10 @@ import "./user.less";
import type CustomTabBar from "../../custom-tab-bar";
import Navbar from "../../components/navbar/navbar";
import RegisterModal from "../../components/modal/registerModal/registerModal";
import PopupAlert from "../../components/popup/popup-alert";
import PopupDrawer from "../../components/popup/popup-drawer";
class User extends Component<any, any> {
pageCtx = Taro.getCurrentInstance().page;
constructor(props) {
@ -22,9 +30,10 @@ class User extends Component<any, any> {
this.state = {
name: "user",
userinfo: {
mobile: this.props.mobile,
nickname: this.props.nickname,
headimg: this.props.headimg,
mobile: this.props.userInfo.mobile,
nickname: this.props.userInfo.nickname,
headimg: this.props.userInfo.headimg,
id: this.props.userInfo.id,
},
MerchMobile: "",
count: 0,
@ -32,6 +41,8 @@ class User extends Component<any, any> {
lastDay: "",
messagecount: 0,
isNotRegister: false, // 是否未注册
isShowCustomerService: false, // 反馈留言
messageInfo: "", // 用户留言
};
}
@ -49,6 +60,17 @@ class User extends Component<any, any> {
async initData() {}
postSaveMessage = async () => {
let { messageInfo } = this.state;
let params = {
source: 1,
messageInfo: messageInfo,
};
let res = await SaveMessage(params);
if (res.data.code === 200) {
}
};
gourl = (e) => {
let { userinfo } = this.state;
if (!userinfo.mobile) {
@ -56,10 +78,10 @@ class User extends Component<any, any> {
return;
}
let url = e.currentTarget.dataset.url;
if (url == "/pages/integral_list/integral_list") {
// this.CreditSubscribe(url);
return false;
}
// if (url == "/pages/integral_list/integral_list") {
// // this.CreditSubscribe(url);
// return false;
// }
Taro.navigateTo({
url,
});
@ -85,13 +107,49 @@ class User extends Component<any, any> {
});
}
showCustomerService = () => {
let { messageInfo } = this.state;
console.log("messageInfo", messageInfo);
this.setState({ isShowCustomerService: true });
};
confirmCustomerService = () => {
let { messageInfo } = this.state;
if (messageInfo.length) {
this.postSaveMessage();
this.closeCustomerService();
} else {
msg("留言内容不能为空!");
// Toast_.fail({
// message: "留言内容不能为空!",
// });
}
};
closeCustomerService = () => {
this.setState({ isShowCustomerService: false });
};
closeRegisterAlert = () => {
this.setState({ isNotRegister: false });
};
onInputTextarea = (e) => {
this.setState({ messageInfo: e.detail.value });
};
render() {
let { userinfo, count, lastDay, num, messagecount, isNotRegister } =
this.state;
let {
userinfo,
count,
lastDay,
num,
messagecount,
isNotRegister,
isShowCustomerService,
} = this.state;
return (
<Block>
{isNotRegister ? <RegisterModal /> : ""}
<Navbar></Navbar>
<View className="info_box">
<View className="infobox1">
@ -107,13 +165,13 @@ class User extends Component<any, any> {
<View className="name">
{userinfo.nickname
? userinfo.nickname
: "用户" + (userinfo.id || "")}
: "用户" + (userinfo.id || "001")}
</View>
</View>
{userinfo.id ? (
<View className="tip2"> :{userinfo.id}</View>
) : (
""
<View className="tip2"> : 001</View>
)}
</View>
</View>
@ -222,8 +280,7 @@ class User extends Component<any, any> {
</View>
<View
className="block flex aitems"
data-url="/pages/teasing/teasing"
onClick={this.gourls}
onClick={this.showCustomerService}
>
<View className="img">
<Image src={require("../../img/6.png")} mode="aspectFill" />
@ -242,7 +299,7 @@ class User extends Component<any, any> {
</View>
<View
className="block flex aitems"
data-url="/pages/xieyi1/xieyi1"
data-url="/pages/privacyPolicy/privacyPolicy"
onClick={this.gourls}
>
<View className="img">
@ -254,21 +311,45 @@ class User extends Component<any, any> {
</View>
</View>
{/* <View className="logo">
<Image
src="https://oss.flossom.com/miniapp/img/logo2.jpg"
mode="widthFix"
/>
</View> */}
<PopupAlert
isShow={isNotRegister}
title="提示"
content="暂未授权注册,请点击注册"
confirmButtonText="确定"
textAlgin="center"
type="1"
close={this.closeRegisterAlert}
confirm={this.closeRegisterAlert}
/>
<PopupDrawer
isShow={isShowCustomerService}
isClose={true}
title="留言反馈"
content={
<Block>
<Textarea
className="service-textarea"
maxlength={100}
showCount={true}
placeholder="请在此处写下您的意见与反馈"
onInput={this.onInputTextarea}
></Textarea>
</Block>
}
confirmButtonText="确定"
textAlgin="left"
close={this.closeCustomerService}
confirm={this.confirmCustomerService}
/>
<Toast_ />
</Block>
);
}
}
const mapStateToProps = (state) => ({
mobile: state.userInfo.mobile,
nickname: state.userInfo.nickname,
headimg: state.userInfo.headimg,
userInfo: state.userInfo,
});
const mapDispatchToProps = (dispatch) => ({
userRefresh(data) {

@ -33,7 +33,8 @@ import { getGlobalData, setGlobalData } from "../../utils/global";
import { loading, msg } from "../../utils/traoAPI";
import FormData from "../../utils/wx-formdata/formData";
const app = Taro.getApp();
// 仅注册成功后进入此页面
export default class UserInfo extends Component<any, any> {
constructor(props) {
super(props);
@ -72,6 +73,9 @@ export default class UserInfo extends Component<any, any> {
loading: true,
form: {
nickname: "", // 昵称
province: "",
city: "", // 市
area: "", // 县区
provinceId: "", // 省份
cityId: "", // 市
areaId: "", // 县区
@ -80,6 +84,8 @@ export default class UserInfo extends Component<any, any> {
// maxDate: new Date().getTime(),
// minDate: new Date("1949-10-01").getTime(),
minDate: new Date("1949-10-01").getTime(),
isSubmit: false, // 是否允许提交
};
}
@ -143,14 +149,15 @@ export default class UserInfo extends Component<any, any> {
UpdateUser = async () => {
let { form, userInfo } = this.state;
let formData = new FormData();
formData.append("province", form.province);
formData.append("city", form.city);
formData.append("area", form.area);
formData.append("provinceId", form.provinceId);
formData.append("cityId", form.cityId);
formData.append("areaId", form.areaId);
formData.append("birthday", userInfo.birthday);
formData.append("nickname", userInfo.nickname);
formData.appendFile("file", userInfo.headimg, "avatar.png");
console.log("form userInfo", form, userInfo);
// console.log("formData",formData.)
let data = formData.getData();
let res = await UpdateUser(data);
console.log("UpdateUser", res);
@ -162,7 +169,8 @@ export default class UserInfo extends Component<any, any> {
let { userInfo } = this.state;
userInfo.headimg = event.detail.avatarUrl;
this.setState({ userInfo });
console.log(this.state.userInfo);
this.isSubmitCheck();
};
onSubmit = async () => {
@ -241,6 +249,8 @@ export default class UserInfo extends Component<any, any> {
form.areaId = this.state.leve3region[index[2]].id;
this.setState({ form });
this.onCityCancel();
this.isSubmitCheck();
};
onCityCancel = () => {
@ -262,6 +272,7 @@ export default class UserInfo extends Component<any, any> {
};
onInputTimePicker = (event) => {
console.log("onInputDateTimePicker", event);
this.isSubmitCheck();
};
onTimePickerCancel = () => {
console.log("onTimePickerCancel");
@ -274,6 +285,8 @@ export default class UserInfo extends Component<any, any> {
this.setState({ userInfo });
}
this.closeTime();
this.isSubmitCheck();
};
onNicknameChange = (event) => {
@ -281,15 +294,30 @@ export default class UserInfo extends Component<any, any> {
let { userInfo } = this.state;
userInfo.nickname = event.detail.value;
this.setState({ userInfo });
this.isSubmitCheck();
};
onNickNameReview = (event) => {
console.log("onNickNameReview", event);
console.log(this.state.userInfo);
// let { userInfo } = this.state;
// userInfo.nickname = event.detail.value;
// this.setState({ userInfo });
};
isSubmitCheck() {
let { userInfo, form } = this.state;
if (
userInfo.nickname &&
userInfo.headimg &&
form.province &&
form.city &&
form.area &&
userInfo.birthday
) {
this.setState({ isSubmit: true });
} else {
this.setState({ isSubmit: false });
}
}
render() {
let {
titleHeight,
@ -300,6 +328,7 @@ export default class UserInfo extends Component<any, any> {
timeShow,
form,
minDate,
isSubmit,
} = this.state;
const formatter = (type, value) => {
if (type === "year") {
@ -344,6 +373,7 @@ export default class UserInfo extends Component<any, any> {
placeholder="请填写您的昵称"
placeholder-style={style}
value={userInfo.nickname}
maxlength={20}
onInput={this.onNicknameChange}
onNickNameReview={this.onNickNameReview}
></Input>
@ -380,9 +410,14 @@ export default class UserInfo extends Component<any, any> {
</View>
</View>
<View className="footer">
<View className="btn" onClick={this.onSubmit}>
</View>
{isSubmit ? (
<View className="btn" onClick={this.onSubmit}>
</View>
) : (
<View className="btn"></View>
)}
<View className="text" onClick={this.onSkip}>
</View>
@ -403,6 +438,7 @@ export default class UserInfo extends Component<any, any> {
<Popup show={timeShow} position={"bottom"} onClose={this.closeTime}>
<DatetimePicker
type="date"
formatter={formatter}
value={dayjs(userInfo.birthday).valueOf()}
minDate={minDate}
maxDate={Date.now()}

@ -43,10 +43,7 @@ class UserInfoDetail extends Component<any, any> {
titleHeight: "",
style: "font-size: 26rpx; font-weight: 500; color: #ccc",
userInfo: {
mobile: this.props.mobile,
nickname: this.props.nickname,
headimg: this.props.headimg,
birthday: this.props.birthday,
...this.props.userInfo,
},
cityShow: false,
timeShow: false,
@ -72,12 +69,16 @@ class UserInfoDetail extends Component<any, any> {
leve3region: [],
loading: true,
form: {
nickname: "", // 昵称
provinceId: "", // 省份
cityId: "", // 市
areaId: "", // 县区
nickname: this.props.userInfo.nickname, // 昵称
provinceId: this.props.userInfo.provinceId, // 省份
province: this.props.userInfo.province, // 省份
cityId: this.props.userInfo.cityId, // 市
city: this.props.userInfo.city, // 市
areaId: this.props.userInfo.areaId, // 县区
area: this.props.userInfo.area, // 县区
file: null,
},
pickerCityValue: [],
// maxDate: new Date().getTime(),
// minDate: new Date("1949-10-01").getTime(),
currentDate: new Date().getTime(),
@ -113,52 +114,95 @@ class UserInfoDetail extends Component<any, any> {
getProvince = async () => {
let res = await GetProvince();
if (res.data.code === 200) {
let { columns } = this.state;
let { columns, form } = this.state;
let values = res.data.data.map((item: any) => item.name);
columns[0].values = values;
this.setState({ leve1region: res.data.data, columns });
this.GetAreaListByPid_level2(res.data.data[0].id);
if (form.province) {
let objIndex = values.findIndex((ele) => ele === form.province);
if (objIndex > -1) {
columns[0].defaultIndex = objIndex;
this.setState({ leve1region: res.data.data, columns });
this.GetAreaListByPid_level2(form.provinceId, true);
}
} else {
this.setState({ leve1region: res.data.data, columns });
this.GetAreaListByPid_level2(res.data.data[0].id);
}
}
};
GetAreaListByPid_level2 = async (level2) => {
GetAreaListByPid_level2 = async (level2 = 0, isInit = false) => {
let res = await GetAreaListByPid({ pid: level2 });
if (res.data.code === 200) {
let { columns } = this.state;
let { columns, form } = this.state;
let values = res.data.data.map((item: any) => item.name);
columns[1].values = values;
this.setState({ leve2region: res.data.data, columns });
this.GetAreaListByPid_level3(res.data.data[0].id);
if (isInit) {
let objIndex = values.findIndex((name) => name === form.city);
if (objIndex > -1) {
columns[1].defaultIndex = objIndex;
this.setState({ leve2region: res.data.data, columns });
this.GetAreaListByPid_level3(form.cityId, true);
}
} else {
this.setState({ leve2region: res.data.data, columns });
this.GetAreaListByPid_level3(res.data.data[0].id);
}
}
};
GetAreaListByPid_level3 = async (level3) => {
GetAreaListByPid_level3 = async (level3, isInit = false) => {
let res = await GetAreaListByPid({ pid: level3 });
if (res.data.code === 200) {
let { columns } = this.state;
let { columns, form } = this.state;
let values = res.data.data.map((item: any) => item.name);
columns[2].values = values;
this.setState({ leve3region: res.data.data, columns });
if (isInit) {
let objIndex = values.findIndex((name) => name === form.area);
if (objIndex > -1) {
columns[2].defaultIndex = objIndex;
this.setState({ leve3region: res.data.data, columns });
}
} else {
this.setState({ leve3region: res.data.data, columns });
}
}
};
UpdateUser = async () => {
let { form, userInfo } = this.state;
let formData = new FormData();
formData.append("province", form.province);
formData.append("city", form.city);
formData.append("area", form.area);
formData.append("provinceId", form.provinceId);
formData.append("cityId", form.cityId);
formData.append("areaId", form.areaId);
formData.append("birthday", userInfo.birthday);
formData.append("nickname", userInfo.nickname);
// formData.appendFile("file", userInfo.headimg, "avatar.png");
console.log("form userInfo", form, userInfo);
// console.log("formData",formData.)
if (userInfo.headimg) {
console.log("userInfo.headimg", userInfo.headimg);
console.log("indexOf", userInfo.headimg.indexOf("//tmp/"));
if (userInfo.headimg.indexOf("//tmp/") > -1) {
formData.appendFile("file", userInfo.headimg, "avatar.png");
}
}
let data = formData.getData();
console.log("data", data.contentType);
let res = await UpdateUser(data);
console.log("UpdateUser", res);
if (res.data.code === 200) {
// todo
userInfo.province = form.province;
userInfo.city = form.city;
userInfo.area = form.area;
userInfo.provinceId = form.provinceId;
userInfo.cityId = form.cityId;
userInfo.areaId = form.areaId;
this.props.userRefresh(userInfo);
}
};
getChooseAvatar = (event) => {
@ -169,7 +213,6 @@ class UserInfoDetail extends Component<any, any> {
onSubmit = async () => {
const { userInfo, form } = this.state;
console.log(userInfo, form);
if (!userInfo.headimg) return msg("请点击授权头像");
if (!userInfo.nickname) return msg("请输入昵称");
if (!form.provinceId) return msg("请选择您所在的地区");
@ -262,15 +305,13 @@ class UserInfoDetail extends Component<any, any> {
userInfo.nickname = event.detail.value;
this.setState({ userInfo });
};
onNickNameReView = (event) => {
onNickNameReview = (event) => {
console.log("onNickNameReView", event);
};
render() {
let { userInfo, columns, cityShow, timeShow, form, minDate } = this.state;
console.log("userInfo", userInfo);
const formatter = (type, value) => {
if (type === "year") {
return `${value}`;
@ -282,7 +323,7 @@ class UserInfoDetail extends Component<any, any> {
};
return (
<Block>
<Navbar></Navbar>
<Navbar isBack={true}></Navbar>
<View className="infobox1">
<Button
className="avatar_box"
@ -299,12 +340,22 @@ class UserInfoDetail extends Component<any, any> {
></Image>
)}
</Button>
<Input
{/* <Input
type="nickname"
className="nickname"
placeholder="请填写您的昵称"
value={userInfo.nickname}
maxlength={20}
onInput={this.onNicknameChange}
></Input> */}
<Input
type="nickname"
className="ipt nickname"
placeholder="请填写您的昵称"
value={userInfo.nickname}
maxlength={20}
onInput={this.onNicknameChange}
onNickNameReview={this.onNickNameReview}
></Input>
</View>
@ -376,6 +427,7 @@ class UserInfoDetail extends Component<any, any> {
<Popup show={timeShow} position={"bottom"} onClose={this.closeTime}>
<DatetimePicker
type="date"
formatter={formatter}
value={dayjs(userInfo.birthday).valueOf()}
minDate={minDate}
maxDate={Date.now()}
@ -389,10 +441,11 @@ class UserInfoDetail extends Component<any, any> {
}
const mapStateToProps = (state) => ({
mobile: state.userInfo.mobile,
nickname: state.userInfo.nickname,
headimg: state.userInfo.headimg,
birthday: state.userInfo.birthday,
userInfo: state.userInfo,
// mobile: state.userInfo.mobile,
// nickname: state.userInfo.nickname,
// headimg: state.userInfo.headimg,
// birthday: state.userInfo.birthday,
});
const mapDispatchToProps = (dispatch) => ({
userRefresh(data) {

@ -6,10 +6,20 @@ import { RefreshWxUserInfo } from "../../utils/Interface";
const userInfoReducer = createSlice({
name: "userInfo", // store的名字
initialState: {
id: "", // 用户ID
mobile: "",
nickname: "",
headimg: "",
birthday: "",
birthday: "", // 生日
province: "", // 省
provinceId: "",
city: "", // 市
cityId: "",
area: "", // 区
areaId: "",
token: "", // token
integralText: 0, // 积分
expireCredit: 0, // 过期积分
},
reducers: {
setMobile(state, { payload }) {
@ -23,11 +33,20 @@ const userInfoReducer = createSlice({
},
userRefresh(state, { payload }) {
console.log("userRefresh payload", payload);
state.id = payload.id || "001";
state.mobile = payload.mobile || "";
state.nickname = payload.nickname || "";
state.headimg = payload.headimg || "";
state.birthday = payload.birthday || "";
state.birthday = payload.birthday || new Date().getTime();
state.province = payload.province || "";
state.provinceId = payload.provinceId || "";
state.city = payload.city || "";
state.cityId = payload.cityId || "";
state.area = payload.area || "";
state.areaId = payload.areaId || "";
state.token = payload.token || "";
state.integralText = payload.integralText || 0;
state.expireCredit = payload.integralText || 0;
},
},
});

@ -74,6 +74,109 @@ export const UserInfoRegister = (data) => {
});
};
export const GetUserMobile = (data = { code: "" }) => {
if (!data.code) {
data.code = Taro.getStorageSync("token") || "";
}
//获取用户手机号码
return Ajax({
url: "/hzwx/user/upgradeMember" + paramsToUrlQueryString(data),
data,
method: "post",
});
};
export const getIntegralRule = (data) => {
//积分规则
return Ajax({
url: "/hzwx/setting/getIntegralRule",
data,
});
};
export const getAboutUs = (data) => {
//关于我们
return Ajax({
url: "/hzwx/setting/getAboutUs",
data,
});
};
export const getPrivacyAgreement = (data) => {
//用户隐私协议获取
return Ajax({
url: "/hzwx/setting/getPrivacyAgreement",
data,
method: "get",
});
};
export const getContactWorker = (data) => {
// 联系客服
return Ajax({
url: "/hzwx/setting/getContactWorker",
data,
method: "get",
});
};
export const SaveMessage = (data) => {
// 联系客服
return Ajax({
url: "/hzwx/api/leaveMessage/saveMessage",
data,
method: "post",
});
};
export const GetNoReadMessageNum = (data) => {
// 查询是否有消息未读
return Ajax({
url: "/hzwx/userScriptLog/getNoReadMessageNum",
data,
method: "get",
});
};
export const GetHasBeenRead = (data) => {
// 将消息设置为已读
return Ajax({
url: "/hzwx/userScriptLog/hasBeenRead",
data,
method: "get",
});
};
export const GetMessageList = (data) => {
// 分页获取消息
return Ajax({
url: "/hzwx/userScriptLog/list" + paramsToUrlQueryString(data),
data,
method: "get",
});
};
export const GetObtainUserIntegral = (data) => {
// 分页获取用户积分列表
return Ajax({
url: "/hzwx/integralLog/obtainUserIntegral" + paramsToUrlQueryString(data),
data,
method: "get",
});
};
export const GetIntegralRule = (data) => {
// 获取积分规则
return Ajax({
url: "/hzwx/setting/getIntegralRule",
data,
method: "get",
});
};
//
///////////
export const UserInfoUp = (data) => {
//注册保存用户信息
return Ajax({
@ -204,18 +307,6 @@ export const ActiveInfonoroot = (data) => {
});
};
export const GetUserMobile = (data = { code: "" }) => {
if (!data.code) {
data.code = Taro.getStorageSync("token") || "";
}
//获取用户手机号码
return Ajax({
url: "/hzwx/user/upgradeMember" + paramsToUrlQueryString(data),
data,
method: "post",
});
};
export const InstrumentBindingAdd = (data) => {
//设备绑定
return Ajax({
@ -391,15 +482,6 @@ export const OnWindowClick = (data) => {
});
};
export const getPrivacyAgreement = (data) => {
//用户隐私协议获取
return Ajax({
url: "/hzwx/setting/getPrivacyAgreement",
data,
method: "get",
});
};
export const CreationAgreement = (data) => {
//共创规则
return Ajax({
@ -512,22 +594,6 @@ export const UserLogList = (data) => {
});
};
export const getIntegralRule = (data) => {
//积分规则
return Ajax({
url: "/hzwx/setting/getIntegralRule",
data,
});
};
export const getAboutUs = (data) => {
//关于我们
return Ajax({
url: "/hzwx/setting/getAboutUs",
data,
});
};
export const AgreementRules = (data) => {
//关于我们
return Ajax({

@ -38,11 +38,14 @@ export const Ajax = (params) => {
success(res) {
if (res.statusCode !== 200) {
if (res.statusCode == 403) {
showModal({
t2: "登录已过期,请重新登录",
btn1show: false,
Taro.showModal({
title: "提示",
content: "登录已过期,请重新登录",
showCancel: false,
}).then((res) => {
setGlobalData("token", null);
Taro.clearStorage(); // 清空所有缓存
Taro.reLaunch({
// url: "/pages/login/login",
url: "/pages/initiate/initiate",
@ -50,9 +53,10 @@ export const Ajax = (params) => {
});
return;
}
showModal({
t2: String("错误码:" + res.statusCode),
btn1show: false,
Taro.showModal({
title: "提示",
content: String("错误码:" + res.statusCode),
showCancel: false,
});
return false;
}
@ -69,9 +73,10 @@ export const Ajax = (params) => {
}
const noTipsCodes = [5001, 5002, 5003];
if (noTipsCodes.indexOf(res.data.code) == -1) {
showModal({
t2: msg,
btn1show: false,
Taro.showModal({
title: "提示",
content: msg,
showCancel: false,
}).then(() => {
reject(res);
if (res.data.code == 403 || res.data.msg === "登录状态已过期") {
@ -110,7 +115,7 @@ export const Ajax = (params) => {
};
export const AjaxuploadFile = (params) => {
const app = getApp();
const app = Taro.getApp();
const domain = getGlobalData("domain");
// Taro.showLoading({
// title: "请求中...",
@ -190,20 +195,22 @@ export const AjaxFormData = (params) => {
success(res) {
if (res.statusCode !== 200) {
if (res.statusCode == 403) {
showModal({
t2: "登录已过期,请重新登录",
btn1show: false,
Taro.showModal({
title: "提示",
content: "登录已过期,请重新登录",
showCancel: false,
}).then((res) => {
setGlobalData("token", null);
Taro.clearStorage(); // 清空所有缓存
Taro.reLaunch({
url: "/pages/initiate/initiate",
});
});
return;
}
showModal({
Taro.showModal({
t2: String("错误码:" + res.statusCode),
btn1show: false,
showCancel: false,
});
return false;
}
@ -216,9 +223,10 @@ export const AjaxFormData = (params) => {
}
const noTipsCodes = [5001, 5002, 5003];
if (noTipsCodes.indexOf(res.data.code) == -1) {
showModal({
t2: msg,
btn1show: false,
Taro.showModal({
title: "提示",
content: msg,
showCancel: false,
}).then(() => {
reject(res);
if (res.data.code == 403 || res.data.msg === "登录状态已过期") {

@ -50,11 +50,11 @@ export const back = (delta) => {
});
};
export const msg = (title, mask) => {
export const msg = (title, mask, icon) => {
Taro.showToast({
title,
mask,
icon: "none",
icon: icon || "none",
});
};

@ -4595,6 +4595,11 @@
"resolved" "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz"
"version" "1.1.2"
"buffer-json@^2.0.0":
"integrity" "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw=="
"resolved" "https://registry.npmmirror.com/buffer-json/-/buffer-json-2.0.0.tgz"
"version" "2.0.0"
"buffer@^5.2.1", "buffer@^5.5.0":
"integrity" "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="
"resolved" "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz"
@ -4664,6 +4669,18 @@
"union-value" "^1.0.0"
"unset-value" "^1.0.0"
"cache-loader@^4.1.0":
"integrity" "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw=="
"resolved" "https://registry.npmmirror.com/cache-loader/-/cache-loader-4.1.0.tgz"
"version" "4.1.0"
dependencies:
"buffer-json" "^2.0.0"
"find-cache-dir" "^3.0.0"
"loader-utils" "^1.2.3"
"mkdirp" "^0.5.1"
"neo-async" "^2.6.1"
"schema-utils" "^2.0.0"
"cacheable-request@^2.1.1":
"integrity" "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ=="
"resolved" "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-2.1.4.tgz"
@ -7581,6 +7598,15 @@
"make-dir" "^2.0.0"
"pkg-dir" "^3.0.0"
"find-cache-dir@^3.0.0":
"integrity" "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig=="
"resolved" "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz"
"version" "3.3.2"
dependencies:
"commondir" "^1.0.1"
"make-dir" "^3.0.2"
"pkg-dir" "^4.1.0"
"find-up@^2.0.0":
"integrity" "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ=="
"resolved" "https://registry.npmmirror.com/find-up/-/find-up-2.1.0.tgz"
@ -9805,7 +9831,7 @@
"resolved" "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz"
"version" "3.0.1"
"json-parse-better-errors@^1.0.1":
"json-parse-better-errors@^1.0.1", "json-parse-better-errors@^1.0.2":
"integrity" "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
"resolved" "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz"
"version" "1.0.2"
@ -10116,7 +10142,7 @@
"pify" "^4.0.1"
"strip-bom" "^3.0.0"
"loader-runner@^4.2.0":
"loader-runner@^4.1.0", "loader-runner@^4.2.0":
"integrity" "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="
"resolved" "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz"
"version" "4.3.0"
@ -10399,6 +10425,13 @@
dependencies:
"semver" "^6.0.0"
"make-dir@^3.0.2":
"integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="
"resolved" "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz"
"version" "3.1.0"
dependencies:
"semver" "^6.0.0"
"make-dir@~3.1.0":
"integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="
"resolved" "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz"
@ -11333,7 +11366,7 @@
"resolved" "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz"
"version" "0.6.3"
"neo-async@^2.5.0", "neo-async@^2.6.2":
"neo-async@^2.5.0", "neo-async@^2.6.1", "neo-async@^2.6.2":
"integrity" "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
"resolved" "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz"
"version" "2.6.2"
@ -12202,6 +12235,13 @@
dependencies:
"find-up" "^3.0.0"
"pkg-dir@^4.1.0":
"integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="
"resolved" "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz"
"version" "4.2.0"
dependencies:
"find-up" "^4.0.0"
"pkg-dir@^4.2.0":
"integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="
"resolved" "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz"
@ -13983,6 +14023,15 @@
dependencies:
"loose-envify" "^1.1.0"
"schema-utils@^2.0.0":
"integrity" "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg=="
"resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz"
"version" "2.7.1"
dependencies:
"@types/json-schema" "^7.0.5"
"ajv" "^6.12.4"
"ajv-keywords" "^3.5.2"
"schema-utils@^2.6.5":
"integrity" "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg=="
"resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz"
@ -14011,6 +14060,16 @@
"ajv-formats" "^2.1.1"
"ajv-keywords" "^5.1.0"
"schema-utils@^4.0.1":
"integrity" "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw=="
"resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz"
"version" "4.2.0"
dependencies:
"@types/json-schema" "^7.0.9"
"ajv" "^8.9.0"
"ajv-formats" "^2.1.1"
"ajv-keywords" "^5.1.0"
"scss-bundle@^3.0.2":
"integrity" "sha512-lvxTwCKDLgzmRWhGwJ834ggtnEhs0G9FxSJRWte+NwlshVvBcQ/kOHHkpAGDpCxIMNGz/Utl0yd/MWyQAOBhqg=="
"resolved" "https://registry.npmmirror.com/scss-bundle/-/scss-bundle-3.1.2.tgz"
@ -15180,6 +15239,11 @@
"mkdirp" "^1.0.3"
"yallist" "^4.0.0"
"taro-plugin-compiler-optimization@^1.0.4":
"integrity" "sha512-7aAOSWLpkPlJkCM6NPjcZEqoLXdquNy16CEEKIzAAD03OJ742rHhVzbZ0NIdMABMV7xC+gzRFq9eoZ64gm9o2g=="
"resolved" "https://registry.npmmirror.com/taro-plugin-compiler-optimization/-/taro-plugin-compiler-optimization-1.0.4.tgz"
"version" "1.0.4"
"taro-ui@^3.2.0":
"integrity" "sha512-C3A2DaWQ7yCgQQEEEVbGQLByc4Op86py/AgIk0HLDUvp5rzLkpPSyMZWY7TvYroyyyy+ARt6BmDcLinT80xUUw=="
"resolved" "https://registry.npmmirror.com/taro-ui/-/taro-ui-3.2.0.tgz"
@ -15244,7 +15308,7 @@
"ansi-escapes" "^4.2.1"
"supports-hyperlinks" "^2.0.0"
"terser-webpack-plugin@^5.1.3", "terser-webpack-plugin@^5.3.7":
"terser-webpack-plugin@^5.1.3", "terser-webpack-plugin@^5.3.7", "terser-webpack-plugin@^5.3.9":
"integrity" "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA=="
"resolved" "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz"
"version" "5.3.9"
@ -15289,6 +15353,16 @@
dependencies:
"any-promise" "^1.0.0"
"thread-loader@^4.0.2":
"integrity" "sha512-UOk/KBydsQjh4Ja5kocxDUzhv11KYptHN/h8gdSwo6/MBkYrWqQua6K2qwlpXnCXS9c/uLs8F/JF8rpveF0+fA=="
"resolved" "https://registry.npmmirror.com/thread-loader/-/thread-loader-4.0.2.tgz"
"version" "4.0.2"
dependencies:
"json-parse-better-errors" "^1.0.2"
"loader-runner" "^4.1.0"
"neo-async" "^2.6.2"
"schema-utils" "^4.0.1"
"throat@^5.0.0":
"integrity" "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="
"resolved" "https://registry.npmmirror.com/throat/-/throat-5.0.0.tgz"
@ -16290,7 +16364,7 @@
"resolved" "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz"
"version" "0.5.0"
"webpack@^3.0.0 || ^4.1.0 || ^5.0.0-0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.40.0 || ^5.0.0", "webpack@^5.0.0", "webpack@^5.1.0", "webpack@^5.20.0", "webpack@^5.78.0", "webpack@>=2", "webpack@>=4.43.0 <6.0.0", "webpack@3 || 4 || 5":
"webpack@^3.0.0 || ^4.1.0 || ^5.0.0-0", "webpack@^4.0.0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.40.0 || ^5.0.0", "webpack@^5.0.0", "webpack@^5.1.0", "webpack@^5.20.0", "webpack@^5.78.0", "webpack@>=2", "webpack@>=4.43.0 <6.0.0", "webpack@3 || 4 || 5":
"integrity" "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw=="
"resolved" "https://registry.npmmirror.com/webpack/-/webpack-5.89.0.tgz"
"version" "5.89.0"

Loading…
Cancel
Save