Commit 1e90e94c authored by nano's avatar nano

sos login

parent 9be8fb1b
This diff is collapsed.
......@@ -2,6 +2,6 @@ export default {
apiRoot: 'http://localhost:8001',
imgRoot: 'http://node:7888',
returnSSO: 'http://localhost:8000/loginCallback',
SSOProvider: 'https://ygobbs.com/session/sso_provider'
SSOProvider: 'https://accounts.moecube.com/'
// SSOProvider: 'http://localhost:8081'
}
\ No newline at end of file
}
......@@ -43,14 +43,17 @@ export default {
}
},
effects: {
*submit({payload}, {call, put}){
*create({payload}, {call, put, select}){
yield put({type: 'SubmitRequest', payload})
const {user} = yield select(state => state.user)
const params = {
id: payload.id,
name: {
[payload.locale]: payload.name
}
},
author: user.id,
}
try {
......@@ -58,6 +61,7 @@ export default {
if (data) {
yield put({type: 'SubmitSuccess'})
yield put({type: 'reset'})
yield put({type: 'Apps/fetch'})
message.info("i18n 创建成功")
}
} catch (error) {
......
import {fetch, update} from '../services/Apps'
import * as crypto from 'crypto'
import {message} from 'antd'
import config from '../config'
export default {
......@@ -18,10 +16,12 @@ export default {
},
},
effects: {
*fetch({payload}, {call, put}) {
*fetch({payload}, {call, put, select}) {
const {user: {id: author, admin}} = yield select(state => state.user)
try {
const {data} = yield call(fetch, payload)
const {data} = yield call(fetch, {...payload, author, admin})
let apps = {}
if (data && data.length > 0) {
......@@ -65,22 +65,6 @@ export default {
subscriptions: {
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 {
namespace: 'Common',
......@@ -8,9 +11,39 @@ export default {
reducers: {
collapsed (state) {
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 {
namespace: 'user',
state: {
},
reducers: {
change(state, action){
ssoLogin(state, action){
return {
...state, ...action.payload
}
}
},
effects: {},
effects: {
*ssoLogin({payload}, {put, call}) {
yield put(routerRedux.push('/apps'))
}
},
subscriptions: {},
};
import React from 'react';
import { Router, Route } from 'dva/router';
import IndexPage from './routes/IndexPage';
import Apps from "./routes/Apps.js";
import AppDetail from './routes/AppDetail.js'
import Entry from "./routes/Entry.js";
......
......@@ -123,25 +123,26 @@ class AppDetail extends React.Component {
});
}
handleChangeIco = ({fileList}) => {
handleChangeIco = ({file, 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.handleUpdateImg({fileList, field: 'cover'})
this.handleUpdateImg({file, fileList, field: 'cover'})
}
handleChangeBackground = ({fileList}) => {
handleChangeBackground = ({file, 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 [img] = fileList
if (img.status === 'done') {
if (file.status === 'done') {
const [res] = img.response
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 {
const {version, actions, references, dependencies} = values
Object.keys(actions).forEach((platform) => {
actions[platform] = JSON.parse(actions[platform])
if(actions[platform]) {
actions[platform] = JSON.parse(actions[platform])
}
})
dispatch({type: "Apps/update", payload: {id, version, actions, references, dependencies}})
......@@ -376,7 +379,7 @@ class AppDetail extends React.Component {
return (
<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">
<div className={styles.form}>
<Form onSubmit={this.onSubmitBase}>
......@@ -392,7 +395,7 @@ class AppDetail extends React.Component {
<div className="clearfix">
<Upload
multiple={false}
action={`${config.apiRoot}/upload/image`}
action={`${config.apiRoot}/v1/upload/image`}
listType="picture-card"
className="upload-icon"
fileList={iconList}
......@@ -418,7 +421,7 @@ class AppDetail extends React.Component {
<div className="clearfix">
<Upload
multiple={false}
action={`${config.apiRoot}/upload/image`}
action={`${config.apiRoot}/v1/upload/image`}
listType="picture-card"
className="upload-icon"
fileList={coverList}
......@@ -444,7 +447,7 @@ class AppDetail extends React.Component {
<div className="clearfix">
<Upload
multiple={false}
action={`${config.apiRoot}/upload/image`}
action={`${config.apiRoot}/v1/upload/image`}
listType="picture-card"
className="upload-icon"
fileList={backgroundList}
......@@ -899,7 +902,7 @@ class AppDetail extends React.Component {
}
}}
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">
<Icon type="inbox"/>
......
......@@ -45,7 +45,7 @@ const columns = [
sorter: true,
width: '10%',
key:'updated_at'
},
},
]
function Apps({children, dispatch, isCreate, isSubmit, apps}) {
......@@ -55,7 +55,7 @@ function Apps({children, dispatch, isCreate, isSubmit, apps}) {
isLoading: isSubmit,
onCancel: () => dispatch({ type: 'App/onCancel'}),
onCreate: () => dispatch({ type: 'App/onCreate'}),
onSubmit: (payload) => dispatch({ type: 'App/submit', payload}),
onSubmit: (payload) => dispatch({ type: 'App/create', payload}),
}
const CreateButtonProps = {
......@@ -74,8 +74,8 @@ function Apps({children, dispatch, isCreate, isSubmit, apps}) {
return (
<div className={styles.normal}>
<Table {...TableProps}/>
<Table {...TableProps}/>
<Affix style={{ position: 'absolute', bottom: 50, right: 50}}>
<Button {...CreateButtonProps} >
......@@ -91,7 +91,7 @@ function Apps({children, dispatch, isCreate, isSubmit, apps}) {
function mapStateToProps(state) {
const {
Apps: { apps },
App: { isCreate, isSubmit }
App: { isCreate, isSubmit },
} = state
return {
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 { connect } from 'dva';
import {connect} from 'dva';
import styles from './LoginCallback.css';
class LoginCallback extends React.Component{
class LoginCallback extends React.Component {
componentDidMount() {
const { location: { query: { sso }}, dispatch } = this.props
console.log(this.props)
const data = toObject(new URLSearchParams(Buffer.from(sso, 'base64').toString()))
if (data) {
dispatch({type: "user/change", payload:{ data }})
localStorage.setItem("user", JSON.stringify(data))
componentDidMount() {
const {location: {query: {sso}}, dispatch} = this.props
const user = toObject(new URLSearchParams(Buffer.from(sso, 'base64').toString()))
if (user) {
dispatch({type: "user/ssoLogin", payload: { user } })
}
}
render(){
render() {
const {dispatch, location} = this.props
return (
......@@ -26,29 +24,26 @@ class LoginCallback extends React.Component{
)
}
}
function LoginCallback({ }) {
function LoginCallback({}) {
return (
<div className={styles.normal}>
{JSON.stringify(data)}
{JSON.stringify(data)}
</div>
);
}
function mapStateToProps({ }) {
return {
};
function mapStateToProps({}) {
return {};
}
function toObject(entries){
function toObject(entries) {
let result = {};
for (let [key, value] of entries) {
result[key] = value;
}
return result;
for (let [key, value] of entries) {
result[key] = value;
}
return result;
}
export default connect(mapStateToProps)(LoginCallback);
import * as qs from 'qs'
import request from '../utils/request'
export async function fetch() {
return request(`/apps`)
export async function fetch(params) {
return request(`/v1/apps?${qs.stringify(params)}`)
}
export async function create(params) {
return request(`/apps/${params.id}`, {
return request(`/v1/app/${params.id}`, {
method: 'POST',
body: JSON.stringify(params)
})
}
export async function update(params) {
return request(`/apps/${params.id}`, {
return request(`/v1/app/${params.id}`, {
method: 'PATCH',
body: JSON.stringify(params)
})
}
\ No newline at end of file
}
......@@ -2,34 +2,34 @@ import request from '../utils/request'
export async function add(params) {
return request(`/packages`, {
return request(`/v1/package`, {
method: 'POST',
body: JSON.stringify(params)
})
}
export async function patch(params) {
return request(`/packages`, {
return request(`/v1/package`, {
method: 'PATCH',
body: JSON.stringify(params)
})
}
export async function fetch(params) {
return request(`/packages/manage?appId=${params.appId}`, {
return request(`/v1/packages?appId=${params.appId}`, {
method: 'GET',
})
}
export async function urlUpload(params) {
return request('/upload/packageUrl', {
return request('/v1/upload/packageUrl', {
method: 'POST',
body: JSON.stringify(params)
})
}
export async function del(params) {
return request(`/packages`, {
return request(`/v1/package`, {
method: 'DELETE',
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