Merge branch 'dev' of gitlab.corp.qunar.com:mfe/yapi into dev

This commit is contained in:
wenbo.dong 2017-08-20 17:22:07 +08:00
commit eabba79b2e
21 changed files with 395 additions and 164 deletions

View File

@ -32,14 +32,14 @@ class News extends Component {
getMockUrl: PropTypes.func
}
componentWillMount(){
const that = this;
this.props.getMockUrl(2724).then(function(data){
const { prd_host, basepath, protocol } = data.payload.data.data;
const mockURL = `${protocol}://${prd_host}${basepath}/{path}`;
that.setState({
mockURL: mockURL
})
})
//const that = this;
// this.props.getMockUrl(2724).then(function(data){
// const { prd_host, basepath, protocol } = data.payload.data.data;
// const mockURL = `${protocol}://${prd_host}${basepath}/{path}`;
// that.setState({
// mockURL: mockURL
// })
// })
}
render () {
return (

View File

@ -31,14 +31,14 @@ class Activity extends Component {
match: PropTypes.object
}
componentWillMount(){
const that = this;
this.props.getMockUrl(2724).then(function(data){
const { prd_host, basepath, protocol } = data.payload.data.data;
const mockURL = `${protocol}://${prd_host}${basepath}/{path}`;
that.setState({
mockURL: mockURL
})
})
//const that = this;
// this.props.getMockUrl(2724).then(function(data){
// const { prd_host, basepath, protocol } = data.payload.data.data;
// const mockURL = `${protocol}://${prd_host}${basepath}/{path}`;
// that.setState({
// mockURL: mockURL
// })
// })
}
render () {
return (

View File

@ -1,7 +1,7 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { Row, Col, Tabs } from 'antd';
import { Route, Switch } from 'react-router-dom';
import { Route, Switch, matchPath } from 'react-router-dom';
import './interface.scss'
@ -13,14 +13,19 @@ import InterfaceColMenu from './InterfaceCol/InterfaceColMenu.js'
import InterfaceColContent from './InterfaceCol/InterfaceColContent.js'
import InterfaceCaseContent from './InterfaceCol/InterfaceCaseContent.js'
const contentRouter = {
path: '/project/:id/interface/:action/:actionId',
exact: true
}
const InterfaceRoute = (props) => {
let C;
if (props.match.params.action === 'api') {
if(!props.match.params.actionId){
if (!props.match.params.actionId) {
C = InterfaceList
}else if(!isNaN(props.match.params.actionId)){
} else if (!isNaN(props.match.params.actionId)) {
C = InterfaceContent;
}else if(props.match.params.actionId.indexOf('cat_')===0){
} else if (props.match.params.actionId.indexOf('cat_') === 0) {
C = InterfaceList
}
} else if (props.match.params.action === 'col') {
@ -39,7 +44,8 @@ InterfaceRoute.propTypes = {
class Interface extends Component {
static propTypes = {
match: PropTypes.object,
history: PropTypes.object
history: PropTypes.object,
location: PropTypes.object
}
constructor(props) {
@ -47,12 +53,11 @@ class Interface extends Component {
this.state = {
curkey: this.props.match.params.action
}
console.log(this.props)
}
onChange = (action) => {
let params = this.props.match.params;
this.props.history.push('/project/'+params.id + '/interface/' + action)
this.props.history.push('/project/' + params.id + '/interface/' + action)
}
render() {
@ -64,7 +69,7 @@ class Interface extends Component {
<div className="left-menu">
<Tabs type="card" activeKey={activeKey} onChange={() => this.onChange(action)}>
<Tabs.TabPane tab="接口列表" key="api">
<InterfaceMenu projectId={this.props.match.params.id} />
<InterfaceMenu router={matchPath(this.props.location.pathname, contentRouter)} projectId={this.props.match.params.id} />
</Tabs.TabPane>
<Tabs.TabPane tab="接口集合" key="colOrCase" >
<InterfaceColMenu />
@ -78,7 +83,7 @@ class Interface extends Component {
<div className="right-content">
<Switch>
<Route exact path="/project/:id/interface/:action" component={InterfaceRoute} />
<Route exact path="/project/:id/interface/:action/:actionId" component={InterfaceRoute} />
<Route {...contentRouter} component={InterfaceRoute} />
</Switch>
</div>
</Col>

View File

@ -0,0 +1,76 @@
import React,{Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Input, Button } from 'antd';
const FormItem = Form.Item;
function hasErrors(fieldsError) {
return Object.keys(fieldsError).some(field => fieldsError[field]);
}
class AddInterfaceForm extends Component {
static propTypes = {
form: PropTypes.object,
onSubmit: PropTypes.func,
onCancel: PropTypes.func,
catdata: PropTypes.object
}
handleSubmit = (e) => {
e.preventDefault();
this.props.form.validateFields((err, values) => {
if (!err) {
this.props.onSubmit(values)
}
});
}
render() {
const { getFieldDecorator, getFieldsError } = this.props.form;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 14 }
}
};
return (
<Form onSubmit={this.handleSubmit}>
<FormItem
{...formItemLayout}
label="分类名"
>
{getFieldDecorator('name', {
rules: [{
required: true, message: '清输入分类名称!'
}],
initialValue: this.props.catdata? this.props.catdata.name || null: null
})(
<Input placeholder="分类名称" />
)}
</FormItem>
<br />
<FormItem wrapperCol={{ span: 24, offset: 8 }} >
<Button onClick={this.props.onCancel} style={{marginRight: "10px"}} >取消</Button>
<Button
type="primary"
htmlType="submit"
disabled={hasErrors(getFieldsError())}
>
提交
</Button>
</FormItem>
</Form>
);
}
}
export default Form.create()(AddInterfaceForm);

View File

@ -10,12 +10,14 @@ class AddInterfaceForm extends Component {
static propTypes = {
form: PropTypes.object,
onSubmit: PropTypes.func,
onCancel: PropTypes.func
onCancel: PropTypes.func,
catid: PropTypes.number
}
handleSubmit = (e) => {
e.preventDefault();
this.props.form.validateFields((err, values) => {
if (!err) {
values.catid = this.props.catid
this.props.onSubmit(values)
}
});

View File

@ -35,19 +35,25 @@ class Content extends Component {
this.state = {
curtab: 'view'
}
this._actionId = 0;
}
componentWillMount() {
this.handleRequest(this.props)
const params = this.props.match.params;
this.actionId = params.actionId;
this.handleRequest(this.props);
}
componentWillReceiveProps(nextProps) {
const params = nextProps.match.params;
if(params.actionId !== this.actionId){
this.actionId = params.actionId;
this.handleRequest(nextProps)
}
}
handleRequest(nextProps) {
let matchParams = nextProps.match.params;
if (matchParams.actionId && this._actionId !== matchParams.actionId) {
this._actionId = matchParams.actionId;
this.props.fetchInterfaceData(matchParams.actionId)
}
const params = nextProps.match.params;
this.props.fetchInterfaceData(params.actionId)
this.setState({
curtab: 'view'
})

View File

@ -1,9 +1,10 @@
import React, { Component } from 'react'
import { connect } from 'react-redux';
import PropTypes from 'prop-types'
import { fetchInterfaceList, fetchInterfaceData, addInterfaceData, deleteInterfaceData } from '../../../../reducer/modules/interface.js';
import { fetchInterfaceList, fetchInterfaceData, deleteInterfaceData, deleteInterfaceCatData, initInterface } from '../../../../reducer/modules/interface.js';
import { Menu, Input, Icon, Tag, Modal, message, Tree, Dropdown } from 'antd';
import AddInterfaceForm from './AddInterfaceForm';
import AddInterfaceCatForm from './AddInterfaceCatForm';
import axios from 'axios'
import { Link, withRouter } from 'react-router-dom';
@ -22,8 +23,9 @@ const TreeNode = Tree.TreeNode;
{
fetchInterfaceList,
fetchInterfaceData,
addInterfaceData,
deleteInterfaceData
deleteInterfaceCatData,
deleteInterfaceData,
initInterface
}
)
class InterfaceMenu extends Component {
@ -37,13 +39,19 @@ class InterfaceMenu extends Component {
fetchInterfaceData: PropTypes.func,
addInterfaceData: PropTypes.func,
deleteInterfaceData: PropTypes.func,
history: PropTypes.object
initInterface: PropTypes.func,
history: PropTypes.object,
router: PropTypes.object
}
showModal = () => {
this.setState({
visible: true
});
/**
* @param {String} key
*/
changeModal = (key, status) => {
//visible add_cat_modal_visible change_cat_modal_visible del_cat_modal_visible
let newState = {}
newState[key] = status
this.setState(newState);
}
handleCancel = () => {
@ -58,12 +66,16 @@ class InterfaceMenu extends Component {
curKey: null,
visible: false,
delIcon: null,
filter: ''
curCatid: null,
add_cat_modal_visible: false,
change_cat_modal_visible: false,
del_cat_modal_visible: false,
curCatdata: {}
}
}
async handleRequest() {
this.props.initInterface()
await this.props.fetchInterfaceList(this.props.projectId);
// if(!params.actionId){
@ -90,7 +102,7 @@ class InterfaceMenu extends Component {
return message.error(res.data.errmsg);
}
message.success('接口添加成功')
this.props.addInterfaceData(res.data.data)
this.props.fetchInterfaceList(this.props.projectId)
this.setState({
visible: false
});
@ -98,21 +110,65 @@ class InterfaceMenu extends Component {
})
}
handleAddInterfaceCat = (data) => {
data.project_id = this.props.projectId;
axios.post('/api/interface/add_cat', data).then((res) => {
if (res.data.errcode !== 0) {
return message.error(res.data.errmsg);
}
message.success('接口分类添加成功')
this.props.fetchInterfaceList(this.props.projectId)
this.setState({
add_cat_modal_visible: false
});
})
}
handleChangeInterfaceCat = (data) => {
let params = {
catid: this.state.curCatdata._id,
name: data.name
}
axios.post('/api/interface/up_cat', params).then((res) => {
if (res.data.errcode !== 0) {
return message.error(res.data.errmsg);
}
message.success('接口分类更新成功')
this.props.fetchInterfaceList(this.props.projectId)
this.setState({
change_cat_modal_visible: false
});
})
}
showConfirm = (id) => {
let that = this;
confirm({
title: '您确认删除此接口',
content: '温馨提示:接口删除后,无法恢复',
onOk() {
that.props.deleteInterfaceData(id)
async onOk() {
await that.props.deleteInterfaceData(id, that.props.projectId)
await that.props.fetchInterfaceList(that.props.projectId)
},
onCancel() { }
});
}
delInterface = (id) => {
this.props.deleteInterfaceData(id)
showDelCatConfirm = (catid) => {
let that = this;
confirm({
title: '您确认删除此接口分类',
content: '温馨提示:该操作会删除该分类下所有接口,接口删除后无法恢复',
async onOk() {
await that.props.deleteInterfaceCatData(catid, that.props.projectId)
await that.props.fetchInterfaceList(that.props.projectId)
},
onCancel() { }
});
}
enterItem = (id) => {
@ -129,10 +185,7 @@ class InterfaceMenu extends Component {
})
}
handleGroup = (e) => {
e.stopPropagation();
return false;
}
render() {
const matchParams = this.props.match.params;
@ -150,7 +203,7 @@ class InterfaceMenu extends Component {
default: color = "green";
}
return <TreeNode
title={<div onMouseEnter={() => this.enterItem(item._id)} onMouseLeave={this.leaveItem} >
title={<div onMouseEnter={() => this.enterItem(item._id)} onMouseLeave={this.leaveItem} >
<Link className="interface-item" to={"/project/" + matchParams.id + "/interface/api/" + item._id} ><Tag color={color} className="btn-http" >{item.method}</Tag>{item.title}</Link>
<Icon type='delete' className="interface-delete-icon" onClick={() => { this.showConfirm(item._id) }} style={{ display: this.state.delIcon == item._id ? 'block' : 'none' }} />
</div>}
@ -158,45 +211,100 @@ class InterfaceMenu extends Component {
}
const menu = (
<Menu>
const menu = (item) => {
return <Menu>
<Menu.Item>
<span onClick={this.showModal}>添加接口</span>
<span onClick={() => {
this.changeModal('visible', true);
this.setState({
curCatid: item._id
})
}}>添加接口</span>
</Menu.Item>
<Menu.Item>
<span >修改分类</span>
<span onClick={() => {
this.changeModal('change_cat_modal_visible', true);
this.setState({
curCatdata: item
})
}}>修改分类</span>
</Menu.Item>
<Menu.Item>
<span onClick={this.showModal}>删除分类</span>
<span onClick={() => {
this.showDelCatConfirm(item._id)
}}>删除分类</span>
</Menu.Item>
</Menu>
);
};
const defaultExpandedKeys = ()=>{
const {router, inter, list} = this.props, rNull = {expands: [], selects: []};
if(list.length === 0) return rNull;
if(router){
if(!isNaN(router.params.actionId)){
let _actionId = parseInt(router.params.actionId, 10)
if(!inter._id || inter._id !== _actionId)return rNull;
return {
expands: ['group-' + inter.catid],
selects: [inter._id+""]
}
}else{
let catid = router.params.actionId.substr(4);
return {
expands: ['group-' + catid],
selects: ['group-' + catid]
}
}
}else{
return {
expands: ['group-' + list[0]._id],
selects: ['root']
}
}
}
const currentKes = defaultExpandedKeys();
return <div>
<div className="interface-filter">
<Input onChange={this.onFilter} value={this.state.filter} placeholder="Filter by name" style={{ width: "70%" }} />
<Tag color="#108ee9" style={{ marginLeft: "15px" }} ><Icon type="plus" /></Tag>
<Tag color="#108ee9" style={{ marginLeft: "15px" }} ><Icon type="plus" onClick={() => this.changeModal('add_cat_modal_visible', true)} /></Tag>
<Modal
title="添加接口"
visible={this.state.visible}
onOk={this.handleOk}
onCancel={this.handleCancel}
footer={null}
>
<AddInterfaceForm onCancel={this.handleCancel} onSubmit={this.handleAddInterface} />
<AddInterfaceForm catid={this.state.curCatid} onCancel={() => this.changeModal('visible', false)} onSubmit={this.handleAddInterface} />
</Modal>
<Modal
title="添加分类"
visible={this.state.add_cat_modal_visible}
footer={null}
>
<AddInterfaceCatForm onCancel={() => this.changeModal('add_cat_modal_visible', false)} onSubmit={this.handleAddInterfaceCat} />
</Modal>
<Modal
title="修改分类"
visible={this.state.change_cat_modal_visible}
footer={null}
>
<AddInterfaceCatForm catdata={this.state.curCatdata} onCancel={() => this.changeModal('change_cat_modal_visible', false)} onSubmit={this.handleChangeInterfaceCat} />
</Modal>
</div>
{this.props.list.length > 0 ?
<Tree
className="interface-list"
defaultExpandedKeys={['group-' + this.props.list[0]._id]}
defaultExpandedKeys={currentKes.expands}
defaultSelectedKeys={currentKes.selects}
onSelect={this.onSelect}
>
<TreeNode title={<Link style={{fontSize: '14px'}} to={"/project/" + matchParams.id + "/interface/api"}><Icon type="folder-open" style={{marginRight: 5}} />全部接口</Link>} key="root" />
<TreeNode title={<Link style={{ fontSize: '14px' }} to={"/project/" + matchParams.id + "/interface/api"}><Icon type="folder-open" style={{ marginRight: 5 }} />全部接口</Link>} key="root" />
{this.props.list.map((item) => {
return <TreeNode title={<div>
<Link className="interface-item" to={"/project/" + matchParams.id + "/interface/api/cat_" + item._id} ><Icon type="folder-open" style={{marginRight: 5}} />{item.name}</Link>
<Dropdown overlay={menu}>
return <TreeNode title={<div>
<Link className="interface-item" to={"/project/" + matchParams.id + "/interface/api/cat_" + item._id} ><Icon type="folder-open" style={{ marginRight: 5 }} />{item.name}</Link>
<Dropdown overlay={menu(item)}>
<Icon type='bars' className="interface-delete-icon" />
</Dropdown>
</div>} key={'group-' + item._id} >

View File

@ -1,9 +1,10 @@
import axios from 'axios'
// Actions
const INIT_INTERFACE_DATA = 'yapi/interface/INIT_INTERFACE_DATA';
const FETCH_INTERFACE_DATA = 'yapi/interface/FETCH_INTERFACE_DATA';
const FETCH_INTERFACE_LIST = 'yapi/interface/FETCH_INTERFACE_LIST';
const ADD_INTERFACE_DATA = 'yapi/interface/ADD_INTERFACE_DATA';
const DELETE_INTERFACE_DATA = 'yapi/interface/DELETE_INTERFACE_DATA';
const DELETE_INTERFACE_CAT_DATA = 'yapi/interface/DELETE_INTERFACE_CAT_DATA';
const UPDATE_INTERFACE_DATA = 'yapi/interface/UPDATE_INTERFACE_DATA';
// const SAVE_INTERFACE_PROJECT_ID = 'yapi/interface/SAVE_INTERFACE_PROJECT_ID';
// const GET_INTERFACE_GROUP_LIST = 'yapi/interface/GET_INTERFACE_GROUP_LIST';
@ -16,35 +17,14 @@ const initialState = {
export default (state = initialState, action) => {
switch (action.type) {
case INIT_INTERFACE_DATA:
return initialState
case UPDATE_INTERFACE_DATA:
return {
...state,
curdata: Object.assign({}, state.curdata, action.updata)
}
case DELETE_INTERFACE_DATA:
return (() => {
let newlist = state.list.filter(data => data._id !== action.payload), curdata;
if (state.list.length > 0) {
curdata = state.list[0]
} else if (state.list.length == 0) {
curdata = {}
}
return {
...state,
curdata: curdata,
list: newlist
}
})()
case ADD_INTERFACE_DATA:
return {
...state,
curdata: action.payload,
list: [].concat(state.list, action.payload)
}
case FETCH_INTERFACE_DATA:
return {
...state,
@ -54,13 +34,19 @@ export default (state = initialState, action) => {
return {
...state,
list: action.payload.data
// curdata: {}
}
default:
return state
}
}
export function initInterface(){
return {
type: INIT_INTERFACE_DATA
}
}
export function updateInterfaceData(updata) {
return {
@ -73,10 +59,18 @@ export function updateInterfaceData(updata) {
}
export async function deleteInterfaceData(id) {
await axios.post('/api/interface/del', { id: id })
let result = await axios.post('/api/interface/del', { id: id })
return {
type: DELETE_INTERFACE_DATA,
payload: true
payload: result
}
}
export async function deleteInterfaceCatData(id) {
let result = await axios.post('/api/interface/del_cat', { catid: id })
return {
type: DELETE_INTERFACE_CAT_DATA,
payload: result
}
}
@ -96,11 +90,4 @@ export async function fetchInterfaceList(projectId) {
type: FETCH_INTERFACE_LIST,
payload: result.data
}
}
export async function addInterfaceData(data) {
return {
type: ADD_INTERFACE_DATA,
payload: data
}
}

View File

@ -418,8 +418,8 @@ class interfaceController extends baseController {
try {
let params = ctx.request.body;
let result = await this.catModel.up(params.catid, {
name: params.cat_name,
desc: params.cat_desc,
name: params.name,
desc: params.desc,
up_time: yapi.commons.time()
})
ctx.body = yapi.commons.resReturn(result)
@ -444,8 +444,8 @@ class interfaceController extends baseController {
}
let result = await this.catModel.del(id);
await this.Model.delByCatid(id)
return ctx.body = yapi.commons.resReturn(result);
let r = await this.Model.delByCatid(id)
return ctx.body = yapi.commons.resReturn(r);
} catch (e) {

View File

@ -288,7 +288,9 @@ class projectController extends baseController {
}
try {
let result = await this.Model.get(params.id);
console.log(result)
if(!result){
return ctx.body = yapi.commons.resReturn(null, 400, '不存在的项目');
}
result = result.toObject();
delete result.members;
result.role = await this.getProjectRole(params.id, 'project');

View File

@ -34,11 +34,7 @@ class projectModel extends baseModel {
}
get(id) {
this.model.findOne({
_id: id
}).select("uid group_name ").exec().then((res) => {
console.log(res);
})
console.log(id)
return this.model.findOne({
_id: id
}).exec();

View File

@ -908,8 +908,8 @@ var interfaceController = function (_baseController) {
params = ctx.request.body;
_context10.next = 4;
return this.catModel.up(params.catid, {
name: params.cat_name,
desc: params.cat_desc,
name: params.name,
desc: params.desc,
up_time: _yapi2.default.commons.time()
});
@ -944,7 +944,7 @@ var interfaceController = function (_baseController) {
key: 'delCat',
value: function () {
var _ref11 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee11(ctx) {
var id, catData, auth, result;
var id, catData, auth, result, r;
return _regenerator2.default.wrap(function _callee11$(_context11) {
while (1) {
switch (_context11.prev = _context11.next) {
@ -989,20 +989,21 @@ var interfaceController = function (_baseController) {
return this.Model.delByCatid(id);
case 17:
return _context11.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(result));
r = _context11.sent;
return _context11.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(r));
case 20:
_context11.prev = 20;
case 21:
_context11.prev = 21;
_context11.t0 = _context11['catch'](0);
_yapi2.default.commons.resReturn(null, 400, _context11.t0.message);
case 23:
case 24:
case 'end':
return _context11.stop();
}
}
}, _callee11, this, [[0, 20]]);
}, _callee11, this, [[0, 21]]);
}));
function delCat(_x11) {

View File

@ -658,31 +658,38 @@ var projectController = function (_baseController) {
case 6:
result = _context6.sent;
console.log(result);
if (result) {
_context6.next = 9;
break;
}
return _context6.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '不存在的项目'));
case 9:
result = result.toObject();
delete result.members;
_context6.next = 12;
_context6.next = 13;
return this.getProjectRole(params.id, 'project');
case 12:
case 13:
result.role = _context6.sent;
ctx.body = _yapi2.default.commons.resReturn(result);
_context6.next = 19;
_context6.next = 20;
break;
case 16:
_context6.prev = 16;
case 17:
_context6.prev = 17;
_context6.t0 = _context6['catch'](3);
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context6.t0.message);
case 19:
case 20:
case 'end':
return _context6.stop();
}
}
}, _callee6, this, [[3, 16]]);
}, _callee6, this, [[3, 17]]);
}));
function get(_x7) {

View File

@ -71,11 +71,7 @@ var projectModel = function (_baseModel) {
}, {
key: 'get',
value: function get(id) {
this.model.findOne({
_id: id
}).select("uid group_name ").exec().then(function (res) {
console.log(res);
});
console.log(id);
return this.model.findOne({
_id: id
}).exec();

View File

@ -14,11 +14,7 @@
<script src="http://127.0.0.1:4000/prd/lib@dev.js"></script>
<script src="http://127.0.0.1:4000/prd/index@dev.js"></script>
<script src="/lib/ace-1.2.8.js"></script>
<script src="/lib/snippets-json.js"></script>
<script src="/lib/ext-language.tools.js"></script>
<script src="/lib/mode-json-1.2.8.js"></script>
<script src="https://qsso.corp.qunar.com/lib/qsso-auth.js"></script>
<script src="/lib/qsso-auth.js"></script>

View File

@ -34,9 +34,6 @@
document.write('<script src="/prd/' + window.WEBPACK_ASSETS['index.js'].js + '"><\/script>');
</script>
<script src="/lib/ace-1.2.8.js"></script>
<script src="/lib/ext-language.tools.js"></script>
<script src="/lib/mode-json-1.2.8.js"></script>
<script src="https://qsso.corp.qunar.com/lib/qsso-auth.js"></script>
<script src="/lib/qsso-auth.js"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

73
static/lib/qsso-auth.js Normal file
View File

@ -0,0 +1,73 @@
// file_id:2D7ABF69-3BC0-4175-98C9-5C3D5CB00158 -- nerver change this !!
/*
* file: qsso-auth.js
* URL: https://qsso.corp.qunar.com/lib/qsso-auth.js
* written by zhibin.ning
* version: 0.1
*
*/
if (!window['QSSO']) {
var QSSO = (function () {
var AUTH_SERVER = 'https://qsso.corp.qunar.com',
LOGIN_PAGE = '/login.php',
SORRY_PAGE = '/sorry.html';
if (location.hostname.match(/qunar\.ctripgroup\.com$/i)) {
AUTH_SERVER = 'https://qunar.ctripgroup.com/sec/qsso/api';
}
var qualifyURL = function (url, encode) {
var url = url || '';
var ret = location.protocol + '//' + location.host + (url.substr(0,1) === '/' ? '' : location.pathname.match(/.*\//)) + url;
if (encode) {
ret = encodeURIComponent(ret);
}
return ret;
};
var URLStringify = function (o) {
var ret = [];
for (var i in o) {
// ret.push( encodeURIComponent(i) + '=' + encodeURIComponent(o[i]) );
ret.push(i + '=' + o[i]);
}
return ret.join('&');
};
return {
'auth': function (loginURI, opt_ext) {
if (!location.hostname.match(/\.qunar(man|ops)?\.com$|\.qunarman\.com$|qunar\.it$|\.928383\.com$|^928383\.com$|qunar\.ctripgroup\.c(om|n)$|\.ctrip(corp)?\.com$|^opsdata\.me$|\.mofun\.com$/i)) {
location = AUTH_SERVER + SORRY_PAGE + '?host=' + qualifyURL('', true);
return;
}
var ret = qualifyURL(loginURI, true);
var redirectURL = AUTH_SERVER + LOGIN_PAGE + '?ret=' + ret + (opt_ext ? '&ext=' + encodeURIComponent(URLStringify(opt_ext)) : '');
// console.log(redirectURL);
location = redirectURL;
},
'attach': function (eid, loginURI, opt_ext) {
QSSO.login = function() {
QSSO.auth(loginURI, opt_ext);
};
document.getElementById(eid).onclick = QSSO.login;
if (location.hash.match('qsso-auto-login')) {
QSSO.login();
}
}
};
})();
/* todo add QSSO login UI, frame login, etc */
}

View File

@ -1 +0,0 @@
define("ace/snippets/json",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="json"})