requestType: ‘form’
});
}
- 取公用数据类型(data.d.ts中)
/**
- 封装后台返回的数据
*/
export type SingleUserListType = {
id: number,
level?: number,
account?: string,
password?: string,
contact_name?: string,
contact_mobile?: string,
remark?: string,
role_id?: number,
is_enable?: number,
ctime?: string,
uptime?: string,
role_name?: string,
ctime_str: string,
}
/**
- 添加编辑账户
*/
export type UserAddType = {
user_id?: number,
account?: string,
account_password?: string,
contact_name?: string,
contact_mobile?: number,
role_id?: number,
};
/**
- 獲取账户信息
*/
export type AccountInfoType = {
user_id?: number,
account?: string,
password?: string,
contact_name?: string,
contact_mobile?: number,
role_id?: number,
id?: number
};
/**
- 獲取账户信息列表
*/
export type AccountRoleListType = {
ctime?: number,
ctime_str?: string,
id?: number,
is_enable?: number,
menu_ids?: string,
role_name?: string,
uptime?: number,
value?:number,
label?:string,
disabled?:boolean
};
- model.ts中dva数据获取
import { Effect, Reducer } from ‘umi’;
//导入service远端数据请求
import { getUserList, getUserInfo, userAdd, userFrozen } from ‘./service’
import { SingleUserListType, AccountInfoType, AccountRoleListType } from ‘./data’
import { message } from ‘antd’;
export type AccountListState = {
rows: SingleUserListType[];
total: number;
info: AccountInfoType;
role_list: AccountRoleListType[]
}
interface AccountListModelType {
namespace: string
state: AccountListState;//封装后台返回的数据
effects: {
getRemoteUserList: Effect;
getRemoteUserInfoData: Effect;
postRemoteUserAdd: Effect;
postRemoteUserFrozen: Effect;
};
reducers: {
getUserList: Reducer,
getUserInfoData: Reducer,
};
}
const AccountListModel: AccountListModelType = {
namespace: ‘accountListData’,
state: {
rows: [],
total: 0,
info: {},
role_list: []
},
effects: {
*getRemoteUserList({ payload }, { call, put }) {
//从service中获取数据(service主要用于接口请求)
const response = yield call(getUserList, { …payload })
if (response && response instanceof Object) {
yield put({
type: ‘getUserList’,//这个是将数据给reducers中哪个方法
payload: response.data //注意这里传递一个数组会出问题,原因待定
})
}
},
//獲取账户信息
*getRemoteUserInfoData({ payload }, { call, put }) {
const response = yield call(getUserInfo, { …payload })
if (response && response instanceof Object) {
let { role_list } = response.data
role_list.forEach((element: AccountRoleListType) => {
element.value = element.id,
element.label = element.role_name,
element.disabled = element.is_enable == 0
})
response.data.role_list = role_list
response.data.info = { …response.data.info, role_id: (response.data.info.role_id == 0 ? ‘’ : response.data.info.role_id) }
yield put({
type: ‘getUserInfoData’,
payload: response.data
})
}
},
//用户添加
*postRemoteUserAdd({ payload }, { call, put }) {
const response = yield call(userAdd, { …payload })
if (response && response instanceof Object) {
message.success(response.message)
}
},
//冻结
*postRemoteUserFrozen({ payload }, { call, put }) {
const response = yield call(userFrozen, { …payload })
if (response && response instanceof Object) {
message.success(response.message)
}
}
},
//同步
reducers: {
getUserList(state, action) {
return {
…state,
…action.payload,
};
},
getUserInfoData(state, action) {
return {
…state,
…action.payload,
};
}
},
}
export default AccountListModel;
- 首页index.tsx展示数据
import React, { useRef, FC } from ‘react’;
import type { ProColumns, ActionType } from ‘@ant-design/pro-table’;
import { PageContainer, WaterMark } from ‘@ant-design/pro-layout’;
import { Card, Space } from ‘antd’;
import { connect, Dispatch, AccountListState } from ‘umi’;
import type { ListParamsType } from ‘@/services/data’
import { SingleUserListType, UserAddType } from ‘./data’
import ProTable from ‘@ant-design/pro-table’
import ‘./index.less’
import AddAccountModal from ‘./components/addaccountmodal’
/**
- 声明下方 props 类型
*/
type accountListPageProps = {
listData: AccountListState,
dispatch: Dispatch
}
const AccountListPage: FC = (props) => {
//获取从model中来的数据
const { listData, dispatch } = props
//配置ProTable
const ref = useRef();
/**
- ProTable的网络请求 request
*/
const requestHandler = async (params: ListParamsType) => {
await dispatch({
type: ‘accountListData/getRemoteUserList’,
payload: params = { …params }
})
return {}
}
//提交数据
const onCreateFinish = async (values: UserAddType) => {
await dispatch({
type: ‘accountListData/postRemoteUserAdd’,
payload: { …values }
})
ref.current?.reload();
return true
}
/**
-
启用或停用
-
@param id
*/
const onAccountTypeClick = async (id: number) => {
await dispatch({
type: ‘accountListData/postRemoteUserFrozen’,
payload: { id: id }
})
ref.current?.reload();
}
const columns: ProColumns[] = [
{
title: ‘ID’,
dataIndex: ‘id’,
width: 128,
search: false,
align: ‘left’
},
{
title: ‘账号名称’,
dataIndex: ‘account’,
align: ‘left’,
},
{
title: ‘状态’,
dataIndex: ‘is_enable’,
search: false,
align: ‘left’,
render: (text) => {text == 1 ? 启用
: 停用
},
},
{
title: ‘联系人姓名’,
dataIndex: ‘contact_name’,
hideInTable: true,
},
{
title: ‘创建时间’,
dataIndex: ‘ctime_str’,
search: false,
align: ‘left’
},
{
title: ‘操作’,
align: ‘center’,
render: (text, record) => (
<AddAccountModal
userId={record.id}
itemInfo={listData.info}
roleList={listData.role_list}
dispatch={dispatch}
showType={1}
onCreateFinish={onCreateFinish} />
{
record.is_enable == 0 ? <a className=“start-using” onClick={() => onAccountTypeClick(record.id)}>启用 :
<a className=“stop-using” onClick={() => onAccountTypeClick(record.id)}>停用
}
),
},
];
return (
<ProTable
actionRef={ref}
request={requestHandler}
columns={columns}
dataSource={listData.rows}
rowKey=“id”
search={{
labelWidth: ‘auto’,
}}
pagination={{
showQuickJumper: true,
pageSize: 10,
total: listData.total
}}
form={{
span: 6
}}
toolBarRender={() => [
<AddAccountModal
userId={0}
itemInfo={listData.info}
roleList={listData.role_list}
dispatch={dispatch}
showType={0}
onCreateFinish={onCreateFinish} />
]}
/>
)
}
const mapStateToProps = ({ accountListData }: { accountListData: AccountListState }) => {
return {
listData: accountListData,//这里的usersData就是model中的namespace
}
}
export default connect(mapStateToProps)(AccountListPage)
- 弹框 addaccountmodal.tsx
import React, { useEffect, FC } from ‘react’
import { Button, Form } from ‘antd’;
import {
ModalForm,
ProFormText,
ProFormSelect,
} from ‘@ant-design/pro-form’;
import { PlusOutlined } from ‘@ant-design/icons’;
import type { UserAddType } from ‘…/data’
import { Dispatch } from ‘umi’;
type AddAccountModalProps = {
showType: number
onCreateFinish: (values: UserAddType) => void
dispatch: Dispatch
userId: number
itemInfo: any
roleList: any
}
const AddAccountModal: FC = (props) => {
const { showType, onCreateFinish, dispatch, userId, itemInfo, roleList } = props
useEffect(() => {
form.setFieldsValue({
…itemInfo,
})
}, [itemInfo])
const [form] = Form.useForm();
const layout = {
labelCol: { span: 5 },
};
//ModalForm状态改变
const onVisibleChange = async (value: boolean) => {
if (value) {
await dispatch({
type: ‘accountListData/getRemoteUserInfoData’,
payload: { id: userId }
})
}
}
return (
<ModalForm<{
account: string;
account_password: string;
contact_name: string;
contact_mobile: number;
role_id: number;
user_id: number
}>
width=“35%”
{…layout}
form={form}
title={showType === 0 ? 添加账户
: 编辑账户
}
trigger={
showType === 0 ? (
添加账户
) : (
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
总结
其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
[外链图片转存中…(img-41Yu4K6a-1711964042664)]
[外链图片转存中…(img-fNbGvcpB-1711964042664)]
[外链图片转存中…(img-UjD10Irv-1711964042664)]
[外链图片转存中…(img-2wdXsPQ8-1711964042665)]
[外链图片转存中…(img-mtOFfcuo-1711964042665)]
[外链图片转存中…(img-dYgekIuj-1711964042665)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-uRWpALGg-1711964042666)]
总结
其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
[外链图片转存中…(img-YoODRLqz-1711964042666)]
[外链图片转存中…(img-nva3IU3b-1711964042666)]
然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!