Browse Source

提交活动策划管理模块

dev01 3 years ago
parent
commit
424d059052

BIN
image/audio.png


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

@@ -22,6 +22,7 @@ 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 PlanningNews from '@/administration/planning/news';
 
 
 import {hashHistory,Route,Router} from 'react-router';
@@ -58,6 +59,7 @@ export default class ContentRouter extends React.Component {
             <Route path="/coupon" component={Coupon} />
             <Route path="/video" component={Video} />
             <Route path="/product" component={Product} />
+            <Route path="/planningNews" component={PlanningNews} />
         </Router>
       </Content>
     )

+ 8 - 0
js/admin/menu.jsx

@@ -100,5 +100,13 @@ module.exports = {
       //     { name: '劵面管理', url: 'coupon' },
       //   ]
       // },
+      {
+        name: '活动策划管理',
+        url: 'sub13',
+        icon: 'red-envelope',
+        children: [
+          { name: '活动策划', url: 'planningNews' },
+        ]
+      }
     ]
 }

+ 31 - 0
js/component/SpinContainer.jsx

@@ -0,0 +1,31 @@
+import React,{Component} from 'react';
+import {Spin} from "antd";
+
+class SpinContainer extends Component{
+    constructor(props) {
+        super(props);
+    }
+
+    render() {
+        return (
+            <div style={{position:'relative'}}>
+                {this.props.children}
+                {this.props.spinning ? <div style={{
+                    position: 'absolute',
+                    top: '0px',
+                    bottom: '0px',
+                    left: '0px',
+                    right: '0px',
+                    display: 'flex',
+                    alignItems: 'center',
+                    justifyContent: 'center',
+                    background: 'rgb(255, 255, 255,.3)',
+                }}>
+                    <Spin className={this.props.className} spinning={this.props.spinning}/>
+                </div> : null}
+            </div>
+        )
+    }
+}
+
+export default SpinContainer;

+ 865 - 0
js/component/administration/planning/news.jsx

@@ -0,0 +1,865 @@
+import React from "react";
+import $ from "jquery/src/ajax";
+import "react-quill/dist/quill.bubble.css";
+import moment from "moment";
+import "./techDemand.less";
+import {
+  Form,
+  Icon,
+  Button,
+  Input,
+  Select,
+  Table,
+  message,
+  DatePicker,
+  Modal,
+  Upload,
+  Popconfirm,
+  Cascader,
+  InputNumber,
+  Radio,
+  TimePicker,
+  Tabs,
+  Tag
+} from "antd";
+import { areaSelect, getProvince } from "../../NewDicProvinceList"; //省市区
+import {
+  getGameState,
+  splitUrl,
+  getprovince,
+  getStatuslist,
+  getLvl,
+  beforeUploadFile,
+  getPicPath
+} from "@/tools.js";
+import Editors from "@/richTextEditor";
+import SpinContainer from "../../SpinContainer"; //富文本编辑器
+
+// 上传文件
+const PicturesWall = React.createClass({
+  getInitialState() {
+    return {
+      previewVisible: false,
+      previewImage: "",
+      fileList: this.props.pictureUrl
+    };
+  },
+  getDefaultProps() {
+    return {
+      changeClick: this.modifyChange
+    };
+  },
+  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;
+    console.log(nextProps.pictureUrl);
+  },
+  render() {
+    const { previewVisible, previewImage, fileList } = this.state;
+    // 点击上传
+    const uploadButton = (
+      <div>
+        <Icon type="plus" />
+        <div className="ant-upload-text">点击上传</div>
+      </div>
+    );
+    return (
+      //上传组件
+      <div style={{ display: "inline-block" }}>
+        <Upload
+          beforeUpload={beforeUploadFile}
+          // action={globalConfig.context + "/api/admin/militaryEnterprises/uploadPicture"}
+          action={globalConfig.context + "/api/admin/eventPlanning/uploadFile"}
+          data={{ sign: "enterprises_pucture" }}
+          listType="picture-card"
+          fileList={fileList}
+          onPreview={this.handlePreview}
+          onChange={this.handleChange}
+        >
+          {fileList && fileList.length >= 1 ? null : uploadButton}
+        </Upload>
+        <Modal
+          maskClosable={false}
+          visible={previewVisible}
+          footer={null}
+          onCancel={e => {
+            this.setState({ previewVisible: false });
+          }}
+        >
+          <img alt="" style={{ width: "100%" }} src={previewImage} />
+        </Modal>
+      </div>
+    );
+  }
+});
+//主体
+const planningNews = Form.create()(
+  React.createClass({
+    // 初始化数据
+    loadData(pageNo) {
+      this.state.data = [];
+      this.setState({
+        loading: true,
+        page: pageNo
+      });
+      //发送请求
+      $.ajax({
+        method: "get",
+        dataType: "json",
+        crossDomain: false,
+        url: globalConfig.context + "/api/admin/eventPlanning/list",
+        data: {
+          pageNo: pageNo || this.state.pagination.current || 1,
+          pageSize: this.state.pagination.pageSize,
+          title: this.state.titleSearch
+        },
+        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 + 1,
+                id: thisdata.id,
+                title: thisdata.title,
+                publisher: thisdata.publisher,
+                type: thisdata.type,
+                pictureUrl: thisdata.pictureUrl,
+                sort: thisdata.sort,
+                releaseStatus: thisdata.releaseStatus,
+                releaseTimeConvert: thisdata.releaseTimes,
+                status: thisdata.status,
+                content: thisdata.content
+              });
+            }
+            this.state.pagination.current = data.data.pageNo;
+            this.state.pagination.total = data.data.totalCount;
+          }
+          this.setState({
+            dataSource: theArr,
+            pagination: this.state.pagination
+          });
+        }.bind(this)
+      }).always(
+        function() {
+          this.setState({
+            loading: false
+          });
+        }.bind(this)
+      );
+    },
+    //声明状态
+    getInitialState() {
+      return {
+        loading: false,
+        flag: true,
+        editorState: null,
+        activeKey: "1",
+        timesArr: [],
+        ProvinceCity: [],
+        ProvinceCityC: [],
+        totalData: {
+          mark: false
+        },
+        imgWidth: "width: 200px",
+        logoUrl: [],
+        pagination: {
+          defaultCurrent: 1,
+          defaultPageSize: 10,
+          showQuickJumper: true,
+          pageSize: 10,
+          onChange: function(page) {
+            this.loadData(page);
+            this.setState({
+              selectedRowKeys: []
+            });
+          }.bind(this),
+          showTotal: function(total) {
+            return "共" + total + "条数据";
+          }
+        },
+        //数据类型
+        columns: [
+          {
+            title: "序号",
+            dataIndex: "key",
+            key: "key"
+          },
+          {
+            title: "新闻分类",
+            dataIndex: "type",
+            key: "type",
+            render: text => {
+              if (text == 0) {
+                return "公司新闻";
+              } else if (text == 1) {
+                return "行业新闻";
+              }
+            }
+          },
+          {
+            title: "新闻标题",
+            dataIndex: "title",
+            key: "title",
+            render: text => {
+              return text.length >= 8 ? text.substring(0, 8) + "..." : text;
+            }
+          },
+          {
+            title: "排序",
+            dataIndex: "sort",
+            key: "sort"
+          },
+          {
+            title: "是否首页",
+            dataIndex: "status",
+            key: "status",
+            render: s => {
+              return s ? (
+                <Tag color="#87d068">是</Tag>
+              ) : (
+                <Tag color="#f50">否</Tag>
+              );
+            }
+          },
+          {
+            title: "新闻缩率图",
+            dataIndex: "pictureUrl",
+            key: "pictureUrl",
+            render: url => {
+              let path = getPicPath(globalConfig.avatarUploadHost, url);
+              return (
+                <div style={{ textAlign: "center" }}>
+                  <img src={path} style={{ width: "100px", height: 50 }} />
+                  <Button
+                    className="buttonimg"
+                    style={{ marginLeft: 10 }}
+                    onClick={e => {
+                      e.stopPropagation();
+                      this.maximg(path);
+                    }}
+                  >
+                    查看大图
+                  </Button>
+                </div>
+              );
+            }
+          },
+          {
+            title: "发布状态",
+            dataIndex: "releaseStatus",
+            key: "releaseStatus",
+            render: text => {
+              return text ? "是" : "否";
+            }
+          },
+          //   {
+          //     title: "置顶",
+          //     dataIndex: "topNumber",
+          //     key: "topNumber",
+          //     render: text => {
+          //       return text ? "否" : "是";
+          //     }
+          //   },
+          {
+            title: "操作",
+            dataIndex: "operate",
+            key: "operate",
+            render: (text, record, index) => {
+              return (
+                <div>
+                  <Button
+                    type="primary"
+                    style={{ marginLeft: "10px" }}
+                    onClick={() => {
+                      this.setState({
+                        flag: true
+                      });
+                      this.edit(record);
+                    }}
+                  >
+                    编辑
+                  </Button>
+                  <Popconfirm
+                    title="您确定删除该新闻吗?"
+                    onConfirm={() => this.confirm(record.id)}
+                    onCancel={this.cancel}
+                    okText="是"
+                    cancelText="否"
+                  >
+                    <Button
+                      type="danger"
+                      style={{ marginLeft: "10px" }}
+                      onClick={e => {
+                        e.stopPropagation();
+                      }}
+                    >
+                      删除
+                    </Button>
+                  </Popconfirm>
+                  <Button
+                    type="primary"
+                    style={{ marginLeft: "10px" }}
+                    onClick={e => {
+                      e.stopPropagation();
+                      if (record.releaseStatus) {
+                        this.toTop(record, 0);
+                      } else {
+                        this.toTop(record, 1);
+                      }
+                    }}
+                  >
+                    {record.releaseStatus ? "撤销发布" : "发布"}
+                  </Button>
+                </div>
+              );
+            }
+          },
+          {
+            title: "发布时间",
+            dataIndex: "releaseTimeConvert",
+            key: "releaseTimeConvert"
+          }
+        ],
+        //数据列表
+        dataSource: []
+      };
+    },
+    // 新增新闻按钮
+    add() {
+      this.setState({
+        editvisible: true,
+        flag: false
+      });
+    },
+    // 推荐置顶
+    toTop(record, num) {
+      $.ajax({
+        method: "post",
+        dataType: "json",
+        crossDomain: false,
+        url: globalConfig.context + "/api/admin/eventPlanning/update",
+        data: {
+          id: record.id,
+          releaseStatus: num
+        },
+        success: function(data) {
+          let theArr = [];
+          if (data.error && data.error.length) {
+            message.warning(data.error[0].message);
+          } else {
+            this.loadData();
+          }
+        }.bind(this)
+      }).always(
+        function() {
+          this.setState({
+            loading: false
+          });
+        }.bind(this)
+      );
+    },
+    //编辑按钮操作
+    tableRowClick(record) {
+      this.setState({
+        editvisible: true
+      });
+      this.edit(record);
+    },
+    edit(record, index) {
+      this.setState({
+        editvisible: true,
+        loading: true
+      });
+      $.ajax({
+        method: "get",
+        dataType: "json",
+        crossDomain: false,
+        url: globalConfig.context + "/api/admin/eventPlanning/selectNews",
+        data: {
+          id: record.id
+        },
+        success: function(data) {
+          let theArr = [];
+          if (data.error && data.error.length) {
+            message.warning(data.error[0].message);
+          } else {
+            let thisdata = data.data;
+            this.setState({
+              id: thisdata.id,
+              title: thisdata.title,
+              publisher: thisdata.publisher,
+              type: thisdata.type,
+              pictureUrl: thisdata.pictureUrl
+                ? splitUrl(
+                    thisdata.pictureUrl,
+                    ",",
+                    globalConfig.avatarUploadHost
+                  )
+                : [],
+              sort: thisdata.sort,
+              editorcontext: thisdata.content,
+              releaseStatus: thisdata.releaseTimes,
+              time: thisdata.releaseTimes
+                ? thisdata.releaseTimes
+                : thisdata.createTimes
+            });
+            window.setTimeout(() => {
+              console.log(this.state);
+            }, 100);
+          }
+        }.bind(this)
+      }).always(
+        function() {
+          this.setState({
+            loading: false
+          });
+        }.bind(this)
+      );
+    },
+    getOrgCodeUrl(e) {
+      this.setState({ pictureUrl: e });
+    },
+    // 新增新闻
+    addNew(flag) {
+      if (this.state.flag) {
+        $.ajax({
+          method: "post",
+          dataType: "json",
+          crossDomain: false,
+          url: globalConfig.context + "/api/admin/eventPlanning/update",
+          data: {
+            id: this.state.id,
+            title: this.state.title,
+            publisher: this.state.publisher,
+            type: this.state.type,
+            pictureUrl: this.state.pictureUrl
+              ? this.state.pictureUrl[0].response.data
+              : undefined,
+            sort: this.state.sort,
+            content: this.state.editorcontext,
+            status: this.state.status,
+            releaseTimes: this.state.time,
+            releaseStatus: flag ? flag : undefined
+          },
+          success: function(data) {
+            let theArr = [];
+            if (data.error && data.error.length) {
+              message.warning(data.error[0].message);
+            } else {
+              this.loadData();
+              this.handleCancelEdit();
+            }
+          }.bind(this)
+        }).always(
+          function() {
+            this.setState({
+              loading: false
+            });
+          }.bind(this)
+        );
+      } else {
+        $.ajax({
+          method: "post",
+          dataType: "json",
+          crossDomain: false,
+          url: globalConfig.context + "/api/admin/eventPlanning/add",
+          data: {
+            title: this.state.title,
+            publisher: this.state.publisher,
+            type: this.state.type,
+            pictureUrl: this.state.pictureUrl[0].response.data,
+            sort: this.state.sort,
+            content: this.state.editorcontext,
+            releaseStatus: flag ? flag : undefined,
+            status: 0,
+            releaseTimes: this.state.time
+          },
+          success: function(data) {
+            let theArr = [];
+            if (data.error && data.error.length) {
+              message.warning(data.error[0].message);
+            } else {
+              this.loadData();
+              this.handleCancelEdit();
+            }
+          }.bind(this)
+        }).always(
+          function() {
+            this.setState({
+              loading: false
+            });
+          }.bind(this)
+        );
+      }
+    },
+    //表单内容改变时候触发
+    change(key, e, f) {
+      if (f === undefined) {
+        this.state.totalData[key] = e;
+        this.setState({
+          totalData: this.state.totalData
+        });
+      } else if (typeof f === "function") {
+        this.state.totalData[key] = e;
+        this.setState(
+          {
+            totalData: this.state.totalData
+          },
+          f
+        );
+      }
+    },
+    // 关闭模态框
+    handleCancelEdit() {
+      this.setState({
+        editvisible: false
+      });
+      this.addReset();
+    },
+    //点击大图
+    maximg(url) {
+      this.setState({
+        imgeditvisible: true,
+        maximg: url
+      });
+    },
+    componentWillMount() {
+      this.loadData();
+    },
+    //确认要删除吗
+    confirm(id) {
+      $.ajax({
+        method: "post",
+        dataType: "json",
+        crossDomain: false,
+        url: globalConfig.context + "/api/admin/news/deleteNews",
+        data: {
+          id
+        },
+        success: function(data) {
+          let theArr = [];
+          if (data.error && data.error.length) {
+            message.warning(data.error[0].message);
+          } else {
+            this.loadData();
+          }
+        }.bind(this)
+      }).always(
+        function() {
+          this.setState({
+            loading: false
+          });
+        }.bind(this)
+      );
+    },
+    imghandleCancel() {
+      this.setState({
+        imgeditvisible: false
+      });
+    },
+    //取消删除
+    cancel() {
+      console.log("我取消删除了");
+    },
+    async submitContent() {
+      // 在编辑器获得焦点时按下ctrl+s会执行此方法
+      // 编辑器内容提交到服务端之前,可直接调用editorState.toHTML()来获取HTML格式的内容
+      const htmlContent = this.state.editorState.toHTML();
+      const result = await saveEditorContent(htmlContent);
+    },
+    //新增框的清零
+    addReset() {
+      this.setState({
+        pictureUrl: [],
+        title: undefined,
+        publisher: undefined,
+        type: undefined,
+        sort: undefined,
+        editorcontext: "",
+        time: undefined
+      });
+    },
+    //搜索部分的清零
+    reset() {
+      this.state.titleSearch = undefined;
+      this.loadData();
+    },
+
+    render() {
+      const FormItem = Form.Item;
+      const rowSelection = {
+        selectedRowKeys: this.state.selectedRowKeys,
+        onChange: (selectedRowKeys, selectedRows) => {
+          this.setState({
+            selectedRows: selectedRows.slice(-1),
+            selectedRowKeys: selectedRowKeys.slice(-1)
+          });
+        }
+      };
+      let data = this.state.totalData;
+      const { TextArea } = Input; //文本域
+      const { TabPane } = Tabs; //标签页
+      const { MonthPicker, RangePicker, WeekPicker } = DatePicker; //日期输入框
+      const { editorState } = this.state;
+      return (
+        <div className="user-content">
+          <div className="content-title">
+            <span>活动策划</span>
+            <div className="user-search">
+              <Input
+                placeholder="请输入"
+                style={{
+                  width: "150px",
+                  marginRight: "10px",
+                  marginBottom: "10px"
+                }}
+                value={this.state.titleSearch}
+                onChange={e => {
+                  this.setState({ titleSearch: e.target.value });
+                }}
+              />
+              <Button
+                type="primary"
+                onClick={e => {
+                  this.loadData();
+                }}
+                style={{ marginRight: "10px" }}
+              >
+                搜索
+              </Button>
+              <Button onClick={this.reset} style={{ marginRight: "10px" }}>
+                重置
+              </Button>
+              <Button
+                type="primary"
+                onClick={this.add}
+                style={{ marginLeft: "100px" }}
+              >
+                新增新闻
+              </Button>
+            </div>
+            {/* 新闻表单 */}
+            <div className="patent-table">
+              <SpinContainer spinning={this.state.loading}>
+                <Table
+                  columns={this.state.columns}
+                  dataSource={this.state.dataSource}
+                  pagination={this.state.pagination}
+                  onRowClick={this.tableRowClick}
+                  bordered
+                  size="small"
+                  ellipsis="true"
+                />
+              </SpinContainer>
+            </div>
+          </div>
+          {/* 模块框 */}
+          <div className="patent-desc">
+            <Modal
+              className="customeDetails"
+              title={this.state.flag ? "新闻详情" : "新增新闻"}
+              width="1000px"
+              onCancel={this.handleCancelEdit}
+              visible={this.state.editvisible}
+              footer=""
+            >
+              <Form
+                layout="horizontal"
+                onSubmit={this.edithandleSubmit}
+                id="demand-form"
+              >
+                <SpinContainer spinning={this.state.loading}>
+                  <div className="clearfix">
+                    <FormItem
+                      className="half-item"
+                      labelCol={{ span: 8 }}
+                      wrapperCol={{ span: 12 }}
+                      label="新闻标题"
+                    >
+                      <Input
+                        placeholder="请输入新闻标题"
+                        value={this.state.title}
+                        onChange={e => {
+                          this.setState({
+                            title: e.target.value
+                          });
+                        }}
+                        style={{ width: "240px" }}
+                      />
+                    </FormItem>
+                    <FormItem
+                      className="half-item"
+                      labelCol={{ span: 8 }}
+                      wrapperCol={{ span: 12 }}
+                      label="新闻类别"
+                    >
+                      <Select
+                        style={{ width: 120 }}
+                        placeholder="请选择新闻类型"
+                        value={
+                          this.state.type == 1
+                            ? "行业新闻"
+                            : this.state.type == 0
+                            ? "公司新闻"
+                            : []
+                        }
+                        onChange={e => {
+                          this.setState({
+                            type: e
+                          });
+                        }}
+                      >
+                        <Option value="0">公司新闻</Option>
+                        <Option value="1">行业新闻</Option>
+                      </Select>
+                    </FormItem>
+                    <FormItem
+                      className="half-item"
+                      labelCol={{ span: 8 }}
+                      wrapperCol={{ span: 12 }}
+                      label="新闻发布人"
+                    >
+                      <Input
+                        placeholder="请输入新闻发布人"
+                        value={this.state.publisher}
+                        onChange={e => {
+                          this.setState({
+                            publisher: e.target.value
+                          });
+                        }}
+                        style={{ width: "240px" }}
+                      />
+                    </FormItem>
+                    <FormItem
+                      className="half-item"
+                      labelCol={{ span: 8 }}
+                      wrapperCol={{ span: 12 }}
+                      label="发布时间"
+                    >
+                      <DatePicker
+                        placeholder="请输入发布时间"
+                        format="YYYY-MM-DD HH:mm:ss"
+                        showTime
+                        value={this.state.time ? moment(this.state.time) : null}
+                        onChange={(e, f) => {
+                          this.setState({ time: f });
+                          console.log(e, f);
+                        }}
+                        style={{ width: "240px" }}
+                      />
+                    </FormItem>
+                    <FormItem
+                      className="half-item"
+                      labelCol={{ span: 8 }}
+                      wrapperCol={{ span: 12 }}
+                      label="排序"
+                    >
+                      <Input
+                        placeholder="请输入排序"
+                        value={this.state.sort}
+                        onChange={e => {
+                          this.setState({
+                            sort: e.target.value
+                          });
+                        }}
+                        style={{ width: "240px" }}
+                      />
+                    </FormItem>
+                  </div>
+                  <div className="clearfix">
+                    <FormItem
+                      labelCol={{ span: 4 }}
+                      wrapperCol={{ span: 18 }}
+                      onCancel={this.handleCancel}
+                      label="新闻大图"
+                    >
+                      <PicturesWall
+                        fileList={this.getOrgCodeUrl}
+                        pictureUrl={this.state.pictureUrl}
+                      />
+                      <p>建议尺寸:345X200 图片建议:要清晰。</p>
+                    </FormItem>
+                  </div>
+                  <div className="clearfix">
+                    <FormItem
+                      labelCol={{ span: 4 }}
+                      wrapperCol={{ span: 18 }}
+                      label="企业简介"
+                    >
+                      <Editors
+                        textContent={this.state.editorcontext}
+                        uploadUrl={"/api/admin/news/uploadFile"}
+                        globalConfig={globalConfig.uploadPath}
+                        placeholder="业务项目客户基本条件"
+                        handleRichText={value => {
+                          this.setState({ editorcontext: value });
+                        }}
+                      />
+                    </FormItem>
+                  </div>
+                  <div className="clearfix">
+                    <Button
+                      type="primary"
+                      size="large"
+                      onClick={e => {
+                        this.addNew(0);
+                      }}
+                      style={{
+                        float: "right",
+                        marginRight: "80px",
+                        marginTop: "20px"
+                      }}
+                    >
+                      保存
+                    </Button>
+                    <Button
+                      type="primary"
+                      size="large"
+                      onClick={e => {
+                        this.addNew(1);
+                      }}
+                      style={{
+                        float: "right",
+                        marginRight: "20px",
+                        marginTop: "20px"
+                      }}
+                    >
+                      保存并发布
+                    </Button>
+                  </div>
+                </SpinContainer>
+              </Form>
+            </Modal>
+            <Modal
+              visible={this.state.imgeditvisible}
+              onCancel={this.imghandleCancel}
+              onOk={this.imgOk}
+            >
+              <img style={{ width: "100%" }} src={this.state.maximg} />
+            </Modal>
+          </div>
+        </div>
+      );
+    }
+  })
+);
+
+export default planningNews;

+ 114 - 0
js/component/administration/planning/techDemand.less

@@ -0,0 +1,114 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        color: #333;
+        font-size: 16px;
+    }
+    .user-search {
+        margin-bottom: 10px;
+        >input {
+            width: 140px;
+        }
+        >input,
+        >button,
+        .ant-select {
+            margin-right: 10px;
+            margin-top: 10px;
+        }
+        .ant-switch {
+            margin-left: 10px;
+        }
+        
+        .search-more {
+            margin: 10px 0;
+            span {
+                margin-right: 10px
+            }
+        }
+    }
+    .operateButto{
+        button{
+            margin-left: 10px;
+        }
+    }
+    .fuwen{
+        border: 1px solid;
+    }
+
+}
+ .breakWord  span {
+    word-break: break-all;  
+    word-wrap: break-word; 
+    white-space: pre-wrap;
+}
+button:focus,button:active{
+    outline: none
+}
+.btnRight button{
+    margin-right: 10px;
+}
+.patent-addNew {
+    float: right;
+    margin-left: 20px;
+    button {
+        background: #ea0862;
+        color: #fff;
+        border: none;
+        border-radius: 4px;
+        padding: 6px 10px;
+        margin-left: 20px;
+    }
+    button:hover {
+        background: #ea0862;
+    }
+}
+
+#demand-form {
+    .half-item {
+        float: left;
+        width: 50%;
+        margin-bottom: 10px;
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
+    .keyWord-tips {
+        >button {
+            vertical-align: middle;
+        }
+    }
+    .set-submit {
+        margin-right: 20px;
+    }
+    .demandDetailShow-upload {
+        .anticon-eye-o {
+            margin-left: -8px;
+        }
+        .anticon-delete {
+            display: none
+        }
+    }
+}
+
+.ant-modal-content {
+    .modal-submit {
+        margin-left: 20px;
+    }
+}
+
+.ant-table-thead {
+    .ant-table-selection-column {
+        .ant-checkbox-wrapper {
+            display: none;
+        }
+    }
+}
+.a{border: 1px solid;}
+.newsImg{width: 150px;}

+ 273 - 0
js/component/richTextEditor.jsx

@@ -0,0 +1,273 @@
+import React from 'react';
+import theme from 'react-quill/dist/quill.snow.css';
+import { message } from 'antd';
+import ReactQuill,{Quill} from 'react-quill';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import audioIcon from '../../image/audio.png';
+
+
+let BlockEmbed = Quill.import('blots/block/embed');
+class AppPanelEmbed extends BlockEmbed {
+    static create(value) {
+        const node = super.create(value);
+        node.setAttribute('contenteditable', 'false');
+        node.setAttribute('width', '100%');
+        //   设置自定义html
+        node.innerHTML = this.transformValue(value)
+        return node;
+    }
+
+    static transformValue(value) {
+        let handleArr = value.split('\n')
+        handleArr = handleArr.map(e => e.replace(/^[\s]+/, '')
+            .replace(/[\s]+$/, ''))
+        return handleArr.join('')
+    }
+
+    // 返回节点自身的value值 用于撤销操作
+    static value(node) {
+        return node.innerHTML
+    }
+}
+// blotName
+AppPanelEmbed.blotName = 'AppPanelEmbed';
+// class名将用于匹配blot名称
+AppPanelEmbed.className = 'embed-innerApp';
+// 标签类型自定义
+AppPanelEmbed.tagName = 'p';
+Quill.register(AppPanelEmbed);
+
+var RichTextUploadUrl, RichTextUploadSign;
+//上传图片
+function uploadImg(s,_this) {
+    let myform = new FormData()
+    let file = document.getElementById(_this.props.id + "fileToUpload").files[0];
+    if (!file) { return; };
+    if(file.size > 52428800){
+        message.warning('图片大小不能超过50M');
+        return
+    }
+    myform.append('file', file);
+    myform.append('sign', RichTextUploadSign);
+    $.ajax({
+        method: "post",
+        dataType: "json",
+        url: location.origin + RichTextUploadUrl,
+        data: myform,
+        contentType: false,
+        processData: false,
+        success: function (data) {
+            if (data.error && data.error.length) {
+                message.warning(data.error[0].message);
+                document.getElementById(_this.props.id + "fileToUpload").value = ''
+            } else {
+                const cursorPosition = s.quill.getSelection().index
+                s.quill.insertEmbed(
+                    cursorPosition,
+                    'AppPanelEmbed',
+                    `<img style="width: 100%" src="${globalConfig.avatarUploadHost + data.data}"/>`
+                );
+                s.quill.setSelection(cursorPosition + 1);
+                document.getElementById(_this.props.id + "fileToUpload").value = ''
+            };
+        },
+        error: function(XMLHttpRequest, textStatus, errorThrown){
+            //查看错误信息
+            message("上传失败");
+            document.getElementById(_this.props.id + "fileToUpload").value = ''
+        }
+    })
+}
+//图片文件选择
+function fileSelect() {
+    let _this = this.options._this;
+    let uploader = document.getElementById(_this.props.id + "fileToUpload");
+    if (!uploader.onchange) {
+        uploader.onchange = () => {
+            uploadImg(this,_this)
+        }
+    }
+    uploader.click();
+}
+//音频文件选择
+function fileSelectAudio() {
+    let _this = this.options._this;
+    let uploader = document.getElementById(_this.props.id + "fileToUploadAudio");
+    if (!uploader.onchange) {
+        uploader.onchange = () => {
+            uploadAudio(this,_this)
+        }
+    }
+    uploader.click();
+}
+//音频文件上传
+function uploadAudio(s,_this) {
+    let myform = new FormData()
+    let file = document.getElementById(_this.props.id + "fileToUploadAudio").files[0]
+    if (!file) { return; };
+    if(file.size > 52428800){
+        message.warning('音频大小不能超过50M');
+        return
+    }
+    myform.append('file', file);
+    myform.append('sign', RichTextUploadSign);
+    $.ajax({
+        method: "post",
+        dataType: "json",
+        url: location.origin + RichTextUploadUrl,
+        data: myform,
+        contentType: false,
+        processData: false,
+        success: function (data) {
+            if (data.error && data.error.length) {
+                message.warning(data.error[0].message);
+                document.getElementById(_this.props.id + "fileToUploadAudio").value = ''
+            } else {
+                const cursorPosition = s.quill.getSelection().index
+                s.quill.insertEmbed(
+                    cursorPosition,
+                    'AppPanelEmbed',
+                    `<audio src="${globalConfig.avatarUploadHost + data.data}" controls="controls">Your browser does not support the audio element.</audio>`
+                );
+                s.quill.setSelection(cursorPosition + 1)
+                document.getElementById(_this.props.id + "fileToUploadAudio").value = ''
+            };
+
+        },
+        error: function(XMLHttpRequest, textStatus, errorThrown){
+            document.getElementById(_this.props.id + "fileToUploadAudio").value = ''
+            //查看错误信息
+            message("上传失败");
+        }
+    })
+}
+//视频文件选择
+function fileSelectVideo() {
+    let _this = this.options._this;
+    let uploader = document.getElementById(_this.props.id + "fileToUploadVideo");
+    if (!uploader.onchange) {
+        uploader.onchange = () => {
+            uploadVideo(this,_this)
+        }
+    }
+    uploader.click();
+}
+//视频文件上传
+function uploadVideo(s,_this) {
+    let myform = new FormData()
+    let file = document.getElementById(_this.props.id + "fileToUploadVideo").files[0]
+    if (!file) { return; };
+    if(file.size > 52428800){
+        message.warning('视频大小不能超过50M');
+        return
+    }
+    myform.append('file', file);
+    myform.append('sign', RichTextUploadSign);
+    $.ajax({
+        method: "post",
+        dataType: "json",
+        url: location.origin + RichTextUploadUrl,
+        data: myform,
+        contentType: false,
+        processData: false,
+        success: function (data) {
+            if (data.error && data.error.length) {
+                message.warning(data.error[0].message);
+                document.getElementById(_this.props.id + "fileToUploadVideo").value = ''
+            } else {
+                const cursorPosition = s.quill.getSelection().index
+                s.quill.insertEmbed(
+                    cursorPosition,
+                    'AppPanelEmbed',
+                    `<video style="width:100%" controls="" autoPlay="" name="media">
+                            <source src=${globalConfig.avatarUploadHost + data.data} type="video/mp4">
+                    </video>`
+                );
+                s.quill.setSelection(cursorPosition + 1);
+                document.getElementById(_this.props.id + "fileToUploadVideo").value = ''
+            };
+
+        },
+        error: function(XMLHttpRequest, textStatus, errorThrown){
+            document.getElementById(_this.props.id + "fileToUploadVideo").value = ''
+            //查看错误信息
+        }
+    })
+}
+
+const Editors = React.createClass({
+    getInitialState() {
+        return {
+            value: null,
+            theBool: true
+        }
+    },
+    handleRichText(value) {
+        this.setState({ value: value });
+        this.props.handleRichText(value);
+        // this.props.handleRichText(value.replace(/iframe/g, 'video'));
+    },
+    componentDidMount() {
+        document.getElementsByClassName( 'ql-audio')[this.props.id || 0].style = `background: url(${audioIcon}) no-repeat;background-size: contain;`
+    },
+    componentWillMount() {
+        RichTextUploadUrl = this.props.uploadUrl;
+        RichTextUploadSign = this.props.uploadSign;
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.theBool = true;
+        // if(nextProps.textContent){
+        this.state.value = nextProps.textContent || '';
+        // }
+    },
+    render() {
+        const modules = {
+            toolbar: {
+                container: [
+                    [{ 'size': ['small', false, 'large', 'huge'] }],  // custom dropdown
+                    [{ 'header': [1, 2, 3, false] }],
+                    ['bold', 'italic', 'underline', 'strike', 'blockquote'],        // toggled buttons
+                    //  [{ 'header': 1 }, { 'header': 2 }],               // custom button values
+                    [{ 'list': 'ordered' }, { 'list': 'bullet' }],
+                    //  [{ 'script': 'sub' }, { 'script': 'super' }],      // superscript/subscript
+                    [{ 'indent': '-1' }, { 'indent': '+1' }],          // outdent/indent
+                    //  [{ 'direction': 'rtl' }],                         // text direction
+                    [{ 'color': [] }, { 'background': [] }],          // dropdown with defaults from theme
+                    //  [{ 'font': [] }],
+                    [{ 'align': [] }],
+                    ['link', 'image','video'],
+                    ['clean'],
+                    ['audio'],
+                ],
+                handlers: { 'image': fileSelect ,'video': fileSelectVideo,'audio':fileSelectAudio},
+                _this:this
+            },
+        };
+        const formats = [
+            'size', 'header',
+            'bold', 'italic', 'underline', 'strike', 'blockquote',
+            'list', 'bullet', 'indent',
+            'color', 'background',
+            'align',
+            'link', 'image','video','AppPanelEmbed','clean'
+        ];
+        return (
+            <div>
+                <ReactQuill
+                    theme="snow"
+                    value={this.state.value}
+                    modules={modules}
+                    formats={formats}
+                    placeholder='请填写内容!'
+                    onChange={this.handleRichText}
+                />
+                <input accept="image/*" type="file" name={this.props.id + "fileToUpload"} id={this.props.id + "fileToUpload"} placeholder='请填写内容!' style={{ "display": "none" }} />
+                <input accept="video/*" type="file" name={this.props.id + "fileToUploadVideo"} id={this.props.id + "fileToUploadVideo"} placeholder='请填写视频!' style={{ "display": "none" }} />
+                <input accept="audio/*" type="file" name={this.props.id + "fileToUploadAudio"} id={this.props.id + "fileToUploadAudio"} placeholder='请选择音频!' style={{ "display": "none" }} />
+            </div>
+        )
+    },
+});
+
+export default Editors;

+ 273 - 0
js/component/sign/richTextEditor.jsx

@@ -0,0 +1,273 @@
+import React from 'react';
+import theme from 'react-quill/dist/quill.snow.css';
+import { message } from 'antd';
+import ReactQuill,{Quill} from 'react-quill';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import audioIcon from '../../image/audio.png';
+
+
+let BlockEmbed = Quill.import('blots/block/embed');
+class AppPanelEmbed extends BlockEmbed {
+    static create(value) {
+        const node = super.create(value);
+        node.setAttribute('contenteditable', 'false');
+        node.setAttribute('width', '100%');
+        //   设置自定义html
+        node.innerHTML = this.transformValue(value)
+        return node;
+    }
+
+    static transformValue(value) {
+        let handleArr = value.split('\n')
+        handleArr = handleArr.map(e => e.replace(/^[\s]+/, '')
+            .replace(/[\s]+$/, ''))
+        return handleArr.join('')
+    }
+
+    // 返回节点自身的value值 用于撤销操作
+    static value(node) {
+        return node.innerHTML
+    }
+}
+// blotName
+AppPanelEmbed.blotName = 'AppPanelEmbed';
+// class名将用于匹配blot名称
+AppPanelEmbed.className = 'embed-innerApp';
+// 标签类型自定义
+AppPanelEmbed.tagName = 'p';
+Quill.register(AppPanelEmbed);
+
+var RichTextUploadUrl, RichTextUploadSign;
+//上传图片
+function uploadImg(s,_this) {
+    let myform = new FormData()
+    let file = document.getElementById(_this.props.id + "fileToUpload").files[0];
+    if (!file) { return; };
+    if(file.size > 52428800){
+        message.warning('图片大小不能超过50M');
+        return
+    }
+    myform.append('file', file);
+    myform.append('sign', RichTextUploadSign);
+    $.ajax({
+        method: "post",
+        dataType: "json",
+        url: location.origin + RichTextUploadUrl,
+        data: myform,
+        contentType: false,
+        processData: false,
+        success: function (data) {
+            if (data.error && data.error.length) {
+                message.warning(data.error[0].message);
+                document.getElementById(_this.props.id + "fileToUpload").value = ''
+            } else {
+                const cursorPosition = s.quill.getSelection().index
+                s.quill.insertEmbed(
+                    cursorPosition,
+                    'AppPanelEmbed',
+                    `<img style="width: 100%" src="${globalConfig.avatarUploadHost + data.data}"/>`
+                );
+                s.quill.setSelection(cursorPosition + 1);
+                document.getElementById(_this.props.id + "fileToUpload").value = ''
+            };
+        },
+        error: function(XMLHttpRequest, textStatus, errorThrown){
+            //查看错误信息
+            message("上传失败");
+            document.getElementById(_this.props.id + "fileToUpload").value = ''
+        }
+    })
+}
+//图片文件选择
+function fileSelect() {
+    let _this = this.options._this;
+    let uploader = document.getElementById(_this.props.id + "fileToUpload");
+    if (!uploader.onchange) {
+        uploader.onchange = () => {
+            uploadImg(this,_this)
+        }
+    }
+    uploader.click();
+}
+//音频文件选择
+function fileSelectAudio() {
+    let _this = this.options._this;
+    let uploader = document.getElementById(_this.props.id + "fileToUploadAudio");
+    if (!uploader.onchange) {
+        uploader.onchange = () => {
+            uploadAudio(this,_this)
+        }
+    }
+    uploader.click();
+}
+//音频文件上传
+function uploadAudio(s,_this) {
+    let myform = new FormData()
+    let file = document.getElementById(_this.props.id + "fileToUploadAudio").files[0]
+    if (!file) { return; };
+    if(file.size > 52428800){
+        message.warning('音频大小不能超过50M');
+        return
+    }
+    myform.append('file', file);
+    myform.append('sign', RichTextUploadSign);
+    $.ajax({
+        method: "post",
+        dataType: "json",
+        url: location.origin + RichTextUploadUrl,
+        data: myform,
+        contentType: false,
+        processData: false,
+        success: function (data) {
+            if (data.error && data.error.length) {
+                message.warning(data.error[0].message);
+                document.getElementById(_this.props.id + "fileToUploadAudio").value = ''
+            } else {
+                const cursorPosition = s.quill.getSelection().index
+                s.quill.insertEmbed(
+                    cursorPosition,
+                    'AppPanelEmbed',
+                    `<audio src="${globalConfig.avatarUploadHost + data.data}" controls="controls">Your browser does not support the audio element.</audio>`
+                );
+                s.quill.setSelection(cursorPosition + 1)
+                document.getElementById(_this.props.id + "fileToUploadAudio").value = ''
+            };
+
+        },
+        error: function(XMLHttpRequest, textStatus, errorThrown){
+            document.getElementById(_this.props.id + "fileToUploadAudio").value = ''
+            //查看错误信息
+            message("上传失败");
+        }
+    })
+}
+//视频文件选择
+function fileSelectVideo() {
+    let _this = this.options._this;
+    let uploader = document.getElementById(_this.props.id + "fileToUploadVideo");
+    if (!uploader.onchange) {
+        uploader.onchange = () => {
+            uploadVideo(this,_this)
+        }
+    }
+    uploader.click();
+}
+//视频文件上传
+function uploadVideo(s,_this) {
+    let myform = new FormData()
+    let file = document.getElementById(_this.props.id + "fileToUploadVideo").files[0]
+    if (!file) { return; };
+    if(file.size > 52428800){
+        message.warning('视频大小不能超过50M');
+        return
+    }
+    myform.append('file', file);
+    myform.append('sign', RichTextUploadSign);
+    $.ajax({
+        method: "post",
+        dataType: "json",
+        url: location.origin + RichTextUploadUrl,
+        data: myform,
+        contentType: false,
+        processData: false,
+        success: function (data) {
+            if (data.error && data.error.length) {
+                message.warning(data.error[0].message);
+                document.getElementById(_this.props.id + "fileToUploadVideo").value = ''
+            } else {
+                const cursorPosition = s.quill.getSelection().index
+                s.quill.insertEmbed(
+                    cursorPosition,
+                    'AppPanelEmbed',
+                    `<video style="width:100%" controls="" autoPlay="" name="media">
+                            <source src=${globalConfig.avatarUploadHost + data.data} type="video/mp4">
+                    </video>`
+                );
+                s.quill.setSelection(cursorPosition + 1);
+                document.getElementById(_this.props.id + "fileToUploadVideo").value = ''
+            };
+
+        },
+        error: function(XMLHttpRequest, textStatus, errorThrown){
+            document.getElementById(_this.props.id + "fileToUploadVideo").value = ''
+            //查看错误信息
+        }
+    })
+}
+
+const Editors = React.createClass({
+    getInitialState() {
+        return {
+            value: null,
+            theBool: true
+        }
+    },
+    handleRichText(value) {
+        this.setState({ value: value });
+        this.props.handleRichText(value);
+        // this.props.handleRichText(value.replace(/iframe/g, 'video'));
+    },
+    componentDidMount() {
+        document.getElementsByClassName( 'ql-audio')[this.props.id || 0].style = `background: url(${audioIcon}) no-repeat;background-size: contain;`
+    },
+    componentWillMount() {
+        RichTextUploadUrl = this.props.uploadUrl;
+        RichTextUploadSign = this.props.uploadSign;
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.theBool = true;
+        // if(nextProps.textContent){
+        this.state.value = nextProps.textContent || '';
+        // }
+    },
+    render() {
+        const modules = {
+            toolbar: {
+                container: [
+                    [{ 'size': ['small', false, 'large', 'huge'] }],  // custom dropdown
+                    [{ 'header': [1, 2, 3, false] }],
+                    ['bold', 'italic', 'underline', 'strike', 'blockquote'],        // toggled buttons
+                    //  [{ 'header': 1 }, { 'header': 2 }],               // custom button values
+                    [{ 'list': 'ordered' }, { 'list': 'bullet' }],
+                    //  [{ 'script': 'sub' }, { 'script': 'super' }],      // superscript/subscript
+                    [{ 'indent': '-1' }, { 'indent': '+1' }],          // outdent/indent
+                    //  [{ 'direction': 'rtl' }],                         // text direction
+                    [{ 'color': [] }, { 'background': [] }],          // dropdown with defaults from theme
+                    //  [{ 'font': [] }],
+                    [{ 'align': [] }],
+                    ['link', 'image','video'],
+                    ['clean'],
+                    ['audio'],
+                ],
+                handlers: { 'image': fileSelect ,'video': fileSelectVideo,'audio':fileSelectAudio},
+                _this:this
+            },
+        };
+        const formats = [
+            'size', 'header',
+            'bold', 'italic', 'underline', 'strike', 'blockquote',
+            'list', 'bullet', 'indent',
+            'color', 'background',
+            'align',
+            'link', 'image','video','AppPanelEmbed','clean'
+        ];
+        return (
+            <div>
+                <ReactQuill
+                    theme="snow"
+                    value={this.state.value}
+                    modules={modules}
+                    formats={formats}
+                    placeholder='请填写内容!'
+                    onChange={this.handleRichText}
+                />
+                <input accept="image/*" type="file" name={this.props.id + "fileToUpload"} id={this.props.id + "fileToUpload"} placeholder='请填写内容!' style={{ "display": "none" }} />
+                <input accept="video/*" type="file" name={this.props.id + "fileToUploadVideo"} id={this.props.id + "fileToUploadVideo"} placeholder='请填写视频!' style={{ "display": "none" }} />
+                <input accept="audio/*" type="file" name={this.props.id + "fileToUploadAudio"} id={this.props.id + "fileToUploadAudio"} placeholder='请选择音频!' style={{ "display": "none" }} />
+            </div>
+        )
+    },
+});
+
+export default Editors;

+ 3 - 0
js/component/tools.js

@@ -1712,4 +1712,7 @@ module.exports = {
             return theType;
         }
     },
+    getPicPath: function(path, e) {
+        return path + e;
+    }
 }

+ 4 - 4
package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "afanti",
-  "version": "1.2.8",
+  "version": "1.2.9",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "afanti",
-      "version": "1.2.8",
+      "version": "1.2.9",
       "license": "ISC",
       "dependencies": {
         "antd": "^2.7.4",
@@ -10207,7 +10207,6 @@
       "version": "1.0.2",
       "resolved": "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz",
       "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
-      "dev": true,
       "optional": true
     },
     "node_modules/union-value": {
@@ -11637,6 +11636,7 @@
     },
     "adler32cs": {
       "version": "git+ssh://git@github.com/chick307/adler32cs.js.git#c6576b4ed91b4216973bf85d8478a49970934515",
+      "integrity": "sha512-8skamgdKwWZhLsJ0QlNte2abP/X6qgBPkv9fQI9llZ1Qr7di4nAuQ1AgfZiXUARD1VJDZFeoiDXuogjX55ECVw==",
       "from": "adler32cs@github:chick307/adler32cs.js"
     },
     "ajv": {
@@ -14697,6 +14697,7 @@
     },
     "filesaver.js": {
       "version": "git+ssh://git@github.com/andyinabox/FileSaver.js.git#973b433b8fbaee9a11d53b9ae423b046742cfe32",
+      "integrity": "sha512-3l/IXqFf/pd0bwPDX9N3XPxktChGODBkxLJq9tWVP9uD3v96V+6lKOra8L8maOPVxvtlBJrirlfD9btIX2egbg==",
       "from": "filesaver.js@github:andyinabox/FileSaver.js"
     },
     "fill-range": {
@@ -20404,7 +20405,6 @@
       "version": "1.0.2",
       "resolved": "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz",
       "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
-      "dev": true,
       "optional": true
     },
     "union-value": {

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "afanti",
-  "version": "1.2.8",
+  "version": "1.2.9",
   "description": "",
   "main": "index.js",
   "scripts": {

+ 2 - 2
webpack.config.js

@@ -121,7 +121,7 @@ module.exports = (function () {
         }));
     }
 
-    let staticHost = 'http://172.16.0.255:80';
+    let staticHost = 'http://172.16.1.187:80';
     switch (argv.env.deploy) {
         case 'test':
             staticHost = 'http://statics.jishutao.com';
@@ -156,7 +156,7 @@ module.exports = (function () {
         plugins: plugins,
         devServer: {
             disableHostCheck: true,
-            host: '172.16.0.255',
+            host: '172.16.1.187',
             port: 80,
             allowedHosts: ['127.0.0.1','192.168.0.20','192.168.0.99','192.168.0.17'],
             headers: {

+ 2 - 0
yarn.lock

@@ -35,6 +35,7 @@
     "object-assign" "4.x"
 
 "adler32cs@github:chick307/adler32cs.js":
+  "integrity" "sha512-8skamgdKwWZhLsJ0QlNte2abP/X6qgBPkv9fQI9llZ1Qr7di4nAuQ1AgfZiXUARD1VJDZFeoiDXuogjX55ECVw=="
   "resolved" "git+ssh://git@github.com/chick307/adler32cs.js.git#c6576b4ed91b4216973bf85d8478a49970934515"
   "version" "0.0.1"
 
@@ -2586,6 +2587,7 @@
   "version" "2.0.1"
 
 "filesaver.js@github:andyinabox/FileSaver.js":
+  "integrity" "sha512-3l/IXqFf/pd0bwPDX9N3XPxktChGODBkxLJq9tWVP9uD3v96V+6lKOra8L8maOPVxvtlBJrirlfD9btIX2egbg=="
   "resolved" "git+ssh://git@github.com/andyinabox/FileSaver.js.git#973b433b8fbaee9a11d53b9ae423b046742cfe32"
   "version" "1.0.0"