Commit 1e90e94c authored by nano's avatar nano

sos login

parent 9be8fb1b
This diff is collapsed.
...@@ -2,6 +2,6 @@ export default { ...@@ -2,6 +2,6 @@ export default {
apiRoot: 'http://localhost:8001', apiRoot: 'http://localhost:8001',
imgRoot: 'http://node:7888', imgRoot: 'http://node:7888',
returnSSO: 'http://localhost:8000/loginCallback', returnSSO: 'http://localhost:8000/loginCallback',
SSOProvider: 'https://ygobbs.com/session/sso_provider' SSOProvider: 'https://accounts.moecube.com/'
// SSOProvider: 'http://localhost:8081' // SSOProvider: 'http://localhost:8081'
} }
...@@ -43,14 +43,17 @@ export default { ...@@ -43,14 +43,17 @@ export default {
} }
}, },
effects: { effects: {
*submit({payload}, {call, put}){ *create({payload}, {call, put, select}){
yield put({type: 'SubmitRequest', payload}) yield put({type: 'SubmitRequest', payload})
const {user} = yield select(state => state.user)
const params = { const params = {
id: payload.id, id: payload.id,
name: { name: {
[payload.locale]: payload.name [payload.locale]: payload.name
} },
author: user.id,
} }
try { try {
...@@ -58,6 +61,7 @@ export default { ...@@ -58,6 +61,7 @@ export default {
if (data) { if (data) {
yield put({type: 'SubmitSuccess'}) yield put({type: 'SubmitSuccess'})
yield put({type: 'reset'}) yield put({type: 'reset'})
yield put({type: 'Apps/fetch'})
message.info("i18n 创建成功") message.info("i18n 创建成功")
} }
} catch (error) { } catch (error) {
......
import {fetch, update} from '../services/Apps' import {fetch, update} from '../services/Apps'
import * as crypto from 'crypto'
import {message} from 'antd' import {message} from 'antd'
import config from '../config'
export default { export default {
...@@ -18,10 +16,12 @@ export default { ...@@ -18,10 +16,12 @@ export default {
}, },
}, },
effects: { effects: {
*fetch({payload}, {call, put}) { *fetch({payload}, {call, put, select}) {
const {user: {id: author, admin}} = yield select(state => state.user)
try { try {
const {data} = yield call(fetch, payload) const {data} = yield call(fetch, {...payload, author, admin})
let apps = {} let apps = {}
if (data && data.length > 0) { if (data && data.length > 0) {
...@@ -65,22 +65,6 @@ export default { ...@@ -65,22 +65,6 @@ export default {
subscriptions: { subscriptions: {
setup({dispatch, history}) { setup({dispatch, history}) {
dispatch({type: 'fetch'})
return history.listen(({pathname, query}) => {
if (pathname === '/login') {
let params = new URLSearchParams()
params.set('return_sso_url', config.returnSSO)
let payload = Buffer.from(params.toString()).toString('base64')
let url = new URL(config.SSOProvider)
params = url['searchParams'];
params.set('sso', payload);
params.set('sig', crypto.createHmac('sha256', 'zsZv6LXHDwwtUAGa').update(payload).digest('hex'))
window.location.href = url
}
})
} }
}, },
}; };
import {routerRedux} from 'dva/router'
import config from '../config'
import * as crypto from 'crypto'
export default { export default {
namespace: 'Common', namespace: 'Common',
...@@ -8,9 +11,39 @@ export default { ...@@ -8,9 +11,39 @@ export default {
reducers: { reducers: {
collapsed (state) { collapsed (state) {
const mode = state.collapsed ? 'inline' : 'vertical' const mode = state.collapsed ? 'inline' : 'vertical'
return { ...state, collapsed: !state.collapsed, mode } return {...state, collapsed: !state.collapsed, mode}
}
},
effects: {
*init({payload}, {put, call, select}) {
const {user} = yield select(state => state.user)
if (!user) {
yield put(routerRedux.replace('/login'))
}
// yield put({ type: 'Apps/fetch' })
}
},
subscriptions: {
setup({dispatch, history}) {
if (location.pathname != '/loginCallback') {
dispatch({type: 'init'})
}
return history.listen(({pathname, query}) => {
if (pathname === '/login') {
let params = new URLSearchParams()
params.set('return_sso_url', config.returnSSO)
let payload = Buffer.from(params.toString()).toString('base64')
let url = new URL(config.SSOProvider)
params = url['searchParams'];
params.set('sso', payload);
params.set('sig', crypto.createHmac('sha256', 'zsZv6LXHDwwtUAGa').update(payload).digest('hex'))
window.location.href = url
} else if (pathname === '/apps') {
dispatch({ type: 'Apps/fetch', query })
}
})
} }
}, },
effects: {},
subscriptions: {},
}; };
export default {
namespace: 'example',
state: {},
subscriptions: {
setup({ dispatch, history }) { // eslint-disable-line
},
},
effects: {
*fetch({ payload }, { call, put }) { // eslint-disable-line
yield put({ type: 'save' });
},
},
reducers: {
save(state, action) {
return { ...state, ...action.payload };
},
},
};
import {routerRedux} from 'dva/router'
export default { export default {
namespace: 'user', namespace: 'user',
state: { state: {
}, },
reducers: { reducers: {
change(state, action){ ssoLogin(state, action){
return { return {
...state, ...action.payload ...state, ...action.payload
} }
} }
}, },
effects: {}, effects: {
*ssoLogin({payload}, {put, call}) {
yield put(routerRedux.push('/apps'))
}
},
subscriptions: {}, subscriptions: {},
}; };
import React from 'react'; import React from 'react';
import { Router, Route } from 'dva/router'; import { Router, Route } from 'dva/router';
import IndexPage from './routes/IndexPage';
import Apps from "./routes/Apps.js"; import Apps from "./routes/Apps.js";
import AppDetail from './routes/AppDetail.js' import AppDetail from './routes/AppDetail.js'
import Entry from "./routes/Entry.js"; import Entry from "./routes/Entry.js";
......
...@@ -123,25 +123,26 @@ class AppDetail extends React.Component { ...@@ -123,25 +123,26 @@ class AppDetail extends React.Component {
}); });
} }
handleChangeIco = ({fileList}) => { handleChangeIco = ({file, fileList}) => {
this.setState({iconList: fileList}) this.setState({iconList: fileList})
this.handleUpdateImg({fileList, field: 'icon'}) this.handleUpdateImg({file, fileList, field: 'icon'})
} }
handleChangeCover = ({fileList}) => { handleChangeCover = ({file, fileList}) => {
this.setState({coverList: fileList}) this.setState({coverList: fileList})
this.handleUpdateImg({fileList, field: 'cover'}) this.handleUpdateImg({file, fileList, field: 'cover'})
} }
handleChangeBackground = ({fileList}) => { handleChangeBackground = ({file, fileList}) => {
this.setState({backgroundList: fileList}) this.setState({backgroundList: fileList})
this.handleUpdateImg({fileList, field: 'background'}) this.handleUpdateImg({file, fileList, field: 'background'})
} }
handleUpdateImg = ({field, fileList}) => { handleUpdateImg = ({file, field, fileList}) => {
const {form, dispatch, params: {id}} = this.props const {form, dispatch, params: {id}} = this.props
const [img] = fileList if (file.status === 'done') {
if (img.status === 'done') {
const [res] = img.response const [res] = img.response
dispatch({type: "Apps/update", payload: {id, [field]: res.Key}}) dispatch({type: "Apps/update", payload: {id, [field]: res.Key}})
} else if (file.status === 'error') {
message.error(file.response.message);
} }
} }
...@@ -187,7 +188,9 @@ class AppDetail extends React.Component { ...@@ -187,7 +188,9 @@ class AppDetail extends React.Component {
const {version, actions, references, dependencies} = values const {version, actions, references, dependencies} = values
Object.keys(actions).forEach((platform) => { Object.keys(actions).forEach((platform) => {
if(actions[platform]) {
actions[platform] = JSON.parse(actions[platform]) actions[platform] = JSON.parse(actions[platform])
}
}) })
dispatch({type: "Apps/update", payload: {id, version, actions, references, dependencies}}) dispatch({type: "Apps/update", payload: {id, version, actions, references, dependencies}})
...@@ -376,7 +379,7 @@ class AppDetail extends React.Component { ...@@ -376,7 +379,7 @@ class AppDetail extends React.Component {
return ( return (
<Spin spinning={loading.global}> <Spin spinning={loading.global}>
<Tabs defaultActiveKey="1" className="app-detail-nav" type="card"> <Tabs defaultActiveKey="1" className="app-detail-nav">
<TabPane tab={<span><Icon type="setting"/> 基本信息 </span>} key="1"> <TabPane tab={<span><Icon type="setting"/> 基本信息 </span>} key="1">
<div className={styles.form}> <div className={styles.form}>
<Form onSubmit={this.onSubmitBase}> <Form onSubmit={this.onSubmitBase}>
...@@ -392,7 +395,7 @@ class AppDetail extends React.Component { ...@@ -392,7 +395,7 @@ class AppDetail extends React.Component {
<div className="clearfix"> <div className="clearfix">
<Upload <Upload
multiple={false} multiple={false}
action={`${config.apiRoot}/upload/image`} action={`${config.apiRoot}/v1/upload/image`}
listType="picture-card" listType="picture-card"
className="upload-icon" className="upload-icon"
fileList={iconList} fileList={iconList}
...@@ -418,7 +421,7 @@ class AppDetail extends React.Component { ...@@ -418,7 +421,7 @@ class AppDetail extends React.Component {
<div className="clearfix"> <div className="clearfix">
<Upload <Upload
multiple={false} multiple={false}
action={`${config.apiRoot}/upload/image`} action={`${config.apiRoot}/v1/upload/image`}
listType="picture-card" listType="picture-card"
className="upload-icon" className="upload-icon"
fileList={coverList} fileList={coverList}
...@@ -444,7 +447,7 @@ class AppDetail extends React.Component { ...@@ -444,7 +447,7 @@ class AppDetail extends React.Component {
<div className="clearfix"> <div className="clearfix">
<Upload <Upload
multiple={false} multiple={false}
action={`${config.apiRoot}/upload/image`} action={`${config.apiRoot}/v1/upload/image`}
listType="picture-card" listType="picture-card"
className="upload-icon" className="upload-icon"
fileList={backgroundList} fileList={backgroundList}
...@@ -899,7 +902,7 @@ class AppDetail extends React.Component { ...@@ -899,7 +902,7 @@ class AppDetail extends React.Component {
} }
}} }}
disabled={ pack.status !== 'init' && pack.status !== 'failed'} disabled={ pack.status !== 'init' && pack.status !== 'failed'}
action={`${config.apiRoot}/upload/package/${pack["_id"]}`} action={`${config.apiRoot}/v1/upload/package/${pack["_id"]}`}
> >
<p className="ant-upload-drag-icon"> <p className="ant-upload-drag-icon">
<Icon type="inbox"/> <Icon type="inbox"/>
......
...@@ -55,7 +55,7 @@ function Apps({children, dispatch, isCreate, isSubmit, apps}) { ...@@ -55,7 +55,7 @@ function Apps({children, dispatch, isCreate, isSubmit, apps}) {
isLoading: isSubmit, isLoading: isSubmit,
onCancel: () => dispatch({ type: 'App/onCancel'}), onCancel: () => dispatch({ type: 'App/onCancel'}),
onCreate: () => dispatch({ type: 'App/onCreate'}), onCreate: () => dispatch({ type: 'App/onCreate'}),
onSubmit: (payload) => dispatch({ type: 'App/submit', payload}), onSubmit: (payload) => dispatch({ type: 'App/create', payload}),
} }
const CreateButtonProps = { const CreateButtonProps = {
...@@ -91,7 +91,7 @@ function Apps({children, dispatch, isCreate, isSubmit, apps}) { ...@@ -91,7 +91,7 @@ function Apps({children, dispatch, isCreate, isSubmit, apps}) {
function mapStateToProps(state) { function mapStateToProps(state) {
const { const {
Apps: { apps }, Apps: { apps },
App: { isCreate, isSubmit } App: { isCreate, isSubmit },
} = state } = state
return { return {
apps, apps,
......
.normal {
font-family: Georgia, sans-serif;
margin-top: 3em;
text-align: center;
}
.title {
font-size: 2.5rem;
font-weight: normal;
letter-spacing: -1px;
}
.welcome {
height: 328px;
background: url(../assets/yay.jpg) no-repeat center 0;
background-size: 388px 328px;
}
.list {
font-size: 1.2em;
margin-top: 1.8em;
list-style: none;
line-height: 1.5em;
}
.list code {
background: #f7f7f7;
}
import React from 'react';
import { connect } from 'dva';
import styles from './IndexPage.css';
function IndexPage() {
return (
<div className={styles.normal}>
<h1 className={styles.title}>Yay! Welcome to dva!</h1>
<div className={styles.welcome} />
<ul className={styles.list}>
<li>To get started, edit <code>src/index.js</code> and save to reload.</li>
<li><a href="https://github.com/dvajs/dva-docs/blob/master/v1/en-us/getting-started.md">Getting Started</a></li>
</ul>
</div>
);
}
IndexPage.propTypes = {
};
export default connect()(IndexPage);
import React from 'react';
import { connect } from 'dva';
import styles from './Login.css';
function Login() {
return (
<div className={styles.normal}>
Route Component: Login
</div>
);
}
function mapStateToProps() {
return {};
}
export default connect(mapStateToProps)(Login);
import React from 'react'; import React from 'react';
import { connect } from 'dva'; import {connect} from 'dva';
import styles from './LoginCallback.css'; import styles from './LoginCallback.css';
class LoginCallback extends React.Component{ class LoginCallback extends React.Component {
componentDidMount() { componentDidMount() {
const { location: { query: { sso }}, dispatch } = this.props const {location: {query: {sso}}, dispatch} = this.props
console.log(this.props) const user = toObject(new URLSearchParams(Buffer.from(sso, 'base64').toString()))
const data = toObject(new URLSearchParams(Buffer.from(sso, 'base64').toString()))
if (data) { if (user) {
dispatch({type: "user/change", payload:{ data }}) dispatch({type: "user/ssoLogin", payload: { user } })
localStorage.setItem("user", JSON.stringify(data))
} }
} }
render(){ render() {
const {dispatch, location} = this.props const {dispatch, location} = this.props
return ( return (
...@@ -26,8 +24,7 @@ class LoginCallback extends React.Component{ ...@@ -26,8 +24,7 @@ class LoginCallback extends React.Component{
) )
} }
} }
function LoginCallback({ }) { function LoginCallback({}) {
return ( return (
...@@ -37,14 +34,12 @@ function LoginCallback({ }) { ...@@ -37,14 +34,12 @@ function LoginCallback({ }) {
); );
} }
function mapStateToProps({ }) { function mapStateToProps({}) {
return { return {};
};
} }
function toObject(entries){ function toObject(entries) {
let result = {}; let result = {};
for (let [key, value] of entries) { for (let [key, value] of entries) {
result[key] = value; result[key] = value;
......
import * as qs from 'qs'
import request from '../utils/request' import request from '../utils/request'
export async function fetch() { export async function fetch(params) {
return request(`/apps`)
return request(`/v1/apps?${qs.stringify(params)}`)
} }
export async function create(params) { export async function create(params) {
return request(`/apps/${params.id}`, { return request(`/v1/app/${params.id}`, {
method: 'POST', method: 'POST',
body: JSON.stringify(params) body: JSON.stringify(params)
}) })
} }
export async function update(params) { export async function update(params) {
return request(`/apps/${params.id}`, { return request(`/v1/app/${params.id}`, {
method: 'PATCH', method: 'PATCH',
body: JSON.stringify(params) body: JSON.stringify(params)
}) })
......
...@@ -2,34 +2,34 @@ import request from '../utils/request' ...@@ -2,34 +2,34 @@ import request from '../utils/request'
export async function add(params) { export async function add(params) {
return request(`/packages`, { return request(`/v1/package`, {
method: 'POST', method: 'POST',
body: JSON.stringify(params) body: JSON.stringify(params)
}) })
} }
export async function patch(params) { export async function patch(params) {
return request(`/packages`, { return request(`/v1/package`, {
method: 'PATCH', method: 'PATCH',
body: JSON.stringify(params) body: JSON.stringify(params)
}) })
} }
export async function fetch(params) { export async function fetch(params) {
return request(`/packages/manage?appId=${params.appId}`, { return request(`/v1/packages?appId=${params.appId}`, {
method: 'GET', method: 'GET',
}) })
} }
export async function urlUpload(params) { export async function urlUpload(params) {
return request('/upload/packageUrl', { return request('/v1/upload/packageUrl', {
method: 'POST', method: 'POST',
body: JSON.stringify(params) body: JSON.stringify(params)
}) })
} }
export async function del(params) { export async function del(params) {
return request(`/packages`, { return request(`/v1/package`, {
method: 'DELETE', method: 'DELETE',
body: JSON.stringify(params) body: JSON.stringify(params)
}) })
......
import request from '../utils/request';
export async function query() {
return request('/api/users');
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment