king
2024-08-06 70f30488f31c2adb1cfb3cb2452ea27c85167019
2024-08-06
9个文件已修改
381 ■■■■ 已修改文件
public/README.txt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/options.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.js 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/editor/index.jsx 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/index.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/module/voucher/resetAttach/addAttach/fileupload/index.jsx 87 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/normalbutton/index.jsx 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/fileupload/index.jsx 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/verifycard/baseform/index.jsx 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/README.txt
@@ -14,7 +14,6 @@
WXMerchID         -- 使用微信支付时,绑定的商户ID
WXNotice          -- 是否开启明科云公众号消息提醒,值为 true 时开启,可通过明科云发送模板消息
WXApps            -- 存在多个公众号、小程序或商户时可使用微信APP列表,注意填写默认公众号、小程序与商户号,格式 [{"appId": "", "appName": "", "appType": "public/miniProgram/merchant"}]
nginx             -- 是否开启了nginx服务,值为 true 时开启,如需使用微信模板消息等服务,请先设置nginx服务并开启此配置
debugger          -- 值为 true 时开启调试模式,开启后移动端子应用中会有控制台
devTools          -- 值为 false 时不允许使用调试模式
licenseKey        -- 许可密钥,在内部网络中使用系统时,会跳过epc验证
public/options.json
@@ -12,7 +12,6 @@
  "WXminiAppID": "",
  "WXMerchID": "",
  "WXNotice": "true",
  "nginx": "true",
  "debugger": false,
  "devTools": true,
  "licenseKey": "",
src/api/index.js
@@ -100,15 +100,15 @@
  /**
   * @description 微信业务请求 原接口 'wxpay/getaccesstoken'
   */
  wxAccessToken (appId, domain = '') {
    let _url = domain || window.GLOB.baseurl
  // wxAccessToken (appId, domain = '') {
  //   let _url = domain || window.GLOB.baseurl
    return axios({
      url: _url + 'wechat/getaccesstoken',
      method: 'post',
      data: JSON.stringify({app_id: appId})
    })
  }
  //   return axios({
  //     url: _url + 'wechat/getaccesstoken',
  //     method: 'post',
  //     data: JSON.stringify({app_id: appId})
  //   })
  // }
  /**
   * @description 微信业务请求
@@ -999,26 +999,37 @@
  /**
   * @description 大文件上传
   */
  getLargeFileUpload (param) {
    return axios({
  getFileUpload (param) {
    param.append('shardingCnt', 1)
    param.append('LoginUID', sessionStorage.getItem('LoginUID') || '')
    param.append('UserID', sessionStorage.getItem('UserID') || '')
    return new Promise((resolve, reject) => {
      axios({
      url: '/webapi/doupload',
      method: 'post',
      headers: { 'Content-Type': 'multipart/form-data' },
      data: param
      }).then(res => {
        if (res.status && res.urlPath) {
          res.urlPath = window.GLOB.baseurl + res.urlPath
        }
        resolve(res)
      })
    })
  }
  /**
   * @description 查询文件是否已上传
   */
  getFilePreUpload (param) {
    return axios({
      url: '/webapi/dopreload',
      method: 'post',
      headers: { 'Content-Type': 'multipart/form-data' },
      data: param
    })
  }
  // getFilePreUpload (param) {
  //   return axios({
  //     url: '/webapi/dopreload',
  //     method: 'post',
  //     headers: { 'Content-Type': 'multipart/form-data' },
  //     data: param
  //   })
  // }
  /**
   * @description oss文件上传
src/components/editor/index.jsx
@@ -5,8 +5,6 @@
import 'braft-editor/dist/index.css'
import 'braft-extensions/dist/table.css'
import Table from 'braft-extensions/dist/table'
import SparkMD5 from 'spark-md5'
import moment from 'moment'
import Api from '@/api'
import './index.scss'
@@ -73,28 +71,13 @@
    }
  }
  shardupload = (params, param) => {
    let _param = params.chunks.shift()
  handleUpload(param) {
    let form = new FormData()
    form.append('file', _param.binary)
    form.append('fileMd5', params.file.fileMd5)
    form.append('shardingMd5', _param.chunkMd5)
    form.append('baseDomain', window.GLOB.baseurl)
    form.append('rootPath', 'Content/images/upload/')
    form.append('fileName', params.file.fileName)
    form.append('fileExt', params.file.fileType)
    form.append('shardingCnt', _param.chunks)
    form.append('shardingNo', _param.chunk)
    form.append('LoginUID', sessionStorage.getItem('LoginUID') || '')
    form.append('UserID', sessionStorage.getItem('UserID') || '')
    form.append('file', param.file)
    Api.getLargeFileUpload(form).then(res => {
    Api.getFileUpload(form).then(res => {
      if (res.status) {
        if (params.chunks.length > 0) {
          param.progress(Math.floor(100 * (_param.chunk / _param.chunks)))
          this.shardupload(params, param)
        } else {
          if (res.urlPath) {
            param.success({
              url: res.urlPath
@@ -104,113 +87,12 @@
              url: '上传失败!'
            })
          }
        }
      } else {
        param.error({
          url: '上传失败!'
        })
      }
    })
  }
  getuuid = () => {
    let uuid = []
    let _options = '0123456789abcdefghigklmnopqrstuv'
    for (let i = 0; i < 19; i++) {
      uuid.push(_options.substr(Math.floor(Math.random() * 0x20), 1))
    }
    uuid = uuid.join('')
    return uuid
  }
  handleUpload(param) {
    const file = param.file
    let blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice
    let chunkSize = 1024 * 1024 * 2                // 切片每次2M
    let chunks = Math.ceil(file.size / chunkSize)  // 切片总数
    let currentChunk = 0                           // 当前上传的chunk
    let spark = new SparkMD5.ArrayBuffer()         // 对arrayBuffer数据进行md5加密,产生一个md5字符串
    let chunkFileReader = new FileReader()         // 用于计算出每个chunkMd5
    let totalFileReader = new FileReader()         // 用于计算出总文件的fileMd5
    let params = {chunks: [], file: {}}            // 用于上传所有分片的md5信息
    params.file.fileName = file.name.replace(/\.{1}[^.]*$/ig, '')  // 文件名(去除后缀名)
    params.file.fileType = file.name.replace(/^.*\.{1}/ig, '')     // 文件类型
    params.file.fileSize = file.size                               // 文件大小
    params.file.fileChunks = chunks                                // 记录所有chunks的长度
    if (!/^[A-Za-z0-9]+$/.test(params.file.fileName)) {            // 文件名称含有英文及数字之外字符时,名称系统生成
      params.file.fileName = moment().format('YYYYMMDDHHmmss') + this.getuuid()
    }
    totalFileReader.readAsArrayBuffer(file)
    totalFileReader.onload = (e) => {   // 对整个totalFile生成md5
      spark.append(e.target.result)
      params.file.fileMd5 = spark.end() // 计算整个文件的fileMd5
      let _param = new FormData()
      _param.append('fileMd5', params.file.fileMd5)
      Api.getFilePreUpload(_param).then(res => {
        if (res.status && res.urlPath) {
          param.success({
            url: res.urlPath
          })
        } else if (res.shardings && res.shardings.length > 0) {
          res.shardings.forEach(shard => {
            if (shard.shardingNo && parseInt(shard.shardingNo) > currentChunk) {
              currentChunk = parseInt(shard.shardingNo)
            }
          })
          loadNext()
        } else {
          loadNext()
        }
      })
    }
    chunkFileReader.onload = (e) => {
      spark.append(e.target.result)      // 对每一片分片进行md5加密
      params.chunks[params.chunks.length - 1].chunkMd5 = spark.end() // 添加切片md5
      currentChunk++  // 每一次分片onload,currentChunk都需要增加,以便来计算分片的次数
      if (currentChunk < chunks) { // 当前切片总数没有达到总数时
        loadNext()
      } else {
        this.shardupload(params, param)
      }
    }
    chunkFileReader.onerror = () => {
      param.error({
        url: '上传失败!'
      })
      console.warn('File reading failed.')
    }
    totalFileReader.onerror = () => {
      param.error({
        url: '上传失败!'
      })
    }
    let loadNext = () => {
      let start = currentChunk * chunkSize              // 计算分片的起始位置
      let end = Math.min(file.size, start + chunkSize)  // 计算分片的结束位置
      let obj = {                                       // 每一个分片需要包含的信息
        chunk: currentChunk + 1,
        binary: file.slice(start, end),
        start: start,
        end: end,
        chunks
      }
      params.chunks.push(obj)
      chunkFileReader.readAsArrayBuffer(blobSlice.call(file, start, end))
    }
  }
  render() {
src/index.js
@@ -45,7 +45,6 @@
    GLOB.watermark = config.watermark + '' !== 'false'
    GLOB.transfer = config.transfer + '' === 'true'
    GLOB.keepKey = config.keepPassword + '' !== 'false'
    GLOB.nginx = config.nginx + '' === 'true'
    GLOB.WXAppID = config.WXAppID || ''
    GLOB.WXminiAppID = config.WXminiAppID || ''
    GLOB.WXMerchID = config.WXMerchID || ''
src/tabviews/custom/components/module/voucher/resetAttach/addAttach/fileupload/index.jsx
@@ -1,10 +1,9 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import moment from 'moment'
import { Upload, Button, Progress, notification } from 'antd'
import { UploadOutlined } from '@ant-design/icons'
import SparkMD5 from 'spark-md5'
import Api from '@/api'
import './index.scss'
@@ -90,54 +89,6 @@
    })
  }
  shardupload = (param, name) => {
    let form = new FormData()
    form.append('file', param.binary)
    form.append('fileMd5', param.fileMd5)
    form.append('shardingMd5', param.fileMd5)
    form.append('baseDomain', window.GLOB.baseurl)
    form.append('rootPath', 'Content/images/upload/')
    form.append('fileName', param.fileName)
    form.append('fileExt', param.fileType)
    form.append('shardingCnt', 1)
    form.append('shardingNo', 1)
    form.append('LoginUID', sessionStorage.getItem('LoginUID') || '')
    form.append('UserID', sessionStorage.getItem('UserID') || '')
    Api.getLargeFileUpload(form).then(res => {
      if (res.status) {
        if (res.urlPath) {
          this.onUpdate(res.urlPath, name)
        } else {
          this.onFail()
        }
        this.setState({
          percent: 100
        }, () => {
          setTimeout(() => {
            this.setState({
              showprogress: false,
              percent: 0
            })
          }, 200)
        })
      } else {
        this.onFail(res.message)
      }
    })
  }
  getuuid = () => {
    let uuid = []
    let _options = '0123456789abcdefghigklmnopqrstuv'
    for (let i = 0; i < 19; i++) {
      uuid.push(_options.substr(Math.floor(Math.random() * 0x20), 1))
    }
    uuid = uuid.join('')
    return uuid
  }
  beforeUpload = (file) => {
    const { accepts, maxSize } = this.state
@@ -172,30 +123,17 @@
      percent: 0
    })
    // 兼容性的处理
    let spark = new SparkMD5.ArrayBuffer()         // 对arrayBuffer数据进行md5加密,产生一个md5字符串
    let totalFileReader = new FileReader()         // 用于计算出总文件的fileMd5
    let param = {}
    let form = new FormData()
    param.fileName = file.name.replace(/\.{1}[^.]*$/ig, '')  // 文件名(去除后缀名)
    param.fileType = file.name.replace(/^.*\.{1}/ig, '')     // 文件类型
    form.append('file', file)
    if (!/^[A-Za-z0-9]+$/.test(param.fileName)) {            // 文件名称含有英文及数字之外字符时,名称系统生成
      param.fileName = moment().format('YYYYMMDDHHmmss') + this.getuuid()
    }
    totalFileReader.readAsArrayBuffer(file)
    totalFileReader.onload = (e) => {   // 对整个totalFile生成md5
      spark.append(e.target.result)
      param.fileMd5 = spark.end()       // 计算整个文件的fileMd5
      param.binary = file
      let _param = new FormData()
      _param.append('fileMd5', param.fileMd5)
      Api.getFilePreUpload(_param).then(res => {
        if (res.status && res.urlPath) {
    Api.getFileUpload(form).then(res => {
      if (res.status) {
        if (res.urlPath) {
          this.onUpdate(res.urlPath, file.name)
        } else {
          this.onFail()
        }
          this.setState({
            percent: 100
          }, () => {
@@ -207,14 +145,9 @@
            }, 200)
          })
        } else {
          this.shardupload(param, file.name)
        this.onFail(res.message)
        }
      })
    }
    totalFileReader.onerror = () => {
      this.onFail('文件读取失败!')
    }
    return false
  }
src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -2556,7 +2556,7 @@
  }
  sendWxMessage = (verify, id) => {
    let domain = ''
    let domain = window.GLOB.baseurl
    let appId = window.GLOB.WXAppID || ''
    if (verify.wxAppId && verify.wxAppId !== appId) {
@@ -2576,14 +2576,7 @@
      appId = 'wx4d8a34c8d4494872'
    }
    if (!window.GLOB.nginx && !domain) {
      notification.warning({
        top: 92,
        message: 'nginx服务尚未开启,不可发送模板消息。',
        duration: 5
      })
      return
    } else if (!appId) {
    if (!appId) {
      notification.warning({
        top: 92,
        message: '尚未添加公众号ID,不可发送模板消息。',
@@ -2663,11 +2656,13 @@
        return m
      })
      Api.wxAccessToken(appId, domain).then(res => {
        if (!res.access_token) return
      // cgi-bin/message/template/send
        params.forEach(n => {
          Api.wxNginxRequest(`${domain}cgi-bin/message/template/send?access_token=${res.access_token}`, 'post', JSON.stringify(n)).then(re => {
        Api.directRequest({
          url: domain + 'wechat/send?appid=' + appId,
          method: 'post',
          data: JSON.stringify(n)
        }).then(re => {
            if (verify.wxNoteCallback === 'true') {
              let msg = re.errmsg || ''
@@ -2718,7 +2713,6 @@
                duration: 5
              })
            }
          })
        })
      })
    })
src/tabviews/zshare/fileupload/index.jsx
@@ -1,10 +1,8 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import moment from 'moment'
import { Upload, Button, Progress, notification } from 'antd'
import { UploadOutlined } from '@ant-design/icons'
import SparkMD5 from 'spark-md5'
import Api from '@/api'
import MKEmitter from '@/utils/events.js'
@@ -195,44 +193,6 @@
    })
  }
  shardupload = (param, file_name) => {
    let form = new FormData()
    form.append('file', param.binary)
    form.append('fileMd5', param.fileMd5)
    form.append('shardingMd5', param.fileMd5)
    form.append('baseDomain', window.GLOB.baseurl)
    form.append('rootPath', 'Content/images/upload/')
    form.append('fileName', param.fileName)
    form.append('fileExt', param.fileType)
    form.append('shardingCnt', 1)
    form.append('shardingNo', 1)
    form.append('LoginUID', sessionStorage.getItem('LoginUID') || '')
    form.append('UserID', sessionStorage.getItem('UserID') || '')
    Api.getLargeFileUpload(form).then(res => {
      if (res.status) {
        if (res.urlPath) {
          this.onUpdate(res.urlPath, file_name)
        } else {
          this.onFail()
        }
        this.setState({
          percent: 100
        }, () => {
          setTimeout(() => {
            this.setState({
              showprogress: false,
              percent: 0
            })
          }, 200)
        })
      } else {
        this.onFail(res.message)
      }
    })
  }
  getuuid = () => {
    let uuid = []
    let _options = '0123456789abcdefghigklmnopqrstuv'
@@ -406,30 +366,17 @@
      return false
    }
    // 兼容性的处理
    let spark = new SparkMD5.ArrayBuffer()         // 对arrayBuffer数据进行md5加密,产生一个md5字符串
    let totalFileReader = new FileReader()         // 用于计算出总文件的fileMd5
    let param = {}
    let form = new FormData()
    param.fileName = file.name.replace(/\.{1}[^.]*$/ig, '')  // 文件名(去除后缀名)
    param.fileType = file.name.replace(/^.*\.{1}/ig, '')     // 文件类型
    form.append('file', file)
    if (!/^[A-Za-z0-9]+$/.test(param.fileName)) {            // 文件名称含有英文及数字之外字符时,名称系统生成
      param.fileName = moment().format('YYYYMMDDHHmmss') + this.getuuid()
    }
    totalFileReader.readAsArrayBuffer(file)
    totalFileReader.onload = (e) => {   // 对整个totalFile生成md5
      spark.append(e.target.result)
      param.fileMd5 = spark.end()       // 计算整个文件的fileMd5
      param.binary = file
      let _param = new FormData()
      _param.append('fileMd5', param.fileMd5)
      Api.getFilePreUpload(_param).then(res => {
        if (res.status && res.urlPath) {
    Api.getFileUpload(form).then(res => {
      if (res.status) {
        if (res.urlPath) {
          this.onUpdate(res.urlPath, file_name)
        } else {
          this.onFail()
        }
          this.setState({
            percent: 100
          }, () => {
@@ -441,14 +388,9 @@
            }, 200)
          })
        } else {
          this.shardupload(param, file_name)
        this.onFail(res.message)
        }
      })
    }
    totalFileReader.onerror = () => {
      this.onFail('文件读取失败!')
    }
    return false
  }
src/templates/zshare/verifycard/baseform/index.jsx
@@ -47,7 +47,7 @@
    let wxTemps = sessionStorage.getItem('wxTemplates' + appId)
    if (appId && window.GLOB.nginx && !wxTemps) {
    if (appId && !wxTemps) {
      if (verify.wxNote === 'true') {
        this.getTemps(appId)
      }
@@ -61,9 +61,11 @@
  }
  getTemps = (appId) => {
    Api.wxAccessToken(appId).then(res => {
      if (res.status && res.access_token) {
        Api.wxNginxRequest(`cgi-bin/template/get_all_private_template?access_token=${res.access_token}`, 'get').then(res => {
    // cgi-bin/template/get_all_private_template
    Api.directRequest({
      url: window.GLOB.baseurl + 'wechat/get_all_private_template?appid=' + appId,
      method: 'get',
    }).then(res => {
          let temps = []
          if (res.template_list) {
            temps = res.template_list.filter(item => {
@@ -81,11 +83,6 @@
          sessionStorage.setItem('wxTemplates' + appId, JSON.stringify(temps))
          this.resetTemps(temps)
        })
      } else {
        message.warning(res.message || '微信授权失败!')
        sessionStorage.setItem('wxTemplates' + appId, JSON.stringify([]))
      }
    })
  }
@@ -206,7 +203,7 @@
    this.props.onChange(_verify)
    if (key === 'wxNote' && value === 'true' && window.GLOB.WXAppID && window.GLOB.nginx) {
    if (key === 'wxNote' && value === 'true' && window.GLOB.WXAppID) {
      let wxTemps = sessionStorage.getItem('wxTemplates' + window.GLOB.WXAppID)
      if (wxTemps) {
@@ -308,11 +305,6 @@
    setTimeout(() => {
      this.props.onChange(_verify_)
      if (!window.GLOB.nginx) {
        message.warning('nginx服务尚未开启,请检查配置文件并在服务器中完成nginx设置。')
        return
      }
      let wxTemps = sessionStorage.getItem('wxTemplates' + val)