From 563a0c42ea814748931ed8bdf3085252031501c4 Mon Sep 17 00:00:00 2001
From: Dawn_Ocean <1785590531@qq.com>
Date: Sun, 17 Mar 2024 01:00:06 +0800
Subject: [PATCH] add memberpage layout
---
mock/api.ts | 9 ++
src/assets/icons/MemberPage/clock.svg | 1 +
src/pages/member/MemberDutyInfo.tsx | 108 ++++++++++++++++++++++++
src/pages/member/MemberStepTipsInfo.tsx | 24 ++++++
src/pages/member/MemberTitleCard.tsx | 27 ++++++
src/pages/member/member.tsx | 99 ++++++++++++++++++++--
src/plain-text/MemberPage.ts | 106 +++++++++++++++++++++++
src/service/memberDutyInfo.ts | 43 ++++++++++
8 files changed, 411 insertions(+), 6 deletions(-)
create mode 100644 src/assets/icons/MemberPage/clock.svg
create mode 100644 src/pages/member/MemberDutyInfo.tsx
create mode 100644 src/pages/member/MemberStepTipsInfo.tsx
create mode 100644 src/pages/member/MemberTitleCard.tsx
create mode 100644 src/service/memberDutyInfo.ts
diff --git a/mock/api.ts b/mock/api.ts
index 3d40a49..ed7ce70 100644
--- a/mock/api.ts
+++ b/mock/api.ts
@@ -62,4 +62,13 @@ export default {
'POST /member/logout': {
success: true,
},
+ 'GET /member/duty/info': {
+ success: true,
+ data: {
+ token: 'token_test',
+ isInDuty: false,
+ offDutyReason: '废弃元器件创意设计大赛',
+ dutyRecoverTime: '下周一',
+ },
+ },
};
diff --git a/src/assets/icons/MemberPage/clock.svg b/src/assets/icons/MemberPage/clock.svg
new file mode 100644
index 0000000..b79ea85
--- /dev/null
+++ b/src/assets/icons/MemberPage/clock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/pages/member/MemberDutyInfo.tsx b/src/pages/member/MemberDutyInfo.tsx
new file mode 100644
index 0000000..46e807e
--- /dev/null
+++ b/src/pages/member/MemberDutyInfo.tsx
@@ -0,0 +1,108 @@
+import { Component, ReactNode } from 'react';
+import { View, Image } from '@tarojs/components';
+import { AtTimeline } from 'taro-ui';
+import pt from '@/plain-text';
+import tick from '@/assets/icons/MainPage/tick.svg';
+import clock from '@/assets/icons/MemberPage/clock.svg';
+
+export class MemberDutyData {
+ constructor() {
+ this.isInDuty = false;
+ this.currentDuty = '2';
+ this.inDutyCnt = 3;
+ this.offDutyReason = '学园维修';
+ this.dutyRecoverTime = '下周一';
+ }
+
+ isInDuty: boolean;
+ currentDuty?: 'off' | '1' | '2' | '3' | 'others';
+ offDutyReason?: string;
+ dutyRecoverTime?: string;
+ inDutyCnt?: number;
+}
+
+class Card extends Component {
+ props = {
+ isInDuty: false,
+ };
+ render(): ReactNode {
+ const inDuty = this.props.isInDuty;
+ const dc = pt.get().memberPage.dutyCard;
+ const title = inDuty ? dc.inDuty.title : dc.offDuty.title;
+ const iconsrc = inDuty ? tick : clock;
+ return (
+
+
+
+
+ {title}
+
+
+
+ );
+ }
+}
+
+export class MemberDutyInfo extends Component {
+ props = {
+ data: new MemberDutyData(),
+ };
+
+ offDutyContent(): ReactNode {
+ const data = this.props.data;
+ const od = pt.get().memberPage.dutyCard.offDuty;
+ return (
+
+
+
+
+ );
+ }
+
+ inDutyContent(): ReactNode {
+ const data = this.props.data;
+ const id = pt.get().memberPage.dutyCard.inDuty;
+ return (
+
+
+
+
+ );
+ }
+
+ render(): ReactNode {
+ if (this.props.data.isInDuty) {
+ return this.inDutyContent();
+ } else {
+ return this.offDutyContent();
+ }
+ }
+}
diff --git a/src/pages/member/MemberStepTipsInfo.tsx b/src/pages/member/MemberStepTipsInfo.tsx
new file mode 100644
index 0000000..1f5a967
--- /dev/null
+++ b/src/pages/member/MemberStepTipsInfo.tsx
@@ -0,0 +1,24 @@
+import { Component, ReactNode } from 'react';
+import { View } from '@tarojs/components';
+import { AtTimeline } from 'taro-ui';
+import pt from '@/plain-text';
+
+export class MemberStepInfo extends Component {
+ render(): ReactNode {
+ return (
+
+
+
+ );
+ }
+}
+
+export class MemberTipsInfo extends Component {
+ render(): ReactNode {
+ return (
+
+
+
+ );
+ }
+}
diff --git a/src/pages/member/MemberTitleCard.tsx b/src/pages/member/MemberTitleCard.tsx
new file mode 100644
index 0000000..0f90598
--- /dev/null
+++ b/src/pages/member/MemberTitleCard.tsx
@@ -0,0 +1,27 @@
+import React from 'react';
+import { View, Image } from '@tarojs/components';
+import pt from '@/plain-text';
+import logo from '@/assets/images/UserPage/logo.png';
+
+export default class MemberTitleCard extends React.Component {
+ render(): React.ReactNode {
+ const memberPage = pt.get().memberPage;
+ return (
+
+
+
+
+
+
+ {memberPage.mainTitleLine}
+
+ {memberPage.subTitleLine}
+
+
+ );
+ }
+}
diff --git a/src/pages/member/member.tsx b/src/pages/member/member.tsx
index b230569..f77e3f5 100644
--- a/src/pages/member/member.tsx
+++ b/src/pages/member/member.tsx
@@ -1,6 +1,6 @@
import { View } from '@tarojs/components';
import { Component, ReactNode } from 'react';
-import { AtButton, AtCard, AtList } from 'taro-ui';
+import { AtAccordion, AtButton, AtCard, AtList } from 'taro-ui';
import Taro from '@tarojs/taro';
import pt from '@/plain-text';
import { getUncompletedTicketList } from '@/service/uncompletedTicket';
@@ -8,20 +8,96 @@ import type CustomTabBar from '@/custom-tab-bar';
import { TicketListItem } from '@/components/TicketListItem/TicketListItem';
import { RequestState } from '@/service';
import moment from 'moment';
+import { getMemberDutyInfo } from '@/service/memberDutyInfo';
+import PageFooter from '@/components/PageFooter/PageFooter';
import './member.scss';
+import { MemberDutyData, MemberDutyInfo } from './MemberDutyInfo';
+import { MemberStepInfo, MemberTipsInfo } from './MemberStepTipsInfo';
+import MemberTitleCard from './MemberTitleCard';
-interface UncompletedTicketState {
- fixList: Array;
- rs: RequestState;
+class CardContent {
+ title: string;
+ note: string;
+ extra: JSX.Element | string;
+ content: () => JSX.Element;
}
-export default class MemberPage extends Component<{}, UncompletedTicketState> {
+function memberPageCard(c: CardContent): JSX.Element {
+ return (
+
+
+ {c.content()}
+
+
+ );
+}
+
+class ExpandItem extends Component {
state = {
- fixList: [new TicketListItem(0, '', '', 1, moment(), false)],
+ open: false,
+ };
+ props = {
+ title: '',
+ content: ,
+ };
+
+ handleClick(value: boolean) {
+ this.setState({ open: value });
+ }
+
+ render(): ReactNode {
+ return (
+
+
+ {this.props.content}
+
+
+ );
+ }
+}
+
+interface MemberPageState {
+ fixList: Array;
+ rs: RequestState;
+ dutyData: MemberDutyData;
+ dutyInfoCard: CardContent;
+ stepInfoCard: CardContent;
+ tipsInfoCard: CardContent;
+ //rs: RequestState;
+}
+
+export default class MemberPage extends Component<{}, MemberPageState> {
+ state = {
+ dutyData: new MemberDutyData(),
+ dutyInfoCard: {
+ title: pt.get().mainPage.cardTitle.dutyInfo,
+ note: pt.get().mainPage.cardTips.dutyInfo,
+ extra: pt.get().mainPage.extraInfo.dutyInfo,
+ content: () => ,
+ },
+ stepInfoCard: {
+ title: pt.get().mainPage.cardTitle.stepInfo,
+ note: pt.get().mainPage.cardTips.stepInfo,
+ extra: pt.get().mainPage.extraInfo.dutyInfo,
+ content: () => ,
+ },
+ tipsInfoCard: {
+ title: pt.get().mainPage.cardTitle.tipsInfo,
+ note: pt.get().mainPage.cardTips.tipsInfo,
+ extra: pt.get().mainPage.extraInfo.dutyInfo,
+ content: () => ,
+ },
+ // rs: new RequestState(),
+ fixList: [new TicketListItem(0, '', '', 1, moment())],
rs: new RequestState(),
};
componentDidMount(): void {
+ getMemberDutyInfo(this);
Taro.setNavigationBarTitle({
title: pt.get().navBar.user.member,
});
@@ -37,6 +113,7 @@ export default class MemberPage extends Component<{}, UncompletedTicketState> {
// 以上是TabBar相关
render(): ReactNode {
+ const memberPage = pt.get().memberPage;
if (this.state.rs.loading) {
return loading;
}
@@ -46,7 +123,17 @@ export default class MemberPage extends Component<{}, UncompletedTicketState> {
const fixListRenderer = this.state.fixList.map((item) => item.render());
return (
+
+
+ {memberPageCard(this.state.dutyInfoCard)}
+ {memberPageCard(this.state.tipsInfoCard)}
+
+
{fixListRenderer}
+
);
}
diff --git a/src/plain-text/MemberPage.ts b/src/plain-text/MemberPage.ts
index 5d00e46..d8806b0 100644
--- a/src/plain-text/MemberPage.ts
+++ b/src/plain-text/MemberPage.ts
@@ -1,4 +1,6 @@
export interface MemberPageText {
+ mainTitleLine: string;
+ subTitleLine: string;
stuidText: {
title: string;
placeholder: string;
@@ -10,9 +12,29 @@ export interface MemberPageText {
uncompletedTicket: {
extra: string;
};
+ dutyCard: {
+ offDuty: {
+ title: string;
+ reason: (s: string) => string;
+ recoverTime: (t: string) => string;
+ };
+ inDuty: {
+ title: string;
+ currentDutyText: (c: 'off' | '1' | '2' | '3' | 'others') => string;
+ inDutyCnt: (n: number) => string;
+ };
+ };
+ expandTitle: {
+ stepInfo: string;
+ tipsInfo: string;
+ };
+ stepList: Array<{ title: string }>;
+ tipsList: Array<{ title: string }>;
}
export const memberPageZhCn: MemberPageText = {
+ mainTitleLine: '您好,这里是E志者协会',
+ subTitleLine: '祝你满绩每一天',
stuidText: {
title: '学号',
placeholder: '与统一身份认证学号一致',
@@ -24,9 +46,52 @@ export const memberPageZhCn: MemberPageText = {
uncompletedTicket: {
extra: '详细信息',
},
+ dutyCard: {
+ offDuty: {
+ title: '空闲',
+ reason: (s) => '未值班原因:' + s,
+ recoverTime: (t) => '恢复值班时间:' + t,
+ },
+ inDuty: {
+ title: '值班中',
+ currentDutyText: (c) => {
+ switch (c) {
+ case 'off':
+ return '当前未值班';
+ case '1':
+ return '第一班 13:30-16:00';
+ case '2':
+ return '第二班 16:00-18:00';
+ case '3':
+ return '第三班 18:00-20:30';
+ case 'others':
+ return '其他值班时间,见通知';
+ }
+ },
+ inDutyCnt: (n) => '当前值班人数:' + n,
+ },
+ },
+ expandTitle: {
+ stepInfo: '查看维修步骤',
+ tipsInfo: '查看注意事项',
+ },
+ stepList: [
+ { title: '机主线上填写工单,审核接取维修后加入 Oreo' },
+ { title: '进行维修工作,认领工单,通过小程序与机主交流' },
+ { title: '维修结束,清点机主物品,待机主取回' },
+ { title: '机主取回确认无误后,修改工单状态' },
+ ],
+ tipsList: [
+ { title: '戴尔/外星人、Surface、苹果电脑不能拆机' },
+ { title: '数据无价,请提醒机主随时做好数据备份' },
+ { title: '204 是实验室,请勿在内饮食' },
+ { title: '螺丝上了吗?电源排线插了吗?' },
+ ],
};
export const memberPageEnUs: MemberPageText = {
+ mainTitleLine: '您好,这里是E志者协会',
+ subTitleLine: '祝你满绩每一天',
stuidText: {
title: 'Student ID',
placeholder: 'Consistent with EVA Auth',
@@ -38,4 +103,45 @@ export const memberPageEnUs: MemberPageText = {
uncompletedTicket: {
extra: 'Details',
},
+ dutyCard: {
+ offDuty: {
+ title: '空闲',
+ reason: (s) => '未值班原因:' + s,
+ recoverTime: (t) => '恢复值班时间:' + t,
+ },
+ inDuty: {
+ title: '值班中',
+ currentDutyText: (c) => {
+ switch (c) {
+ case 'off':
+ return '当前未值班';
+ case '1':
+ return '第一班 13:30-16:00';
+ case '2':
+ return '第二班 16:00-18:00';
+ case '3':
+ return '第三班 18:00-20:30';
+ case 'others':
+ return '其他值班时间,见通知';
+ }
+ },
+ inDutyCnt: (n) => '当前值班人数:' + n,
+ },
+ },
+ expandTitle: {
+ stepInfo: '查看维修步骤',
+ tipsInfo: '查看注意事项',
+ },
+ stepList: [
+ { title: '机主线上填写工单,审核接取维修后加入 Oreo' },
+ { title: '进行维修工作,认领工单,通过小程序与机主交流' },
+ { title: '维修结束,清点机主物品,待机主取回' },
+ { title: '机主取回确认无误后,修改工单状态' },
+ ],
+ tipsList: [
+ { title: '戴尔/外星人、Surface、苹果电脑不能拆机' },
+ { title: '数据无价,请提醒机主随时做好数据备份' },
+ { title: '204 是实验室,请勿在内饮食' },
+ { title: '螺丝上了吗?电源排线插了吗?' },
+ ],
};
diff --git a/src/service/memberDutyInfo.ts b/src/service/memberDutyInfo.ts
new file mode 100644
index 0000000..fcf633f
--- /dev/null
+++ b/src/service/memberDutyInfo.ts
@@ -0,0 +1,43 @@
+import MemberPage from '@/pages/member/member';
+import Taro from '@tarojs/taro';
+import { getUrl } from '.';
+
+export function getMemberDutyInfo(that: MemberPage) {
+ Taro.request({
+ url: getUrl('/member/duty/info'),
+ method: 'GET',
+ data: {
+ token: 'token_test',
+ },
+ })
+ .then((res) => {
+ const data = res.data.data;
+ if (data.isInDuty) {
+ that.setState({
+ dutyData: {
+ isInDuty: data.isInDuty,
+ inDutyCnt: data.inDutyCnt,
+ currentDuty: data.currentDuty,
+ },
+ });
+ } else {
+ that.setState({
+ dutyData: {
+ isInDuty: data.isInDuty,
+ offDutyReason: data.offDutyReason,
+ dutyRecoverTime: data.dutyRecoverTime,
+ },
+ });
+ }
+ })
+ .catch((err) => {
+ console.log(err);
+ that.setState({
+ dutyData: {
+ isInDuty: false,
+ offDutyReason: '获取失败!Network Error!',
+ dutyRecoverTime: '获取失败!Network Error!',
+ },
+ });
+ });
+}