umi(2),Android开发基础不牢

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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

总结

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

Android大厂面试真题全套解析

2017-2020字节跳动Android面试真题解析PDF
然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

[外链图片转存中…(img-41Yu4K6a-1711964042664)]
[外链图片转存中…(img-fNbGvcpB-1711964042664)]
[外链图片转存中…(img-UjD10Irv-1711964042664)]
[外链图片转存中…(img-2wdXsPQ8-1711964042665)]
[外链图片转存中…(img-mtOFfcuo-1711964042665)]
[外链图片转存中…(img-dYgekIuj-1711964042665)]
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-uRWpALGg-1711964042666)]

总结

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

[外链图片转存中…(img-YoODRLqz-1711964042666)]

[外链图片转存中…(img-nva3IU3b-1711964042666)]
然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值