Browse Source

专栏模块页面开发。未联调

liting2017 6 years ago
parent
commit
b8e5f6c8bd

+ 2 - 0
js/admin/index/content.jsx

@@ -21,6 +21,7 @@ import Banner from '@/administration/banner/banner';
 import Vouchers from '@/administration/ticket/vouchers';
 import Coupon from '@/administration/ticket/coupon';
 import Video from '@/administration/video/videoList';
+import Product from '@/administration/product/proList';
 
 
 import {hashHistory,Route,Router} from 'react-router';
@@ -56,6 +57,7 @@ export default class ContentRouter extends React.Component {
             <Route path="/vouchers" component={Vouchers} />
             <Route path="/coupon" component={Coupon} />
             <Route path="/video" component={Video} />
+            <Route path="/product" component={Product} />
         </Router>
       </Content>
     )

+ 2 - 1
js/admin/menu.jsx

@@ -47,12 +47,13 @@ module.exports = {
         ]
       },
       {
-        name: '政策与新闻',
+        name: '政策|新闻|产品',
         url: 'sub5',
         icon: 'exception',
         children: [
           { name: '政策管理', url: 'policy' },
           { name: '新闻管理', url: 'news' },
+          { name: '产品专栏', url: 'product' },
         ]
       },
       {

+ 15 - 22
js/component/account/index/leftMenu.jsx

@@ -4,12 +4,13 @@ import '@/account/leftTab.less';
 const SubMenu = Menu.SubMenu;
 import { Link } from 'react-router';
 import $ from 'jquery/src/ajax';
-import { menu,menuInit } from '@/account/menu';
+import { menu } from '@/account/menu';
 import logo from 'img/acc-logo.png';
 
 const LeftTab = React.createClass({
 	getInitialState() {
 		return {
+			newMenu:[],
 			openKeys: [ 'sub1' ],
 			current: 'normal',
 			switch: false,
@@ -28,6 +29,7 @@ const LeftTab = React.createClass({
 					this.setState({
 						type: data.data.type
 					});
+					this.jurisdiction(data.data)
 				} else {
 					message.warning(data.error[0].message);
 				}
@@ -96,30 +98,21 @@ const LeftTab = React.createClass({
 			});
 		}
 	},
+	//菜单权限处理
+	jurisdiction(data){
+		let newMenu =menu;
+		if(data.type){   //企业用户
+			newMenu[1].children.splice(2,1);
+		}else{			 //个人用户
+			newMenu[1].children.splice(1,1);
+		};
+		this.setState({newMenu});
+	},
 	componentWillMount() {
 		this.loadData();
-		this.hashFun()
+		this.hashFun();
 	},
 	render() {
-		let menuList = [],newMenu=[];
-		let menuNO = menu[1].children;
-		menuNO.map((item) => {
-			if (this.state.type == '0') {
-				if (item.url != 'unit') {
-					menuList.push(item);
-				}
-			} else if (this.state.type == '1') {
-				if (item.url != 'personal'&&item.url!='expert') {
-					menuList.push(item);
-				}
-			} 
-		});
-		if (this.state.type == '0' || this.state.type == '1') {
-			menu[1].children = menuList;
-			newMenu=menu
-		}else{
-			newMenu=menuInit
-		}
 		return (
 			<div>
 				<div className="acc-index">
@@ -141,7 +134,7 @@ const LeftTab = React.createClass({
 					theme="light"
 					className="account-left"
 				>
-					{newMenu.map((subMenu) => {
+					{this.state.newMenu.map((subMenu) => {
 						if (subMenu.children && subMenu.children.length) {
 							return (
 								<SubMenu

+ 1 - 85
js/component/account/menu.jsx

@@ -18,7 +18,6 @@ module.exports = {
             { name: '账号管理', url: 'account' },
             { name: '企业资料', url: 'unit' },
             { name: '个人资料', url: 'personal' },
-            // { name: '专家资料  ', url: 'expert' },
             { name: '常用联系人', url: 'contacts' },
           ]
         },
@@ -80,88 +79,5 @@ module.exports = {
 	          { name: '我的技淘币', url: 'coupon' },
 	        ]
         }
-    ],
-    menuInit:[
-      {
-        name: '会员中心',
-        url: 'sub1',
-        icon: 'home',
-        children: [
-          { name: '常用功能', url: 'normal' },
-          { name: '我的收藏', url: 'collection' },
-          { name: '我的关注', url: 'follow' }
-          // { name: '服务订单', url: 'serviceList' },
-          // { name: '咨询订单', url: 'consultList' }
-        ]
-      },
-         {
-          name: '账号设置',
-          url: 'sub2',
-          icon: 'setting',
-          children: [
-            { name: '账号管理', url: 'account' },
-            { name: '企业资料', url: 'unit' },
-            { name: '个人资料', url: 'personal' },
-            { name: '常用联系人', url: 'contacts' },
-          ]
-        },
-        {
-          name: '我的需求',
-          url: 'sub3',
-          icon: 'bulb',
-          children: [ { name: '科技需求管理', url: 'demand' } ]
-        },
-        {
-          name: '我的成果',
-          url: 'sub4',
-          icon: 'compass',
-          children: [ { name: '科技成果管理', url: 'achievement' } ]
-        },
-        {
-          name: '我的业务项目',
-          url: 'sub5',
-          icon: 'wallet',
-          children: [ { name: '业务项目管理', url: 'businessProject' }, ]
-        },
-        {
-          name: '我的科技评估',
-          url: 'sub8',
-          icon: 'bank',
-          children: [ { name: '科技评估管理', url: 'evaluate' }, ]
-        },
-        {
-          name: '订单管理-我是服务商',
-          url: 'sub6',
-          icon: 'copy',
-          children: [
-            { name: '技术成果订单', url: 'achievementOrderS' },
-            { name: '技术需求订单', url: 'demandOrderS' },
-            { name: '运用订单', url: 'projectOrderS' },
-            // { name: '专家订单', url: 'expertS' },
-            // { name: '顾问订单', url: 'adviserS' },
-          ]
-        },
-        {
-          name: '订单管理-我是消费者',
-          url: 'sub7',
-          icon: 'shop',
-          children: [
-            { name: '技术成果订单', url: 'achievementOrderX' },
-            { name: '技术需求订单', url: 'demandOrderX' },
-            { name: '运用订单', url: 'projectOrderX' },
-            // { name: '专家订单', url: 'expertX' },
-            // { name: '顾问订单', url: 'adviserX' },
-            // { name: '会员订单', url: 'memberOrderX' },
-          ]
-        },
-        {
-	        name: '技淘币管理',
-	        url: 'sub9',
-	        icon: 'notification',
-	        children: [
-	          { name: '券面管理', url: 'vouchers' },
-	          { name: '我的技淘币', url: 'coupon' },
-	        ]
-        }
-    ],
+    ]
 }

+ 69 - 0
js/component/administration/product/proDesc.jsx

@@ -0,0 +1,69 @@
+import React from 'react';
+import { Modal } from 'antd';
+import NewForm from '@/administration/product/proForm';
+import NewDetaiel from '@/administration/product/proDetails';
+
+class DemandDesc extends React.Component {
+	constructor(props) {
+		super(props);
+		this.state = {
+			loading: false,
+			pictureUrl: [],
+			showState:false
+		};
+	}
+	handleCancel() {
+		this.setState({
+			visible: false,
+		});
+		this.props.closeDesc(false, false);
+	}
+	handOk() {
+		this.setState({
+			visible: false,
+		});
+		this.props.closeDesc(false, true);
+	}
+	componentWillReceiveProps(nextProps) {
+		this.state.visible = nextProps.showDesc;
+	}
+	render() {
+		let data = this.props.data || [];
+		return (
+			<div className="patent-desc">
+				<Modal
+					maskClosable={false}
+					visible={this.state.visible}
+					onOk={this.handOk.bind(this)}
+					onCancel={this.handleCancel.bind(this)}
+					width="1100px"
+					title={!data.id ? '新建专栏' : '专栏详情'}
+					footer=""
+					className="admin-desc-content"
+				>
+					<div>
+						<div>
+								{data.auditStatus=='1'||data.auditStatus=='2'?
+									<NewDetaiel
+									closeDesc={this.handleCancel.bind(this)}
+									data={this.props.data}
+									visible={this.state.visible}
+									handOk={this.handOk.bind(this)}
+									/>
+									:
+									<NewForm 
+										closeDesc={this.handleCancel.bind(this)}
+										data={this.props.data}
+										visible={this.state.visible}
+										handOk={this.handOk.bind(this)}
+										/>
+								} 
+						</div>
+					</div>
+				</Modal>
+			</div>
+		);
+	}
+}
+
+export default DemandDesc;

+ 242 - 0
js/component/administration/product/proDetails.jsx

@@ -0,0 +1,242 @@
+import React from 'react';
+import $ from 'jquery/src/ajax';
+import {
+	Modal,
+	message,
+	Spin,
+	Upload,
+	Button,
+	Form,
+} from 'antd';
+import '../policy/policy.less';
+import {getReleaseStateList,splitUrl,getProductType,getSpecialType} from '@/tools';
+const NewDetail = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            auditStatus: 0,
+            textFileList: [],
+            videoFileList: [],
+            pictureUrl: [],
+        };
+    },
+    loadData(id) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context +  '/api/admin/news/detail' ,
+            data: {
+                id: id
+            },
+            success: function (data) {
+                let thisData = data.data;
+                if (!thisData) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                    thisData = {};
+                };
+                document.querySelector('.txt').innerHTML='';
+                    let eleDiv = document.createElement('div');
+                    eleDiv.innerHTML=thisData.content;
+                    document.querySelector('.txt').append(eleDiv);
+                this.setState({
+                    id:thisData.id,
+                    data: thisData,
+                    eleDiv:eleDiv,
+                    edit:{content:thisData.content},
+                    auditStatus:thisData.auditStatus,
+                    pictureUrl: thisData.titleImg ? splitUrl(thisData.titleImg, ',', globalConfig.avatarHost + '/upload') : []
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+   
+	cancelFun(){
+		this.props.closeDesc();
+    },
+    //刷新发布
+    updateFun(inex){
+        this.setState({
+            loading:true
+        })
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context +'/api/admin/news/updateStatus',
+            data: {
+                id: this.state.id,
+                auditStatus:this.state.auditStatus,
+                refresh:1
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('刷新成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.props.handOk();
+           
+        }.bind(this));
+    },
+    //撤销发布
+    revokeFun(){
+        this.setState({
+            loading:true
+        })
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context +  '/api/admin/news/updateStatus',
+            data: {
+                id: this.state.id,
+                auditStatus:4,
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('撤销成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.props.handOk();
+        }.bind(this));
+    },
+    componentWillMount() {
+        if (this.props.data.id) {
+            this.loadData(this.props.data.id);
+           
+        } else {
+            this.state.data = {};
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            this.state.textFileList = [];
+            this.state.videoFileList = [];
+            if (nextProps.data.id) {
+                this.loadData(nextProps.data.id);
+            } else {
+				this.state.data = {};
+                this.state.pictureUrl = [];
+            };
+            this.props.form.resetFields();
+        };
+    },
+    render() {
+        const theData = this.state.data || {};
+        const FormItem = Form.Item
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        return (
+			<div className='login'>
+			<Form layout="horizontal" id="demand-form">
+				<Spin spinning={this.state.loading}>
+					<div className="clearfix">
+                        <FormItem className="half-item" {...formItemLayout} label="标题">
+							<span>{theData.title}</span>
+						</FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="专栏类型">
+							<span>{getSpecialType(theData.type)}</span>
+						</FormItem>
+						<FormItem className="half-item" {...formItemLayout} label="新闻来源">
+							<span>{theData.source}</span>
+						</FormItem>
+                        {theData.type=='1'&&<FormItem className="half-item" {...formItemLayout} label="产品类型">
+							<span>{getProductType(theData.type)}</span>
+						</FormItem>}
+					</div>
+                    <div>
+                    	<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label="来源链接">
+							<span>{theData.sourceUrl}</span>
+						</FormItem>
+                    </div> 
+                    <div>
+                    	<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label="关键字">
+							<span>{theData.keyword}</span>
+						</FormItem>
+                    </div>
+                    <FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label="新闻图片">
+                        <div className="clearfix">
+                                <Upload className="demandDetailShow-upload"
+                                    listType="picture-card"
+                                    fileList={this.state.pictureUrl}                               
+                                    onPreview={(file) => {
+                                        this.setState({
+                                            previewImage: file.url || file.thumbUrl,
+                                            previewVisible: true,
+                                        });
+                                    }} >
+                                </Upload>
+                                <Modal maskClosable={false} footer={null}
+                                    visible={this.state.previewVisible}
+                                    onCancel={() => { this.setState({ previewVisible: false }) }}>
+                                    <img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+                                </Modal>
+                            </div> 
+					</FormItem>
+                    <div className="clearfix">
+						<FormItem className="half-item" {...formItemLayout} label="发布状态">
+							<span>{getReleaseStateList(theData.auditStatus)}</span>
+						</FormItem>
+                       
+                        <FormItem className="half-item" {...formItemLayout} label="发布时间">
+                            <span>{theData.releaseDate?(new Date(theData.releaseDate)).toLocaleString():''}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="是否置顶">
+							<span>{theData.top=='1'?'是':'否'}</span>
+						</FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="是否推荐">
+                            <span>{theData.top=='1'?'是':'否'}</span>
+                        </FormItem>
+					</div>
+                    <div className="clearfix breakWord">
+						<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label="新闻简介">
+							<span>{theData.summary}</span>
+						</FormItem>
+                        <FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label="新闻正文">
+							<div className="txt"></div>
+						</FormItem>
+					</div>
+					<div className="clearfix">
+						{this.props.data.auditStatus=='2'&&<FormItem wrapperCol={{ span: 12, offset: 3 }}>
+							<Button className="set-submit" type="primary"  onClick={(e)=>{this.updateFun()}} >
+								刷新发布
+							</Button>
+							<Button type="danger" style={{marginRight:20}} onClick={(e)=>{this.revokeFun()}}>
+								撤销发布
+							</Button>
+							<Button className="set-submit" type="ghost" onClick={this.cancelFun}>
+								取消
+							</Button>
+						</FormItem>}
+					</div>
+				</Spin>
+			</Form>    
+		</div>
+        )
+    }
+}));
+export default NewDetail;
+
+
+
+

+ 381 - 0
js/component/administration/product/proForm.jsx

@@ -0,0 +1,381 @@
+import React from 'react';
+import $ from 'jquery/src/ajax';
+import {
+	Icon,
+	Modal,
+	message,
+	Spin,
+	Upload,
+	Input,
+	Button,
+	Radio,
+	Form,
+	Checkbox,
+	Cascader,
+	Row,
+	Select,
+    Col
+} from 'antd';
+import {specialType,productType} from '@/dataDic.js';
+import {  splitUrl} from '@/tools.js';
+import {provinceSelect } from '@/NewDicProvinceList';
+import Editors from '@/richTextEditors';
+import Crop from '@/crop/cropBlock';
+
+
+const PicturesWall = React.createClass({
+	getInitialState() {
+		return {
+			previewVisible: false,
+			previewImage: '',
+			fileList: [],
+			tags: []
+		};
+	},
+	handleCancel() {
+		this.setState({ previewVisible: false });
+	},
+	handlePreview(file) {
+		this.setState({
+			previewImage: file.url || file.thumbUrl,
+			previewVisible: true
+		});
+	},
+	handleChange(info) {
+		let fileList = info.fileList;
+		this.setState({ fileList });
+		this.props.fileList(fileList);
+	},
+	componentWillReceiveProps(nextProps) {
+		this.state.fileList = nextProps.pictureUrl;
+	},
+	render() {
+		const { previewVisible, previewImage, fileList } = this.state;
+		const uploadButton = (
+			<div>
+				<Icon type="plus" />
+				<div className="ant-upload-text">点击上传</div>
+			</div>
+		);
+		return (
+			<div className="clearfix">
+				<Upload
+					action={globalConfig.context + '/api/user/demand/uploadPicture'}
+					data={{ sign: 'demand_picture'}}
+					listType="picture-card"
+					fileList={fileList}
+					onPreview={this.handlePreview}
+					onChange={this.handleChange}
+				>
+					{fileList.length >= 2 ? null : uploadButton}
+				</Upload>
+				<Modal maskClosable={false} visible={previewVisible} footer={null} onCancel={this.handleCancel}>
+					<img alt="example" style={{ width: '100%' }} src={previewImage} />
+				</Modal>
+			</div>
+		);
+	}
+});
+ 
+const NewDetailForm = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            auditStatus: 0,
+            textFileList: [],
+            videoFileList: [],
+			pictureUrl: [],
+			tags:[],
+			edit:{},
+			edits:{}
+        };
+    },
+    loadData(id) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context +  '/api/admin/news/detail' ,
+            data: {
+                id: id
+            },
+            success: function (data) {
+                let thisData = data.data;
+                if (!thisData) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                    thisData = {};
+				};
+                this.setState({
+					type:thisData.type,
+					id:thisData.id,
+					data: thisData,
+					auditStatus:thisData.auditStatus,
+					edit:thisData.content,
+                    pictureUrl: thisData.coverUrl ? thisData.coverUrl.split(',') : []
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    handleSubmit(e,index) {
+		e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+			if (!this.state.pictureUrl.length) {
+				message.warning('请上传专栏图片!');
+				return false;
+			};
+			if((this.state.edit)==undefined||!this.state.edit||(this.state.edit)=='<p><br></p>'){
+				message.warning('请填写专栏正文');
+				return false;
+			}
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "post",
+					dataType: "json",
+					async:true,
+                    url: this.props.data.id ? globalConfig.context + '/api/admin/news/updateNews' : globalConfig.context + '/api/admin/news/apply',
+                    data: {
+						id: this.props.data.id,
+						type:this.state.type,
+						title: values.title,
+                        author: values.author,
+                        titleImg: this.state.pictureUrl.join(','),
+						content:this.state.edit,
+						hot:values.hot,
+						source:values.source,
+						sourceUrl:values.sourceUrl,
+						keyword:values.keyword,
+						auditStatus:index,
+                        summary: values.summary,
+                    }
+                }).done(function (data) {
+                    this.setState({
+                        loading: false
+					});
+
+                    if (!data.error.length) {
+                        message.success('操作成功!');
+                        this.setState({
+                            visible: false
+                        });
+                        this.props.handOk();
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this));
+            }
+        });
+	},
+	cancelFun(){
+		this.props.closeDesc();
+	},
+    componentWillMount() {
+        if (this.props.data.id) {
+            this.loadData(this.props.data.id);
+        } else {
+			this.state.visible=true;
+			this.state.data = {};
+			this.state.type=undefined;
+			this.state.edit='<p><br></p>';
+			this.state.pictureUrl = [];
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            this.state.textFileList = [];
+            this.state.videoFileList = [];
+            if (nextProps.data.id) {
+                this.loadData(nextProps.data.id);
+            } else {
+				this.state.visible=true;
+				this.state.data = {};
+				this.state.type=undefined;
+				this.state.edit='<p><br></p>';
+				this.state.pictureUrl = [];
+				this.state.theData={};
+            };
+			this.props.form.resetFields();
+        };
+    },
+    render() {
+        const theData = this.state.data || {};
+        const { getFieldDecorator } = this.props.form;
+        const FormItem = Form.Item
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+		};
+        return (
+			<div className='login'>
+			<Form layout="horizontal" onSubmit={(e)=>{this.handleSubmit(e,0)}} id="demand-form">
+				<Spin spinning={this.state.loading}>
+					<div className="clearfix">
+						<FormItem className="half-item" {...formItemLayout} label="标题">
+							{getFieldDecorator('title', {
+								rules: [ { required: true, message: '此项为必填项!' } ],
+								initialValue: theData.title
+							})(<Input placeholder="请输入您的专栏标题" />)}
+						</FormItem>
+						<FormItem className="half-item" {...formItemLayout} label="专栏类型">
+							{getFieldDecorator('type', {
+								rules: [ { required: true, message: '此项为必填项!' } ],
+							})(
+								<Select placeholder="专栏类型" onChange={(e)=>{this.setState({type:e})}} value={this.state.type}>
+								{
+									specialType.map(item=>{
+										return <Select.Option value={item.value}>{item.key}</Select.Option>
+									})
+								}
+                    			</Select>
+							)}
+						</FormItem>
+					</div>
+					<div className="clearfix">
+						{this.state.type=='1'?<FormItem className="half-item" {...formItemLayout} label="产品类型">
+							{getFieldDecorator('productType', {
+								rules: [ { required: true, message: '此项为必填项!' } ],
+								initialValue: theData.productType!=undefined?String(theData.type):theData.type
+							})(
+								<Select placeholder="产品类型">
+								{
+									productType.map(item=>{
+										return <Select.Option value={item.value}>{item.key}</Select.Option>
+									})
+								}
+                    			</Select>
+							)}
+						</FormItem>:''}
+						<FormItem className="half-item" {...formItemLayout} label="专栏来源">
+							{getFieldDecorator('source', {
+								rules: [ { required: true, message: '此项为必填项!' } ],
+								initialValue: theData.source
+							})(<Input placeholder="请输入来源" />)}
+						</FormItem>
+						<FormItem className="half-item" {...formItemLayout} label="来源链接">
+							{getFieldDecorator('sourceUrl', {
+								initialValue: theData.sourceUrl
+							})(<Input placeholder="请输入来源链接" />)}
+						</FormItem>
+						<FormItem  className="half-item" {...formItemLayout} label="关键字">
+							{getFieldDecorator('keyword', {
+								initialValue: theData.keyword
+							})(<Input placeholder="请输入关键字" />)}
+						</FormItem>
+					</div>
+					<div className="clearfix">
+						<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label="专栏图片">
+							<Crop 
+								getAllImg={(e)=>{this.setState({pictureUrl:e})}}
+								number = {1} 
+								aspectRatio = {2/1}
+								url ={globalConfig.context + '/api/admin/video/upload'}
+								uploadData = {{sign:'video_cover'}} 
+								urlArr = {this.state.pictureUrl} 
+							/>
+						</FormItem>
+					</div>
+					<div className="clearfix">
+						<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label="简介">
+							{getFieldDecorator('summary', {
+								rules: [ { required: true, message: '此项为必填项!' } ],
+								initialValue: theData.summary
+							})(<Input type="textarea" rows={4} placeholder="输入简介" />)}
+						</FormItem>
+					</div>
+					<div className="clearfix">
+						<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label={<span><i style={{color:"red",fontSize:14}}> * </i>专栏正文</span>}>
+							<Editors textContent={this.state.edit}
+								uploadUrl={'/api/user/demand/uploadPicture'}
+								uploadSign={'demand_picture'}
+								handleRichText={(value) => { this.state.edit = value;  }}
+								visible={this.state.visible} />
+						</FormItem>
+					</div>
+					<div className="clearfix">
+						<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label="是否发布">
+							<span>{theData.releaseStatus?'已发布':'未发布'}</span>
+						</FormItem>
+					</div>
+					<div  className="clearfix">
+						<FormItem className="half-item" {...formItemLayout} label="置顶">
+							{getFieldDecorator('hot', {
+								initialValue: theData.hot
+							})(
+								<Radio.Group>
+									<Radio value={0}>否</Radio>
+									<Radio value={1}>是</Radio>
+								</Radio.Group>
+							)}
+						</FormItem>
+						<FormItem className="half-item" {...formItemLayout} label="推荐">
+							{getFieldDecorator('hot1', {
+								initialValue: theData.hot1
+							})(
+								<Radio.Group>
+									<Radio value={0}>否</Radio>
+									<Radio value={1}>是</Radio>
+								</Radio.Group>
+							)}
+						</FormItem>
+					</div>
+					{/* <div className="clearfix">
+						<FormItem className="full-item" 
+							labelCol={{ span: 3 }}
+							wrapperCol={{ span: 18 }} label="发布位置">
+							{getFieldDecorator('publishPages', {
+								rules: [ { required: false } ],
+								initialValue: this.state.publishPages
+							})(
+								<Checkbox.Group>
+									<Row>
+										<Col span={6}><Checkbox value="web_index" disabled>网站新闻首页</Checkbox></Col>
+										<Col span={6}><Checkbox value="web_tech_service_index">网站申请首页</Checkbox></Col>
+										<Col span={6}><Checkbox value="app_policy_index" disabled>app新闻首页</Checkbox></Col>
+										<Col span={6}><Checkbox value="app_tech_service_index">APP科技服务首页</Checkbox></Col>
+									</Row>
+								</Checkbox.Group>
+							)}
+						</FormItem>
+					</div> */}
+					<div className="clearfix">
+						<FormItem wrapperCol={{ span: 12, offset: 3 }}>
+						    <Button className="set-submit" type="primary" htmlType="submit">
+								保存草稿
+							</Button>
+							<Button
+								className="set-submit"
+								type="ghost"
+								onClick={(e) => {
+										this.handleSubmit(e,2)
+								}}
+							>
+								发布新闻
+							</Button>
+							<Button className="set-submit" type="ghost" onClick={this.cancelFun}>
+								取消
+							</Button>
+						</FormItem>
+					</div>
+				</Spin>
+			</Form>    
+		</div>
+        )
+    }
+}));
+export default NewDetailForm;
+
+
+
+

+ 368 - 0
js/component/administration/product/proList.jsx

@@ -0,0 +1,368 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, Switch, message, DatePicker } from 'antd';
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+import '@/account/demand/techDemand.less';
+import NewDesc from '@/administration/product/proDesc';
+import '@/administration/news/news.less';
+import {releaseStateList,specialType,productType } from '@/dataDic.js';
+import {getReleaseStateList,getSpecialType,getProductType } from '@/tools.js';
+
+const DemandList = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            selectedRowKeys:[],
+            page:pageNo,
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/news/list",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                title: this.state.nameSearch, //需求名称
+                startCreateTime: this.state.releaseDate[0],
+                endCreateTime: this.state.releaseDate[1],
+                auditStatus:this.state.auditStatusSearch,
+                type:this.state.typeSearch
+            },
+            success: function (data) {
+                let theArr = [];
+                if (!data.data || !data.data.list) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                } else {
+                    for (let i = 0; i < data.data.list.length; i++) {
+                        let thisdata = data.data.list[i];
+                        theArr.push({
+                            key: i,
+                            id: thisdata.id,
+                            title: thisdata.title,
+                            author:thisdata.author,
+                            source: thisdata.source,
+                            auditStatus: thisdata.auditStatus, //审核状态
+                            releaseDate:thisdata.releaseDate?(new Date(thisdata.releaseDate)).toLocaleString():''
+                        });
+                    };
+                };
+                this.state.pagination.current = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                if(data.data&&data.data.list&&!data.data.list.length){
+					this.state.pagination.current=0
+					this.state.pagination.total=0
+				};
+                this.setState({
+                    dataSource: theArr,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            searchMore: true,
+            validityPeriodDate: [],
+            releaseDate: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: false,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '专栏名称',
+                    dataIndex: 'title',
+                    key: 'title',
+                },  {
+                    title: '专栏类型',
+                    dataIndex: 'author',
+                    key: 'author',
+                    render:text=>{return getSpecialType(text)}
+                },
+                {
+                    title: '产品类型',
+                    dataIndex: 'author1',
+                    key: 'author1',
+                    render:text=>{return getProductType(text)}
+                },
+                {
+                    title: '发布状态',
+                    dataIndex: 'auditStatus',
+                    key: 'auditStatus',
+                    render: text => { return getReleaseStateList(text) }
+                },
+                {
+                    title: '来源',
+                    dataIndex: 'source',
+                    key: 'source'
+                },
+                {
+                    title: '发布时间',
+                    dataIndex: 'releaseDate',
+                    key: 'releaseDate'
+                },
+                {
+                    title: '操作',
+                    dataIndex: 'caozuo',
+                    key: 'caozuo',
+                    render:(text,recard) => {
+                        return  <div className="btnRight">
+                                   {recard.auditStatus!='1'&&recard.auditStatus!='2'&&<Button type="primary" style={{ background: "#3fcf9e", border: "none", color: "#fff" }} onClick={(e)=>{e.stopPropagation(),this.submission(recard)}}>发布</Button>}
+                                   {recard.auditStatus!='1'&&recard.auditStatus=='2'&&<Button type="success" onClick={(e)=>{ e.stopPropagation(),this.updateFun(recard)}}>刷新发布</Button>}
+                                   {recard.auditStatus!='1'&&recard.auditStatus=='2'&&<Button type="danger" onClick={(e)=>{e.stopPropagation(),this.revokeFun(recard)}}>撤销发布</Button>}
+                                </div>
+                    }
+                }
+            ],
+            dataSource: [],
+            searchTime: [,]
+        };
+    },
+    //发布
+    submission(record){
+        this.setState({
+            showDesc:false,
+            loading:true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/news/updateStatus",
+            data: {
+                id:record.id,
+                auditStatus:2
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('发布成功.');
+                this.setState({
+                    loading: false,
+                });
+                this.loadData(this.state.page)
+            } else {
+                message.warning(data.error[0].message);
+            };
+        }.bind(this));
+    },
+    //刷新发布
+    updateFun(recard){
+        this.setState({
+            loading:true
+        })
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context +'/api/admin/news/updateStatus',
+            data: {
+                id: recard.id,
+                auditStatus:recard.auditStatus,
+                refresh:1
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('刷新成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.loadData(this.state.page);
+        }.bind(this));
+    },
+    //撤销发布
+    revokeFun(recard){
+        this.setState({
+            loading:true
+        })
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context +  '/api/admin/news/updateStatus',
+            data: {
+                id: recard.id,
+                auditStatus:4,
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('撤销成功!');
+                this.setState({
+                    loading: false,
+                });
+                this.loadData(this.state.page);
+            } else {
+                message.warning(data.error[0].message);
+            };
+        }.bind(this));
+    },
+    componentWillMount() {
+        this.loadData();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    delectRow(recard) {
+        this.setState({
+            loading:true
+        })
+        let deletedIds =[];
+        let rowItem = this.state.selectedRowKeys[0];
+        let data = this.state.dataSource ||[];
+        if (data.length) {
+            deletedIds.push(data[rowItem].id);
+        }
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/news/deleteById",
+            data: {
+                id: deletedIds[0]
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('删除成功!');
+                this.setState({
+                    loading: false
+                });
+                this.loadData(this.state.page);
+            } else {
+                message.warning(data.error[0].message);
+            };
+        }.bind(this));
+    },
+    addClick() {
+        this.state.RowData = {};
+        this.setState({
+            showDesc: true
+        });
+    },
+    closeDesc(e, s) {
+        this.state.showDesc = e;
+        if (s) {
+            this.loadData(this.state.page);
+        };
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.nameSearch = '';
+        this.state.typeSearch=undefined;
+        this.state.releaseDate = [];
+        this.state.dataCategorySearch = undefined;
+        this.state.auditStatusSearch = undefined;
+        this.loadData();
+    },
+    searchSwitch() {
+        this.setState({
+            searchMore: !this.state.searchMore
+        });
+    },
+    render() {
+        const rowSelection = {
+            selectedRowKeys: this.state.selectedRowKeys,
+            onChange: (selectedRowKeys, selectedRows) => {
+                this.setState({
+                    selectedRows: selectedRows.slice(-1),
+                    selectedRowKeys: selectedRowKeys.slice(-1)
+                });
+            }
+        };
+        const { RangePicker } = DatePicker;
+        const hasSelect = this.state.selectedRowKeys.length;
+        return (
+            <div className="user-content" >
+                <div className="content-title">
+                    <span>产品专栏管理</span>
+                    <div className="patent-addNew">
+                        <Button type="primary" onClick={this.addClick}>发布<Icon type="plus" /></Button>
+                    </div>
+                </div>
+                <div className="user-search">
+                    <Input placeholder="专栏名称"
+                        value={this.state.nameSearch}
+                        onChange={(e) => { this.setState({ nameSearch: e.target.value }); }} />
+                    <Select placeholder="发布状态" style={{ width: 120 }}
+                        value={this.state.auditStatusSearch}
+                        onChange={(e) => { this.setState({ auditStatusSearch: e }) }}>
+                        {
+                            releaseStateList.map(item=>{
+                                return <Select.Option value={item.value}  >{item.key}</Select.Option>
+                            })
+                        }
+                    </Select>
+                    <Select placeholder="产品专栏" style={{ width: 120 }}
+                        value={this.state.typeSearch}
+                        onChange={(e) => { this.setState({ typeSearch: e }) }}>
+                         {
+                            specialType.map(item=>{
+                                return <Select.Option value={item.value}  >{item.key}</Select.Option>
+                            })
+                        }
+                    </Select>
+                    <Select placeholder="产品类型" style={{ width: 120 }}
+                        value={this.state.typeSearch}
+                        onChange={(e) => { this.setState({ typeSearch: e }) }}>
+                         {
+                            productType.map(item=>{
+                                return <Select.Option value={item.value}  >{item.key}</Select.Option>
+                            })
+                        }
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <Button type="danger" disabled={!hasSelect}  onClick={(e)=>{this.delectRow()}}>删除</Button>
+                    <span>更多搜索<Switch defaultChecked={false} onChange={this.searchSwitch} /></span>
+                    <div className="search-more" style={this.state.searchMore ? { display: 'none' } : {}}>
+                        <span>发布时间 :</span>
+                        <RangePicker
+                            value={[this.state.releaseDate[0] ? moment(this.state.releaseDate[0]) : null,
+                            this.state.releaseDate[1] ? moment(this.state.releaseDate[1]) : null]}
+                            onChange={(data, dataString) => { this.setState({ releaseDate: dataString }); }} />
+                    </div>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            rowSelection={rowSelection}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <NewDesc
+                    data={this.state.RowData}
+                    showDesc={this.state.showDesc}
+                    closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default DemandList;

+ 13 - 6
js/component/administration/video/videoForm.jsx

@@ -161,15 +161,22 @@ const NewDetailForm = Form.create()(React.createClass({
         if (info.file.status !== 'uploading') {
         }
         if (info.file.status === 'done') {
-			message.success(`上传成功`);
 			fileList[0].url='javascript:;';
 			fileList[0].name=(fileList[0].response.data).split('/').pop();
+			let theDate = fileList[0].response;
+			if(theDate.error&&theDate.error.length){
+				message.error(theDate.error[0].message);
+				this.setState({
+					fileList:[],
+					loading:false,
+				})
+				return ;
+			};
+			message.success('上传成功');
 			this.setState({
-				fileList:fileList
+				fileList,
+				loading:false
 			})
-            this.setState({
-				loading:false,
-            })
         } else if (info.file.status === 'error') {
 			message.error(`上传失败`);
 			this.setState({
@@ -329,7 +336,7 @@ const NewDetailForm = Form.create()(React.createClass({
 							<Button className="set-submit" type="primary" htmlType="submit">
 								保存草稿
 							</Button>
-							{(this.props.data.id&&this.props.data.transcoding=='2')&&<Button
+							{(this.props.data.id&&theData.transcoding=='2')&&<Button
 								className="set-submit"
 								type="ghost"
 								onClick={(e) => {

+ 3 - 1
js/component/administration/video/videoList.jsx

@@ -92,6 +92,9 @@ const PolicyList = React.createClass({
                     title: '视频名称',
                     dataIndex: 'name',
                     key: 'name',
+                    render:text=>{
+                        return (text&&text.length>10)?text.substr(0,10)+'...':text;
+                    }
                 },  {
                     title: '视频地址',
                     dataIndex: 'url',
@@ -189,7 +192,6 @@ const PolicyList = React.createClass({
         });
     },
     delectRow() {
-       
         let deletedIds =[];
         let rowItem = this.state.selectedRowKeys[0];
         let data = this.state.dataSource ||[];

+ 29 - 0
js/component/dataDic.js

@@ -2542,4 +2542,33 @@ module.exports = {
 	        key: "首页"
 	    }
     ],
+     //专栏类型
+     specialType:[
+        {
+	        value: "0",
+	        key: "产品专栏"
+	    },{
+	        value: "1",
+	        key: "申报知识"
+	    }
+    ],
+    //产品类型
+    productType:[
+        {
+	        value: "0",
+	        key: "高新"
+	    },{
+	        value: "1",
+	        key: "军工"
+	    },{
+	        value: "2",
+	        key: "知识产权"
+	    },{
+	        value: "3",
+	        key: "科技项目"
+	    },{
+	        value: "4",
+	        key: "其他"
+	    }
+    ],
 };

+ 27 - 1
js/component/tools.js

@@ -92,7 +92,9 @@ import {
     couponCome,
     videoType,
     videoStatus,
-    videoPosition
+    videoPosition,
+    specialType,
+    productType
 } from './dataDic.js';
 
 import { provinceList} from './NewDicProvinceList.js';
@@ -1673,4 +1675,28 @@ module.exports = {
             return theType;
         }
     },
+     //专栏状态
+     getSpecialType: function (e) {
+        if (e||e=='0') {
+            let theType = '';
+            specialType.map(function (item) {
+                if (item.value == e) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
+    },
+     //产品状态
+     getProductType: function (e) {
+        if (e||e=='0') {
+            let theType = '';
+            productType.map(function (item) {
+                if (item.value == e) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
+    },
 }

+ 1 - 1
package.json

@@ -12,7 +12,7 @@
     "buildtest": "node bin/clean.js && webpack --progress --colors --env.deploy test",
     "buildstage": "node bin/clean.js && webpack --progress --colors --env.deploy stage",
     "pro": "node bin/clean.js && webpack --progress --colors --env.deploy prod",
-    "dev": "webpack-dev-server --port 8088 --devtool eval --progress --colors --hot --content-base build --env.deploy dev --env.watch watch"
+    "dev": "webpack-dev-server --port 80 --devtool eval --progress --colors --hot --content-base build --env.deploy dev --env.watch watch"
   },
   "repository": {
     "type": "git",

+ 1 - 1
webpack-dll.config.js

@@ -10,7 +10,7 @@ let theme = {
   '@link-color': '#58a3ff'
 };
 module.exports = (function () {
-	let staticHost = 'http://192.168.0.188:8088';   
+	let staticHost = 'http://192.168.0.188:80';   
     switch (argv.env.deploy) {
         case 'test':
             staticHost = 'http://statics.jishutao.com';

+ 2 - 2
webpack.config.js

@@ -121,7 +121,7 @@ module.exports = (function () {
         }));
     }
 
-    let staticHost = 'http://192.168.0.188:8088';    
+    let staticHost = 'http://192.168.0.188:80';    
     switch (argv.env.deploy) {
         case 'test':
             staticHost = 'http://statics.jishutao.com';
@@ -157,7 +157,7 @@ module.exports = (function () {
         devServer: {
             disableHostCheck: true,
             host: '192.168.0.188',
-            port: 8088,
+            port: 80,
             allowedHosts: ['127.0.0.1','192.168.0.20','192.168.0.99'],
             headers: {
                 "Access-Control-Allow-Origin": "*"