diff --git a/.eslintignore b/.eslintignore index aa91c16..9b4ba98 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,2 @@ src/**/*-test.js +src/public diff --git a/src/models/app.js b/src/models/app.js index 52e483a..a62aee4 100644 --- a/src/models/app.js +++ b/src/models/app.js @@ -1,152 +1,152 @@ -/* global window */ -/* global document */ -/* global location */ -import { routerRedux } from 'dva/router' -import { parse } from 'qs' -import config from 'config' -import { EnumRoleType } from 'enums' -import { query, logout } from 'services/app' -import * as menusService from 'services/menus' - -const { prefix } = config - -export default { - namespace: 'app', - state: { - user: {}, - permissions: { - visit: [], - }, - menu: [ - { - id: 1, - icon: 'laptop', - name: 'Dashboard', - router: '/dashboard', - }, - ], - menuPopoverVisible: false, - siderFold: window.localStorage.getItem(`${prefix}siderFold`) === 'true', - darkTheme: window.localStorage.getItem(`${prefix}darkTheme`) === 'true', - isNavbar: document.body.clientWidth < 769, - navOpenKeys: JSON.parse(window.localStorage.getItem(`${prefix}navOpenKeys`)) || [], - }, - subscriptions: { - - setup ({ dispatch }) { - dispatch({ type: 'query' }) - let tid - window.onresize = () => { - clearTimeout(tid) - tid = setTimeout(() => { - dispatch({ type: 'changeNavbar' }) - }, 300) - } - }, - - }, - effects: { - - * query ({ - payload, - }, { call, put }) { - const { success, user } = yield call(query, payload) - if (success && user) { - const { list } = yield call(menusService.query) - const { permissions } = user - let menu = list - if (permissions.role === EnumRoleType.ADMIN || permissions.role === EnumRoleType.DEVELOPER) { - permissions.visit = list.map(item => item.id) - } else { - menu = list.filter((item) => { - const cases = [ - permissions.visit.includes(item.id), - item.mpid ? permissions.visit.includes(item.mpid) || item.mpid === '-1' : true, - item.bpid ? permissions.visit.includes(item.bpid) : true, - ] - return cases.every(_ => _) - }) - } - yield put({ - type: 'updateState', - payload: { - user, - permissions, - menu, - }, - }) - if (location.pathname === '/login') { - yield put(routerRedux.push('/dashboard')) - } - } else if (config.openPages && config.openPages.indexOf(location.pathname) < 0) { - let from = location.pathname - window.location = `${location.origin}/login?from=${from}` - } - }, - - * logout ({ - payload, - }, { call, put }) { - const data = yield call(logout, parse(payload)) - if (data.success) { - yield put({ type: 'query' }) - } else { - throw (data) - } - }, - - * changeNavbar (action, { put, select }) { - const { app } = yield (select(_ => _)) - const isNavbar = document.body.clientWidth < 769 - if (isNavbar !== app.isNavbar) { - yield put({ type: 'handleNavbar', payload: isNavbar }) - } - }, - - }, - reducers: { - updateState (state, { payload }) { - return { - ...state, - ...payload, - } - }, - - switchSider (state) { - window.localStorage.setItem(`${prefix}siderFold`, !state.siderFold) - return { - ...state, - siderFold: !state.siderFold, - } - }, - - switchTheme (state) { - window.localStorage.setItem(`${prefix}darkTheme`, !state.darkTheme) - return { - ...state, - darkTheme: !state.darkTheme, - } - }, - - switchMenuPopver (state) { - return { - ...state, - menuPopoverVisible: !state.menuPopoverVisible, - } - }, - - handleNavbar (state, { payload }) { - return { - ...state, - isNavbar: payload, - } - }, - - handleNavOpenKeys (state, { payload: navOpenKeys }) { - return { - ...state, - ...navOpenKeys, - } - }, - }, -} +/* global window */ +/* global document */ +/* global location */ +import { routerRedux } from 'dva/router' +import { parse } from 'qs' +import config from 'config' +import { EnumRoleType } from 'enums' +import { query, logout } from 'services/app' +import * as menusService from 'services/menus' + +const { prefix } = config + +export default { + namespace: 'app', + state: { + user: {}, + permissions: { + visit: [], + }, + menu: [ + { + id: 1, + icon: 'laptop', + name: 'Dashboard', + router: '/dashboard', + }, + ], + menuPopoverVisible: false, + siderFold: window.localStorage.getItem(`${prefix}siderFold`) === 'true', + darkTheme: window.localStorage.getItem(`${prefix}darkTheme`) === 'true', + isNavbar: document.body.clientWidth < 769, + navOpenKeys: JSON.parse(window.localStorage.getItem(`${prefix}navOpenKeys`)) || [], + }, + subscriptions: { + + setup ({ dispatch }) { + dispatch({ type: 'query' }) + let tid + window.onresize = () => { + clearTimeout(tid) + tid = setTimeout(() => { + dispatch({ type: 'changeNavbar' }) + }, 300) + } + }, + + }, + effects: { + + * query ({ + payload, + }, { call, put }) { + const { success, user } = yield call(query, payload) + if (success && user) { + const { list } = yield call(menusService.query) + const { permissions } = user + let menu = list + if (permissions.role === EnumRoleType.ADMIN || permissions.role === EnumRoleType.DEVELOPER) { + permissions.visit = list.map(item => item.id) + } else { + menu = list.filter((item) => { + const cases = [ + permissions.visit.includes(item.id), + item.mpid ? permissions.visit.includes(item.mpid) || item.mpid === '-1' : true, + item.bpid ? permissions.visit.includes(item.bpid) : true, + ] + return cases.every(_ => _) + }) + } + yield put({ + type: 'updateState', + payload: { + user, + permissions, + menu, + }, + }) + if (location.pathname === '/login') { + yield put(routerRedux.push('/dashboard')) + } + } else if (config.openPages && config.openPages.indexOf(location.pathname) < 0) { + let from = location.pathname + window.location = `${location.origin}/login?from=${from}` + } + }, + + * logout ({ + payload, + }, { call, put }) { + const data = yield call(logout, parse(payload)) + if (data.success) { + yield put({ type: 'query' }) + } else { + throw (data) + } + }, + + * changeNavbar (action, { put, select }) { + const { app } = yield (select(_ => _)) + const isNavbar = document.body.clientWidth < 769 + if (isNavbar !== app.isNavbar) { + yield put({ type: 'handleNavbar', payload: isNavbar }) + } + }, + + }, + reducers: { + updateState (state, { payload }) { + return { + ...state, + ...payload, + } + }, + + switchSider (state) { + window.localStorage.setItem(`${prefix}siderFold`, !state.siderFold) + return { + ...state, + siderFold: !state.siderFold, + } + }, + + switchTheme (state) { + window.localStorage.setItem(`${prefix}darkTheme`, !state.darkTheme) + return { + ...state, + darkTheme: !state.darkTheme, + } + }, + + switchMenuPopver (state) { + return { + ...state, + menuPopoverVisible: !state.menuPopoverVisible, + } + }, + + handleNavbar (state, { payload }) { + return { + ...state, + isNavbar: payload, + } + }, + + handleNavOpenKeys (state, { payload: navOpenKeys }) { + return { + ...state, + ...navOpenKeys, + } + }, + }, +} diff --git a/src/models/dashboard.js b/src/models/dashboard.js index f3ae5e7..aed1dda 100644 --- a/src/models/dashboard.js +++ b/src/models/dashboard.js @@ -1,227 +1,227 @@ -import { parse } from 'qs' -import { myCity, queryWeather, query } from 'services/dashboard' - -// zuimei 摘自 http://www.zuimeitianqi.com/res/js/index.js -let zuimei = { - parseActualData (actual) { - let weather = { - icon: `http://www.zuimeitianqi.com/res/icon/${zuimei.getIconName(actual.wea, 'big')}`, - name: zuimei.getWeatherName(actual.wea), - temperature: actual.tmp, - dateTime: new Date(actual.PTm).format('MM-dd hh:mm'), - } - return weather - }, - - getIconName (wea, flg) { - let myDate = new Date() - let hour = myDate.getHours() - let num = 0 - if (wea.indexOf('/') !== -1) { - let weas = wea.split('/') - if (hour < 12) { - num = zuimei.replaceIcon(weas[0]) - if (num < 6) { - num = `${num}_${flg}_night.png` - } else { - num = `${num}_${flg}.png` - } - } else if (hour >= 12) { - num = zuimei.replaceIcon(weas[1]) - if (hour >= 18) { - num = `${num}_${flg}_night.png` - } else { - num = `${num}_${flg}.png` - } - } - } else if ((hour >= 18 && hour <= 23) || (hour >= 0 && hour <= 6)) { - num = `${num}_${flg}_night.png` - } else { - num = `${num}_${flg}.png` - } - - return num - }, - - replaceIcon (num) { - if (num === 21) { - num = 7 - } else if (num === 22) { - num = 8 - } else if (num === 10 || num === 11 || num === 12 || num === 23 || num === 24 || num === 25) { - num = 9 - } else if (num === 13 || num === 15 || num === 26 || num === 27 || num === 34) { - num = 14 - } else if (num === 17 || num === 28) { - num = 16 - } else if (num === 35) { - num = 18 - } else if (num === 31 || num === 32 || num === 33) { - num = 20 - } else if (num === 30) { - num = 29 - } - - return num - }, - - getWeatherName (wea) { - let name = '' - if (wea.indexOf('/') !== -1) { - let weas = wea.split('/') - name = `${zuimei.getWeatherByCode(weas[0])}转${zuimei.getWeatherByCode(weas[1])}` - } else { - name = zuimei.getWeatherByCode(wea) - } - - return name - }, - - getWeatherByCode (number) { - let wea = '' - let num = Number(number) - if (num === 0) { - wea = '晴' - } else if (num === 1) { - wea = '多云' - } else if (num === 2) { - wea = '阴' - } else if (num === 3) { - wea = '阵雨' - } else if (num === 4) { - wea = '雷阵雨' - } else if (num === 5) { - wea = '雷阵雨并伴有冰雹' - } else if (num === 6) { - wea = '雨夹雪' - } else if (num === 7) { - wea = '小雨' - } else if (num === 8) { - wea = '中雨' - } else if (num === 9) { - wea = '大雨' - } else if (num === 10) { - wea = '暴雨' - } else if (num === 11) { - wea = '大暴雨' - } else if (num === 12) { - wea = '特大暴雨' - } else if (num === 13) { - wea = '阵雪' - } else if (num === 14) { - wea = '小雪' - } else if (num === 15) { - wea = '中雪' - } else if (num === 16) { - wea = '大雪' - } else if (num === 17) { - wea = '暴雪' - } else if (num === 18) { - wea = '雾' - } else if (num === 19) { - wea = '冻雨' - } else if (num === 20) { - wea = '沙尘暴' - } else if (num === 21) { - wea = '小雨-中雨' - } else if (num === 22) { - wea = '中雨-大雨' - } else if (num === 23) { - wea = '大雨-暴雨' - } else if (num === 24) { - wea = '暴雨-大暴雨' - } else if (num === 25) { - wea = '大暴雨-特大暴雨' - } else if (num === 26) { - wea = '小雪-中雪' - } else if (num === 27) { - wea = '中雪-大雪' - } else if (num === 28) { - wea = '大雪-暴雪' - } else if (num === 29) { - wea = '浮沉' - } else if (num === 30) { - wea = '扬沙' - } else if (num === 31) { - wea = '强沙尘暴' - } else if (num === 32) { - wea = '飑' - } else if (num === 33) { - wea = '龙卷风' - } else if (num === 34) { - wea = '若高吹雪' - } else if (num === 35) { - wea = '轻雾' - } else if (num === 53) { - wea = '霾' - } else if (num === 99) { - wea = '未知' - } - - return wea - }, -} - -export default { - namespace: 'dashboard', - state: { - weather: { - city: '成都', - temperature: '5', - name: '晴', - icon: 'http://www.zuimeitianqi.com/res/icon/0_big.png', - dateTime: new Date().format('MM-dd hh:mm'), - }, - sales: [], - quote: { - avatar: 'http://img.hb.aicdn.com/bc442cf0cc6f7940dcc567e465048d1a8d634493198c4-sPx5BR_fw236', - }, - numbers: [], - recentSales: [], - comments: [], - completed: [], - browser: [], - cpu: {}, - user: { - avatar: 'http://img.hb.aicdn.com/bc442cf0cc6f7940dcc567e465048d1a8d634493198c4-sPx5BR_fw236', - }, - }, - subscriptions: { - setup ({ dispatch }) { - dispatch({ type: 'query' }) - dispatch({ type: 'queryWeather' }) - }, - }, - effects: { - * query ({ - payload, - }, { call, put }) { - const data = yield call(query, parse(payload)) - yield put({ type: 'queryWeather', payload: { ...data } }) - }, - * queryWeather (action, { call, put }) { - const myCityResult = yield call(myCity, { flg: 0 }) - const result = yield call(queryWeather, { cityCode: myCityResult.selectCityCode }) - const weather = zuimei.parseActualData(result.data.actual) - weather.city = myCityResult.selectCityName - yield put({ type: 'queryWeatherSuccess', - payload: { - weather, - } }) - }, - }, - reducers: { - queryWeatherSuccess (state, action) { - return { - ...state, - ...action.payload, - } - }, - queryWeather (state, action) { - return { - ...state, - ...action.payload, - } - }, - }, -} +import { parse } from 'qs' +import { myCity, queryWeather, query } from 'services/dashboard' + +// zuimei 摘自 http://www.zuimeitianqi.com/res/js/index.js +let zuimei = { + parseActualData (actual) { + let weather = { + icon: `http://www.zuimeitianqi.com/res/icon/${zuimei.getIconName(actual.wea, 'big')}`, + name: zuimei.getWeatherName(actual.wea), + temperature: actual.tmp, + dateTime: new Date(actual.PTm).format('MM-dd hh:mm'), + } + return weather + }, + + getIconName (wea, flg) { + let myDate = new Date() + let hour = myDate.getHours() + let num = 0 + if (wea.indexOf('/') !== -1) { + let weas = wea.split('/') + if (hour < 12) { + num = zuimei.replaceIcon(weas[0]) + if (num < 6) { + num = `${num}_${flg}_night.png` + } else { + num = `${num}_${flg}.png` + } + } else if (hour >= 12) { + num = zuimei.replaceIcon(weas[1]) + if (hour >= 18) { + num = `${num}_${flg}_night.png` + } else { + num = `${num}_${flg}.png` + } + } + } else if ((hour >= 18 && hour <= 23) || (hour >= 0 && hour <= 6)) { + num = `${num}_${flg}_night.png` + } else { + num = `${num}_${flg}.png` + } + + return num + }, + + replaceIcon (num) { + if (num === 21) { + num = 7 + } else if (num === 22) { + num = 8 + } else if (num === 10 || num === 11 || num === 12 || num === 23 || num === 24 || num === 25) { + num = 9 + } else if (num === 13 || num === 15 || num === 26 || num === 27 || num === 34) { + num = 14 + } else if (num === 17 || num === 28) { + num = 16 + } else if (num === 35) { + num = 18 + } else if (num === 31 || num === 32 || num === 33) { + num = 20 + } else if (num === 30) { + num = 29 + } + + return num + }, + + getWeatherName (wea) { + let name = '' + if (wea.indexOf('/') !== -1) { + let weas = wea.split('/') + name = `${zuimei.getWeatherByCode(weas[0])}转${zuimei.getWeatherByCode(weas[1])}` + } else { + name = zuimei.getWeatherByCode(wea) + } + + return name + }, + + getWeatherByCode (number) { + let wea = '' + let num = Number(number) + if (num === 0) { + wea = '晴' + } else if (num === 1) { + wea = '多云' + } else if (num === 2) { + wea = '阴' + } else if (num === 3) { + wea = '阵雨' + } else if (num === 4) { + wea = '雷阵雨' + } else if (num === 5) { + wea = '雷阵雨并伴有冰雹' + } else if (num === 6) { + wea = '雨夹雪' + } else if (num === 7) { + wea = '小雨' + } else if (num === 8) { + wea = '中雨' + } else if (num === 9) { + wea = '大雨' + } else if (num === 10) { + wea = '暴雨' + } else if (num === 11) { + wea = '大暴雨' + } else if (num === 12) { + wea = '特大暴雨' + } else if (num === 13) { + wea = '阵雪' + } else if (num === 14) { + wea = '小雪' + } else if (num === 15) { + wea = '中雪' + } else if (num === 16) { + wea = '大雪' + } else if (num === 17) { + wea = '暴雪' + } else if (num === 18) { + wea = '雾' + } else if (num === 19) { + wea = '冻雨' + } else if (num === 20) { + wea = '沙尘暴' + } else if (num === 21) { + wea = '小雨-中雨' + } else if (num === 22) { + wea = '中雨-大雨' + } else if (num === 23) { + wea = '大雨-暴雨' + } else if (num === 24) { + wea = '暴雨-大暴雨' + } else if (num === 25) { + wea = '大暴雨-特大暴雨' + } else if (num === 26) { + wea = '小雪-中雪' + } else if (num === 27) { + wea = '中雪-大雪' + } else if (num === 28) { + wea = '大雪-暴雪' + } else if (num === 29) { + wea = '浮沉' + } else if (num === 30) { + wea = '扬沙' + } else if (num === 31) { + wea = '强沙尘暴' + } else if (num === 32) { + wea = '飑' + } else if (num === 33) { + wea = '龙卷风' + } else if (num === 34) { + wea = '若高吹雪' + } else if (num === 35) { + wea = '轻雾' + } else if (num === 53) { + wea = '霾' + } else if (num === 99) { + wea = '未知' + } + + return wea + }, +} + +export default { + namespace: 'dashboard', + state: { + weather: { + city: '成都', + temperature: '5', + name: '晴', + icon: 'http://www.zuimeitianqi.com/res/icon/0_big.png', + dateTime: new Date().format('MM-dd hh:mm'), + }, + sales: [], + quote: { + avatar: 'http://img.hb.aicdn.com/bc442cf0cc6f7940dcc567e465048d1a8d634493198c4-sPx5BR_fw236', + }, + numbers: [], + recentSales: [], + comments: [], + completed: [], + browser: [], + cpu: {}, + user: { + avatar: 'http://img.hb.aicdn.com/bc442cf0cc6f7940dcc567e465048d1a8d634493198c4-sPx5BR_fw236', + }, + }, + subscriptions: { + setup ({ dispatch }) { + dispatch({ type: 'query' }) + dispatch({ type: 'queryWeather' }) + }, + }, + effects: { + * query ({ + payload, + }, { call, put }) { + const data = yield call(query, parse(payload)) + yield put({ type: 'queryWeather', payload: { ...data } }) + }, + * queryWeather (action, { call, put }) { + const myCityResult = yield call(myCity, { flg: 0 }) + const result = yield call(queryWeather, { cityCode: myCityResult.selectCityCode }) + const weather = zuimei.parseActualData(result.data.actual) + weather.city = myCityResult.selectCityName + yield put({ type: 'queryWeatherSuccess', + payload: { + weather, + } }) + }, + }, + reducers: { + queryWeatherSuccess (state, action) { + return { + ...state, + ...action.payload, + } + }, + queryWeather (state, action) { + return { + ...state, + ...action.payload, + } + }, + }, +} diff --git a/src/models/login.js b/src/models/login.js index 9ea11f0..3777c70 100644 --- a/src/models/login.js +++ b/src/models/login.js @@ -1,45 +1,45 @@ -import { routerRedux } from 'dva/router' -import { queryURL } from 'utils' -import { login } from 'services/login' - -export default { - namespace: 'login', - state: { - loginLoading: false, - }, - - effects: { - * login ({ - payload, - }, { put, call }) { - yield put({ type: 'showLoginLoading' }) - const data = yield call(login, payload) - yield put({ type: 'hideLoginLoading' }) - if (data.success) { - const from = queryURL('from') - yield put({ type: 'app/query' }) - if (from) { - yield put(routerRedux.push(from)) - } else { - yield put(routerRedux.push('/dashboard')) - } - } else { - throw data - } - }, - }, - reducers: { - showLoginLoading (state) { - return { - ...state, - loginLoading: true, - } - }, - hideLoginLoading (state) { - return { - ...state, - loginLoading: false, - } - }, - }, -} +import { routerRedux } from 'dva/router' +import { queryURL } from 'utils' +import { login } from 'services/login' + +export default { + namespace: 'login', + state: { + loginLoading: false, + }, + + effects: { + * login ({ + payload, + }, { put, call }) { + yield put({ type: 'showLoginLoading' }) + const data = yield call(login, payload) + yield put({ type: 'hideLoginLoading' }) + if (data.success) { + const from = queryURL('from') + yield put({ type: 'app/query' }) + if (from) { + yield put(routerRedux.push(from)) + } else { + yield put(routerRedux.push('/dashboard')) + } + } else { + throw data + } + }, + }, + reducers: { + showLoginLoading (state) { + return { + ...state, + loginLoading: true, + } + }, + hideLoginLoading (state) { + return { + ...state, + loginLoading: false, + } + }, + }, +} diff --git a/src/models/user.js b/src/models/user.js index b1b2f54..0a789e7 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -1,115 +1,115 @@ -/* global window */ -import modelExtend from 'dva-model-extend' -import { config } from 'utils' -import { create, remove, update } from 'services/user' -import * as usersService from 'services/users' -import { pageModel } from './common' - -const { query } = usersService -const { prefix } = config - -export default modelExtend(pageModel, { - namespace: 'user', - - state: { - currentItem: {}, - modalVisible: false, - modalType: 'create', - selectedRowKeys: [], - isMotion: window.localStorage.getItem(`${prefix}userIsMotion`) === 'true', - }, - - subscriptions: { - setup ({ dispatch, history }) { - history.listen((location) => { - if (location.pathname === '/user') { - dispatch({ - type: 'query', - payload: location.query, - }) - } - }) - }, - }, - - effects: { - - * query ({ payload = {} }, { call, put }) { - const data = yield call(query, payload) - if (data) { - yield put({ - type: 'querySuccess', - payload: { - list: data.data, - pagination: { - current: Number(payload.page) || 1, - pageSize: Number(payload.pageSize) || 10, - total: data.total, - }, - }, - }) - } - }, - - * delete ({ payload }, { call, put, select }) { - const data = yield call(remove, { id: payload }) - const { selectedRowKeys } = yield select(_ => _.user) - if (data.success) { - yield put({ type: 'updateState', payload: { selectedRowKeys: selectedRowKeys.filter(_ => _ !== payload) } }) - yield put({ type: 'query' }) - } else { - throw data - } - }, - - * multiDelete ({ payload }, { call, put }) { - const data = yield call(usersService.remove, payload) - if (data.success) { - yield put({ type: 'updateState', payload: { selectedRowKeys: [] } }) - yield put({ type: 'query' }) - } else { - throw data - } - }, - - * create ({ payload }, { call, put }) { - const data = yield call(create, payload) - if (data.success) { - yield put({ type: 'hideModal' }) - yield put({ type: 'query' }) - } else { - throw data - } - }, - - * update ({ payload }, { select, call, put }) { - const id = yield select(({ user }) => user.currentItem.id) - const newUser = { ...payload, id } - const data = yield call(update, newUser) - if (data.success) { - yield put({ type: 'hideModal' }) - yield put({ type: 'query' }) - } else { - throw data - } - }, - - }, - - reducers: { - - showModal (state, { payload }) { - return { ...state, ...payload, modalVisible: true } - }, - - hideModal (state) { - return { ...state, modalVisible: false } - }, - - switchIsMotion (state) { - window.localStorage.setItem(`${prefix}userIsMotion`, !state.isMotion) - return { ...state, isMotion: !state.isMotion } - }, - - }, -}) +/* global window */ +import modelExtend from 'dva-model-extend' +import { config } from 'utils' +import { create, remove, update } from 'services/user' +import * as usersService from 'services/users' +import { pageModel } from './common' + +const { query } = usersService +const { prefix } = config + +export default modelExtend(pageModel, { + namespace: 'user', + + state: { + currentItem: {}, + modalVisible: false, + modalType: 'create', + selectedRowKeys: [], + isMotion: window.localStorage.getItem(`${prefix}userIsMotion`) === 'true', + }, + + subscriptions: { + setup ({ dispatch, history }) { + history.listen((location) => { + if (location.pathname === '/user') { + dispatch({ + type: 'query', + payload: location.query, + }) + } + }) + }, + }, + + effects: { + + * query ({ payload = {} }, { call, put }) { + const data = yield call(query, payload) + if (data) { + yield put({ + type: 'querySuccess', + payload: { + list: data.data, + pagination: { + current: Number(payload.page) || 1, + pageSize: Number(payload.pageSize) || 10, + total: data.total, + }, + }, + }) + } + }, + + * delete ({ payload }, { call, put, select }) { + const data = yield call(remove, { id: payload }) + const { selectedRowKeys } = yield select(_ => _.user) + if (data.success) { + yield put({ type: 'updateState', payload: { selectedRowKeys: selectedRowKeys.filter(_ => _ !== payload) } }) + yield put({ type: 'query' }) + } else { + throw data + } + }, + + * multiDelete ({ payload }, { call, put }) { + const data = yield call(usersService.remove, payload) + if (data.success) { + yield put({ type: 'updateState', payload: { selectedRowKeys: [] } }) + yield put({ type: 'query' }) + } else { + throw data + } + }, + + * create ({ payload }, { call, put }) { + const data = yield call(create, payload) + if (data.success) { + yield put({ type: 'hideModal' }) + yield put({ type: 'query' }) + } else { + throw data + } + }, + + * update ({ payload }, { select, call, put }) { + const id = yield select(({ user }) => user.currentItem.id) + const newUser = { ...payload, id } + const data = yield call(update, newUser) + if (data.success) { + yield put({ type: 'hideModal' }) + yield put({ type: 'query' }) + } else { + throw data + } + }, + + }, + + reducers: { + + showModal (state, { payload }) { + return { ...state, ...payload, modalVisible: true } + }, + + hideModal (state) { + return { ...state, modalVisible: false } + }, + + switchIsMotion (state) { + window.localStorage.setItem(`${prefix}userIsMotion`, !state.isMotion) + return { ...state, isMotion: !state.isMotion } + }, + + }, +})