ipFileHooks.js 3.78 KB
import { ref } from 'vue'

export default function ipFileHooks() {
  const serverIP = ref('https://store.keliuyun.com') // 默认值
  const platType = ref('saas') // 默认平台

  // 获取配置文件目录路径
  const getConfigDir = () => '_doc'  // 注意这里返回的是路径字符串,不再转换URL

  // 获取配置文件完整路径
  const getConfigFilePath = () => `${getConfigDir()}/serverConfig.json`

  // 检查配置文件是否存在
  const checkConfigFile = () => {
    return new Promise((resolve) => {
      const filePath = getConfigFilePath()
      plus.io.resolveLocalFileSystemURL(
        filePath,
        () => resolve(true),
        () => resolve(false)
      )
    })
  }

  // 读取配置文件内容
  const readConfigFile = () => {
    return new Promise((resolve, reject) => {
      const filePath = getConfigFilePath()
      plus.io.resolveLocalFileSystemURL(
        filePath,
        (entry) => {
          entry.file((file) => {
            const reader = new plus.io.FileReader()
            reader.onloadend = (e) => {
              try {
                const config = JSON.parse(e.target.result)
                resolve(config)
              } catch (e) {
                reject('配置文件解析失败')
              }
            }
            reader.onerror = () => reject('文件读取失败')
            reader.readAsText(file)
          }, reject)
        },
        reject
      )
    })
  }

  // 写入配置文件,确保目录和文件都存在
  const writeConfigFile = (ip, platType, callback = () => {}) => {
    return new Promise((resolve, reject) => {
      const config = { baseUrl: ip, platType }
      const content = JSON.stringify(config)
      uni.setStorageSync('serverIp', ip)
      uni.setStorageSync('platType', platType)

      const dirPath = getConfigDir()
      const fileName = 'serverConfig.json'

      // 确保目录存在
      plus.io.resolveLocalFileSystemURL(
        dirPath,
        (rootDirEntry) => {
          rootDirEntry.getFile(
            fileName,
            { create: true },
            (fileEntry) => {
              fileEntry.createWriter(
                (writer) => {
                  writer.onwrite = () => {
                    callback()
                    resolve()
                  }
                  writer.onerror = (err) => reject(err)
                  writer.write(content)
                },
                (err) => reject(err)
              )
            },
            (err) => reject(err)
          )
        },
        (err) => {
          console.error('配置目录访问失败:', err)
          reject(err)
        }
      )
    })
  }

  // 初始化服务器配置
  const initServerConfig = async () => {
    try {
      const fileExists = await checkConfigFile()

      if (!fileExists) {
        uni.showLoading({
          title: '正在初始化服务器配置',
          mask: true
        })
        await writeConfigFile(serverIP.value, platType.value, () => {
          uni.hideLoading()
        })

      } else {
        const config = await readConfigFile()
        if (config) {
          serverIP.value = config.baseUrl
          platType.value = config.platType
          uni.setStorageSync('serverIp', config.baseUrl)
          uni.setStorageSync('platType', config.platType)
        }
      }
    } catch (error) {
      console.error('初始化服务器配置失败:', error)

    }
  }

  const validateIP = (ip) => {
    const pattern =
      /^(https?|ftp|ws|wss):\/\/(([a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+)|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(:[1-9][0-9]{0,4})?(\/.*)?$/;
    return pattern.test(ip)
  }

  return {
    serverIP,
    platType,
    validateIP,
    writeConfigFile,
    initServerConfig,
    checkConfigFile
  }
}