baigl #180
|
@ -7,6 +7,8 @@ VITE_APP_ENV = 'development'
|
||||||
# AIx融合数字管理系统/开发环境
|
# AIx融合数字管理系统/开发环境
|
||||||
VITE_APP_BASE_API = '/dev-api'
|
VITE_APP_BASE_API = '/dev-api'
|
||||||
|
|
||||||
|
VITE_APP_DOMAIN = 'file.ysaix.com'
|
||||||
|
|
||||||
VITE_APP_UPLOAD_API = 'http://192.168.2.52:7863'
|
VITE_APP_UPLOAD_API = 'http://192.168.2.52:7863'
|
||||||
|
|
||||||
VITE_APP_RES_FILE_PATH = 'https://file.ysaix.com:7868/src/assets/textbook/booktxt/'
|
VITE_APP_RES_FILE_PATH = 'https://file.ysaix.com:7868/src/assets/textbook/booktxt/'
|
||||||
|
|
|
@ -5,13 +5,15 @@ VITE_APP_TITLE = AIx数字平台
|
||||||
VITE_APP_ENV = 'production'
|
VITE_APP_ENV = 'production'
|
||||||
|
|
||||||
# AIx融合数字管理系统/生产环境
|
# AIx融合数字管理系统/生产环境
|
||||||
VITE_APP_BASE_API = 'https://file.ysaix.com:7868/prod-api'
|
VITE_APP_BASE_API = 'https://prev.ysaix.com:7868/prod-api'
|
||||||
|
|
||||||
VITE_APP_UPLOAD_API = 'https://file.ysaix.com:7868/prod-api'
|
VITE_APP_DOMAIN = 'prev.ysaix.com'
|
||||||
|
|
||||||
|
VITE_APP_UPLOAD_API = 'https://prev.ysaix.com:7868/prod-api'
|
||||||
|
|
||||||
# 是否在打包时开启压缩,支持 gzip 和 brotli
|
# 是否在打包时开启压缩,支持 gzip 和 brotli
|
||||||
VITE_BUILD_COMPRESS = gzip
|
VITE_BUILD_COMPRESS = gzip
|
||||||
|
|
||||||
VITE_APP_RES_FILE_PATH = 'https://file.ysaix.com:7868/src/assets/textbook/booktxt/'
|
VITE_APP_RES_FILE_PATH = 'https://prev.ysaix.com:7868/src/assets/textbook/booktxt/'
|
||||||
|
|
||||||
VITE_APP_BUILD_BASE_PATH = 'https://file.ysaix.com:7868/'
|
VITE_APP_BUILD_BASE_PATH = 'https://prev.ysaix.com:7868/'
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
# 页面标题
|
||||||
|
VITE_APP_TITLE = AIx数字平台
|
||||||
|
|
||||||
|
# 生产环境配置
|
||||||
|
VITE_APP_ENV = 'production'
|
||||||
|
|
||||||
|
# AIx融合数字管理系统/生产环境
|
||||||
|
VITE_APP_BASE_API = 'https://file.ysaix.com:7868/prod-api'
|
||||||
|
|
||||||
|
VITE_APP_DOMAIN = 'file.ysaix.com'
|
||||||
|
|
||||||
|
VITE_APP_UPLOAD_API = 'https://file.ysaix.com:7868/prod-api'
|
||||||
|
|
||||||
|
# 是否在打包时开启压缩,支持 gzip 和 brotli
|
||||||
|
VITE_BUILD_COMPRESS = gzip
|
||||||
|
|
||||||
|
VITE_APP_RES_FILE_PATH = 'https://file.ysaix.com:7868/src/assets/textbook/booktxt/'
|
||||||
|
|
||||||
|
VITE_APP_BUILD_BASE_PATH = 'https://file.ysaix.com:7868/'
|
|
@ -1,3 +1,3 @@
|
||||||
provider: generic
|
provider: generic
|
||||||
url: https://example.com/auto-updates
|
url: http://localhost:3000/
|
||||||
updaterCacheDirName: electron-app-updater
|
updaterCacheDirName: electron-app-updater
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
appId: com.electron.app
|
||||||
|
productName: AIx
|
||||||
|
directories:
|
||||||
|
buildResources: build
|
||||||
|
files:
|
||||||
|
- '!**/.vscode/*'
|
||||||
|
- '!src/*'
|
||||||
|
- '!electron.vite.config.{js,ts,mjs,cjs}'
|
||||||
|
- '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}'
|
||||||
|
- '!{.env,.env.*,.npmrc,pnpm-lock.yaml}'
|
||||||
|
asarUnpack:
|
||||||
|
- resources/**
|
||||||
|
win:
|
||||||
|
executableName: AIx
|
||||||
|
icon: resources/logo2.ico
|
||||||
|
nsis:
|
||||||
|
oneClick: false
|
||||||
|
allowToChangeInstallationDirectory: true
|
||||||
|
artifactName: ${name}-${version}-setup.${ext}
|
||||||
|
shortcutName: ${productName}
|
||||||
|
uninstallDisplayName: ${productName}
|
||||||
|
createDesktopShortcut: always
|
||||||
|
mac:
|
||||||
|
entitlementsInherit: build/entitlements.mac.plist
|
||||||
|
extendInfo:
|
||||||
|
- NSCameraUsageDescription: Application requests access to the device's camera.
|
||||||
|
- NSMicrophoneUsageDescription: Application requests access to the device's microphone.
|
||||||
|
- NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder.
|
||||||
|
- NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.
|
||||||
|
notarize: false
|
||||||
|
dmg:
|
||||||
|
artifactName: ${name}-${version}.${ext}
|
||||||
|
linux:
|
||||||
|
target:
|
||||||
|
- AppImage
|
||||||
|
- snap
|
||||||
|
- deb
|
||||||
|
maintainer: electronjs.org
|
||||||
|
category: Utility
|
||||||
|
appImage:
|
||||||
|
artifactName: ${name}-${version}.${ext}
|
||||||
|
npmRebuild: false
|
||||||
|
publish:
|
||||||
|
provider: generic
|
||||||
|
url: https://prev.ysaix.com:7868/src/assets/smarttalk/
|
||||||
|
electronDownload:
|
||||||
|
mirror: https://npmmirror.com/mirrors/electron/
|
|
@ -0,0 +1,47 @@
|
||||||
|
appId: com.electron.app
|
||||||
|
productName: AIx
|
||||||
|
directories:
|
||||||
|
buildResources: build
|
||||||
|
files:
|
||||||
|
- '!**/.vscode/*'
|
||||||
|
- '!src/*'
|
||||||
|
- '!electron.vite.config.{js,ts,mjs,cjs}'
|
||||||
|
- '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}'
|
||||||
|
- '!{.env,.env.*,.npmrc,pnpm-lock.yaml}'
|
||||||
|
asarUnpack:
|
||||||
|
- resources/**
|
||||||
|
win:
|
||||||
|
executableName: AIx
|
||||||
|
icon: resources/logo2.ico
|
||||||
|
nsis:
|
||||||
|
oneClick: false
|
||||||
|
allowToChangeInstallationDirectory: true
|
||||||
|
artifactName: ${name}-${version}-setup.${ext}
|
||||||
|
shortcutName: ${productName}
|
||||||
|
uninstallDisplayName: ${productName}
|
||||||
|
createDesktopShortcut: always
|
||||||
|
mac:
|
||||||
|
entitlementsInherit: build/entitlements.mac.plist
|
||||||
|
extendInfo:
|
||||||
|
- NSCameraUsageDescription: Application requests access to the device's camera.
|
||||||
|
- NSMicrophoneUsageDescription: Application requests access to the device's microphone.
|
||||||
|
- NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder.
|
||||||
|
- NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.
|
||||||
|
notarize: false
|
||||||
|
dmg:
|
||||||
|
artifactName: ${name}-${version}.${ext}
|
||||||
|
linux:
|
||||||
|
target:
|
||||||
|
- AppImage
|
||||||
|
- snap
|
||||||
|
- deb
|
||||||
|
maintainer: electronjs.org
|
||||||
|
category: Utility
|
||||||
|
appImage:
|
||||||
|
artifactName: ${name}-${version}.${ext}
|
||||||
|
npmRebuild: false
|
||||||
|
publish:
|
||||||
|
provider: generic
|
||||||
|
url: http://localhost:3000
|
||||||
|
electronDownload:
|
||||||
|
mirror: https://npmmirror.com/mirrors/electron/
|
|
@ -12,6 +12,7 @@ asarUnpack:
|
||||||
- resources/**
|
- resources/**
|
||||||
win:
|
win:
|
||||||
executableName: AIx
|
executableName: AIx
|
||||||
|
icon: resources/logo2.ico
|
||||||
nsis:
|
nsis:
|
||||||
oneClick: false
|
oneClick: false
|
||||||
allowToChangeInstallationDirectory: true
|
allowToChangeInstallationDirectory: true
|
||||||
|
@ -41,6 +42,6 @@ appImage:
|
||||||
npmRebuild: false
|
npmRebuild: false
|
||||||
publish:
|
publish:
|
||||||
provider: generic
|
provider: generic
|
||||||
url: https://example.com/auto-updates
|
url: https://file.ysaix.com:7868/src/assets/smarttalk/
|
||||||
electronDownload:
|
electronDownload:
|
||||||
mirror: https://npmmirror.com/mirrors/electron/
|
mirror: https://npmmirror.com/mirrors/electron/
|
||||||
|
|
|
@ -17,21 +17,18 @@ export default defineConfig({
|
||||||
// '@': resolve('./src/renderer/src'),
|
// '@': resolve('./src/renderer/src'),
|
||||||
// '@': path.resolve(__dirname, 'src/renderer/src'),
|
// '@': path.resolve(__dirname, 'src/renderer/src'),
|
||||||
'@': path.join(__dirname, './src/renderer/src'),
|
'@': path.join(__dirname, './src/renderer/src'),
|
||||||
|
'@root': path.join(__dirname, '.'),
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
server: {
|
server: {
|
||||||
proxy: {
|
proxy: {
|
||||||
'/dev-api': {
|
'/dev-api': {
|
||||||
// target: 'http://27.128.240.72:7865',
|
target: 'http://27.128.240.72:7865',
|
||||||
target: 'http://192.168.2.52:7863',
|
// target: 'http://192.168.2.52:7863',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
rewrite: (p) => p.replace(/^\/dev-api/, '')
|
rewrite: (p) => p.replace(/^\/dev-api/, '')
|
||||||
},
|
}
|
||||||
'/profile': {
|
|
||||||
target: 'http://192.168.2.52:7863',
|
|
||||||
ws: true,
|
|
||||||
changeOrigin: true
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: [vue(), WindiCSS()],
|
plugins: [vue(), WindiCSS()],
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*":[
|
"@/*":[
|
||||||
"src/renderer/src/*"
|
"src/renderer/src/*"
|
||||||
]
|
],
|
||||||
|
"@root/*":["./*"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"exclude": [
|
"exclude": [
|
||||||
|
|
21
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "electron-app",
|
"name": "aix-win",
|
||||||
"version": "1.0.0",
|
"version": "1.0.7",
|
||||||
"description": "An Electron application with Vue",
|
"description": "An Electron application with Vue",
|
||||||
"main": "./out/main/index.js",
|
"main": "./out/main/index.js",
|
||||||
"author": "example.com",
|
"author": "example.com",
|
||||||
|
@ -13,25 +13,36 @@
|
||||||
"build": "electron-vite build",
|
"build": "electron-vite build",
|
||||||
"postinstall": "electron-builder install-app-deps",
|
"postinstall": "electron-builder install-app-deps",
|
||||||
"build:unpack": "npm run build && electron-builder --dir",
|
"build:unpack": "npm run build && electron-builder --dir",
|
||||||
"build:win": "npm run build && electron-builder --win",
|
"build:dev": "npm run build && electron-builder --win --config ./electron-builder-test.yml",
|
||||||
|
"build:test": "electron-vite build --mode test && electron-builder --win --config ./electron-builder.yml",
|
||||||
|
"build:prod": "electron-vite build --mode production && electron-builder --win --config ./electron-builder-prod.yml",
|
||||||
"build:mac": "npm run build && electron-builder --mac",
|
"build:mac": "npm run build && electron-builder --mac",
|
||||||
"build:linux": "npm run build && electron-builder --linux"
|
"build:linux": "npm run build && electron-builder --linux"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron-toolkit/preload": "^3.0.1",
|
"@electron-toolkit/preload": "^3.0.1",
|
||||||
"@electron-toolkit/utils": "^3.0.0",
|
"@electron-toolkit/utils": "^3.0.0",
|
||||||
|
"@electron/remote": "^2.1.2",
|
||||||
"@element-plus/icons-vue": "^2.3.1",
|
"@element-plus/icons-vue": "^2.3.1",
|
||||||
|
"@vitejs/plugin-vue-jsx": "^4.0.0",
|
||||||
"@vueuse/core": "^10.11.0",
|
"@vueuse/core": "^10.11.0",
|
||||||
|
"cropperjs": "^1.6.2",
|
||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
"electron-dl-manager": "^3.0.0",
|
"electron-dl-manager": "^3.0.0",
|
||||||
|
"electron-log": "^5.1.7",
|
||||||
"electron-updater": "^6.1.7",
|
"electron-updater": "^6.1.7",
|
||||||
"element-plus": "^2.7.6",
|
"element-plus": "^2.7.6",
|
||||||
|
"fabric": "^5.3.0",
|
||||||
"js-cookie": "^3.0.5",
|
"js-cookie": "^3.0.5",
|
||||||
"jsencrypt": "^3.3.2",
|
"jsencrypt": "^3.3.2",
|
||||||
|
"jsondiffpatch": "0.6.0",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"pdfjs-dist": "4.4.168",
|
||||||
"pinia": "^2.1.7",
|
"pinia": "^2.1.7",
|
||||||
"pinia-plugin-persistedstate": "^3.2.1",
|
"pinia-plugin-persistedstate": "^3.2.1",
|
||||||
"vue-cropper": "^1.0.3",
|
"spark-md5": "^3.0.2",
|
||||||
"vue-router": "^4.4.0"
|
"vue-router": "^4.4.0",
|
||||||
|
"xlsx": "^0.18.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@electron-toolkit/eslint-config": "^1.0.2",
|
"@electron-toolkit/eslint-config": "^1.0.2",
|
||||||
|
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
218
src/main/file.js
|
@ -1,16 +1,105 @@
|
||||||
import CryptoJS from 'crypto-js'
|
import SparkMD5 from 'spark-md5'
|
||||||
|
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
import { ElectronDownloadManager } from 'electron-dl-manager'
|
import { ElectronDownloadManager } from 'electron-dl-manager'
|
||||||
import { dialog } from 'electron'
|
import { dialog } from 'electron'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
const uploadUrl = import.meta.env.VITE_APP_UPLOAD_API + '/smarttalk/file/upload'
|
const uploadUrl = import.meta.env.VITE_APP_UPLOAD_API + '/smarttalk/file/upload'
|
||||||
|
const asyncUploadUrl = import.meta.env.VITE_APP_UPLOAD_API + '/smarttalk/file/asyncUpload'
|
||||||
const manager = new ElectronDownloadManager()
|
const manager = new ElectronDownloadManager()
|
||||||
export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
const userDataPath = app.getPath('userData')
|
const userDataPath = app.getPath('userData')
|
||||||
const appRootFilePath = userDataPath + '\\selfFile\\'
|
const appRootFilePath = userDataPath + '\\selfFile\\'
|
||||||
const appTempFilePath = userDataPath + '\\tempFile\\'
|
const appTempFilePath = userDataPath + '\\tempFile\\'
|
||||||
|
let Spark = new SparkMD5.ArrayBuffer()
|
||||||
|
|
||||||
|
ipcMain.on('upload-file-change', (e, { id, fileNewName, cookie, fileType }) => {
|
||||||
|
let filePath = appRootFilePath + fileNewName
|
||||||
|
//执行更新,上传文件
|
||||||
|
let formData = new FormData()
|
||||||
|
formData.append('id', id)
|
||||||
|
uploadFileByFS({
|
||||||
|
url: asyncUploadUrl,
|
||||||
|
path: filePath,
|
||||||
|
name: fileNewName,
|
||||||
|
cookie,
|
||||||
|
fileType,
|
||||||
|
formData,
|
||||||
|
success: (response) => {
|
||||||
|
e.reply('upload-file-change-success' + fileNewName, {
|
||||||
|
data: response.data,
|
||||||
|
md5: formData.md5
|
||||||
|
})
|
||||||
|
},
|
||||||
|
error: (err) => {
|
||||||
|
console.error('Error uploading file:', err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
/*监听文件改变,如果有改变则返回触发*/
|
||||||
|
ipcMain.on('listen-file-change', (e, { id, fileNewName, md5, cookie, fileType }) => {
|
||||||
|
let filePath = appRootFilePath + fileNewName
|
||||||
|
let uploadId = null
|
||||||
|
let isOn = false
|
||||||
|
setInterval(() => {
|
||||||
|
getFileMD5(filePath).then((md5New) => {
|
||||||
|
if (md5New !== md5) {
|
||||||
|
md5 = md5New
|
||||||
|
if (uploadId) {
|
||||||
|
clearTimeout(uploadId)
|
||||||
|
}
|
||||||
|
if (isOn === false) {
|
||||||
|
e.reply('listen-file-change-on' + fileNewName)
|
||||||
|
isOn = true
|
||||||
|
}
|
||||||
|
//倒数十秒提交更改,十秒之内有继续修改则重置倒数
|
||||||
|
uploadId = setTimeout(() => {
|
||||||
|
//执行更新,上传文件
|
||||||
|
let formData = new FormData()
|
||||||
|
formData.append('id', id)
|
||||||
|
uploadFileByFS({
|
||||||
|
url: asyncUploadUrl,
|
||||||
|
path: filePath,
|
||||||
|
name: fileNewName,
|
||||||
|
cookie,
|
||||||
|
fileType,
|
||||||
|
formData,
|
||||||
|
success: (response) => {
|
||||||
|
e.reply('listen-file-change-success' + fileNewName, {
|
||||||
|
data: response.data,
|
||||||
|
md5: formData.md5
|
||||||
|
})
|
||||||
|
clearTimeout(uploadId)
|
||||||
|
isOn = false
|
||||||
|
},
|
||||||
|
error: (err) => {
|
||||||
|
console.error('Error uploading file:', err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, 20000)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, 10000)
|
||||||
|
})
|
||||||
|
|
||||||
|
function getFileMD5(path) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.readFile(path, (err, dataFile) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err)
|
||||||
|
return console.error(err)
|
||||||
|
}
|
||||||
|
Spark.append(dataFile)
|
||||||
|
let md5 = Spark.end()
|
||||||
|
resolve(md5)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 判断是否有本地文件
|
||||||
|
* */
|
||||||
ipcMain.on('is-have-local-file', (e, fileNewName) => {
|
ipcMain.on('is-have-local-file', (e, fileNewName) => {
|
||||||
let filePath = appRootFilePath + fileNewName
|
let filePath = appRootFilePath + fileNewName
|
||||||
fs.access(filePath, fs.constants.F_OK, (err) => {
|
fs.access(filePath, fs.constants.F_OK, (err) => {
|
||||||
|
@ -21,10 +110,39 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
e.reply('is-have-local-file-reply' + fileNewName, true)
|
e.reply('is-have-local-file-reply' + fileNewName, true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 判断是需要同步本地文件
|
||||||
|
* */
|
||||||
|
ipcMain.on('is-async-local-file', (e, { fileNewName, lastModifyTime, md5 }) => {
|
||||||
|
let filePath = appRootFilePath + fileNewName
|
||||||
|
fs.access(filePath, fs.constants.F_OK, (err) => {
|
||||||
|
if (err) {
|
||||||
|
e.reply('is-async-local-file-reply' + fileNewName, { isAsync: true, type: 'down' })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
getFileMD5(filePath).then((localMd5) => {
|
||||||
|
if (localMd5 === md5) {
|
||||||
|
e.reply('is-async-local-file-reply' + fileNewName, { isAsync: false, type: '' })
|
||||||
|
} else {
|
||||||
|
const stats = fs.statSync(filePath)
|
||||||
|
//如果线上时间大于线下时间,就需要从线上下载,否则则需要上传
|
||||||
|
let time = new Date(lastModifyTime)
|
||||||
|
if (time > stats.mtime.getTime()) {
|
||||||
|
e.reply('is-async-local-file-reply' + fileNewName, { isAsync: true, type: 'down' })
|
||||||
|
} else if (time < stats.mtime.getTime()) {
|
||||||
|
e.reply('is-async-local-file-reply' + fileNewName, { isAsync: true, type: 'upload' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
//默认浏览器打开url
|
//默认浏览器打开url
|
||||||
ipcMain.on('open-url-browser', (e, url) => {
|
ipcMain.on('open-url-browser', (e, url) => {
|
||||||
shell.openPath(url)
|
shell.openPath(url)
|
||||||
})
|
})
|
||||||
|
|
||||||
//使用默认应用打开本地文件
|
//使用默认应用打开本地文件
|
||||||
ipcMain.on('open-path-app', (e, destination) => {
|
ipcMain.on('open-path-app', (e, destination) => {
|
||||||
let path = appRootFilePath + destination
|
let path = appRootFilePath + destination
|
||||||
|
@ -40,30 +158,14 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
//复制文件
|
//导出文件
|
||||||
ipcMain.on('export-file-default', (e, list) => {
|
ipcMain.on('export-file-default', (e, list) => {
|
||||||
exportFile(list, (res) => {
|
exportFile(list, (res) => {
|
||||||
e.reply('export-file-default-reply', res)
|
e.reply('export-file-default-reply', res)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
function getFileMD5(file) {
|
function uploadFileByFS({ url, path, name, cookie, fileType, formData, success, error }) {
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const fileReader = new FileReader()
|
|
||||||
fileReader.onload = (e) => {
|
|
||||||
const buffer = e.target.result
|
|
||||||
let md5 = CryptoJS.MD5(buffer).toString()
|
|
||||||
resolve(md5)
|
|
||||||
}
|
|
||||||
fileReader.readAsArrayBuffer(file)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
ipcMain.on('creat-file-default', (e, { name, uploadData, cookie }) => {
|
|
||||||
createFolder('tempFile').then(() => {
|
|
||||||
let path = appTempFilePath + name
|
|
||||||
fs.writeFileSync(path, '', 'utf-8')
|
|
||||||
// 读取文件
|
|
||||||
fs.readFile(path, (err, data) => {
|
fs.readFile(path, (err, data) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
return console.error(err)
|
return console.error(err)
|
||||||
|
@ -75,30 +177,56 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
Authorization: 'Bearer ' + cookie
|
Authorization: 'Bearer ' + cookie
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let md5 = CryptoJS.MD5(data).toString()
|
Spark.append(data)
|
||||||
let formData = new FormData()
|
let md5 = Spark.end()
|
||||||
// 使用axios上传文件
|
// 使用axios上传文件
|
||||||
let file = new File([data], name, {
|
let file = new File([data], name, {
|
||||||
type: 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
|
type: fileType
|
||||||
})
|
})
|
||||||
|
const stats = fs.statSync(path)
|
||||||
formData.append('file', file)
|
formData.append('file', file)
|
||||||
formData.append('md5',md5)
|
formData.append('md5', md5)
|
||||||
|
formData.append('lastModifyTime', stats.mtime.toLocaleString())
|
||||||
for (let key in uploadData) {
|
|
||||||
if (uploadData.hasOwnProperty(key)) { // 检查是否是对象自身的属性
|
|
||||||
formData.append(key,uploadData[key])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
formData.append("fileFlag","教案")
|
|
||||||
axios
|
axios
|
||||||
.post(uploadUrl, formData, config)
|
.post(url, formData, config)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
|
success(response)
|
||||||
|
})
|
||||||
|
.catch((errorMsg) => {
|
||||||
|
error(errorMsg)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/*创建新的ppt文件*/
|
||||||
|
ipcMain.on('creat-file-default', (e, { name, uploadData, cookie }) => {
|
||||||
|
createFolder('tempFile').then(() => {
|
||||||
|
let path = appTempFilePath + name.replace(/[\\/:*?"<>|]/, '')
|
||||||
|
console.log(path)
|
||||||
|
fs.writeFileSync(path, '', 'utf-8')
|
||||||
|
let fileType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
|
||||||
|
let formData = new FormData()
|
||||||
|
for (let key in uploadData) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(uploadData, key)) {
|
||||||
|
// 检查是否是对象自身的属性
|
||||||
|
formData.append(key, uploadData[key])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
formData.append('fileFlag', '教案')
|
||||||
|
uploadFileByFS({
|
||||||
|
url: uploadUrl,
|
||||||
|
path,
|
||||||
|
name,
|
||||||
|
cookie,
|
||||||
|
fileType,
|
||||||
|
formData,
|
||||||
|
success: (response) => {
|
||||||
e.reply('creat-file-default-reply', response.data)
|
e.reply('creat-file-default-reply', response.data)
|
||||||
console.log('File uploaded successfully:', response.data)
|
console.log('File uploaded successfully:', response.data)
|
||||||
})
|
},
|
||||||
.catch((error) => {
|
error: (err) => {
|
||||||
console.error('Error uploading file:', error)
|
console.error('Error uploading file:', err)
|
||||||
})
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -110,8 +238,9 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
|
|
||||||
//下载文件
|
//下载文件
|
||||||
ipcMain.on('download-file-default', (e, { url, fileName }) => {
|
ipcMain.on('download-file-default', (e, { url, fileName }) => {
|
||||||
createFolder('selfFile').then(async () => {
|
createFolder('selfFile')
|
||||||
const browserWindow = BrowserWindow.fromId(e.sender.id)
|
.then(async () => {
|
||||||
|
const browserWindow = BrowserWindow.getFocusedWindow()
|
||||||
const id = await manager.download({
|
const id = await manager.download({
|
||||||
window: browserWindow,
|
window: browserWindow,
|
||||||
url: url,
|
url: url,
|
||||||
|
@ -121,7 +250,9 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
onDownloadStarted: async ({ id, item, webContents }) => {
|
onDownloadStarted: async ({ id, item, webContents }) => {
|
||||||
// Do something with the download id
|
// Do something with the download id
|
||||||
},
|
},
|
||||||
onDownloadProgress: async ({ id, item, percentCompleted }) => {},
|
onDownloadProgress: async ({ id, item, percentCompleted }) => {
|
||||||
|
e.reply('download-file-default-prog' + fileName, percentCompleted)
|
||||||
|
},
|
||||||
onDownloadCompleted: async ({ id, item }) => {
|
onDownloadCompleted: async ({ id, item }) => {
|
||||||
console.log('完成')
|
console.log('完成')
|
||||||
e.reply('download-file-default' + fileName, true)
|
e.reply('download-file-default' + fileName, true)
|
||||||
|
@ -141,6 +272,9 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
e.reply('download-file-default' + fileName, false)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
/**另存为...
|
/**另存为...
|
||||||
|
@ -191,6 +325,7 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/*导出文件*/
|
||||||
function exportFile(list, callback) {
|
function exportFile(list, callback) {
|
||||||
let win = BrowserWindow.getFocusedWindow()
|
let win = BrowserWindow.getFocusedWindow()
|
||||||
//通过扩展名识别文件类型
|
//通过扩展名识别文件类型
|
||||||
|
@ -220,10 +355,12 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*文件是否已经存在*/
|
||||||
function isHaveFile(path) {
|
function isHaveFile(path) {
|
||||||
return fs.existsSync(path)
|
return fs.existsSync(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*判断是否已经存在这个名字的文件,如果已经存在则递增导出*/
|
||||||
function filterCopyFile(path, index = 0) {
|
function filterCopyFile(path, index = 0) {
|
||||||
if (isHaveFile(path) === true) {
|
if (isHaveFile(path) === true) {
|
||||||
index++
|
index++
|
||||||
|
@ -234,6 +371,7 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*复制文件*/
|
||||||
function copyRelFile(source, destination, callback) {
|
function copyRelFile(source, destination, callback) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const readStream = fs.createReadStream(source)
|
const readStream = fs.createReadStream(source)
|
||||||
|
@ -256,6 +394,7 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*复制文件*/
|
||||||
function copyFile(source, destination, callback) {
|
function copyFile(source, destination, callback) {
|
||||||
let path = appRootFilePath + destination
|
let path = appRootFilePath + destination
|
||||||
createFolder('selfFile').then(() => {
|
createFolder('selfFile').then(() => {
|
||||||
|
@ -276,6 +415,7 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*创建文件夹*/
|
||||||
function createFolder(folderName) {
|
function createFolder(folderName) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const folderPath = path.join(userDataPath, folderName)
|
const folderPath = path.join(userDataPath, folderName)
|
||||||
|
|
|
@ -1,72 +1,217 @@
|
||||||
import { app, shell, BrowserWindow, ipcMain } from 'electron'
|
import { app, shell, BrowserWindow, ipcMain, session, BrowserView } from 'electron'
|
||||||
import { join } from 'path'
|
import { join } from 'path'
|
||||||
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
|
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
|
||||||
import icon from '../../resources/icon.png?asset'
|
import icon from '../../resources/icon.png?asset'
|
||||||
import File from './file'
|
import File from './file'
|
||||||
|
// 代理 electron/remote
|
||||||
|
// 第一步:引入remote
|
||||||
|
import remote from '@electron/remote/main'
|
||||||
|
// 第二步: 初始化remote
|
||||||
|
remote.initialize()
|
||||||
|
import updateInit from './update'
|
||||||
|
|
||||||
File({ app, shell, BrowserWindow, ipcMain })
|
File({ app, shell, BrowserWindow, ipcMain })
|
||||||
function createWindow() {
|
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'
|
||||||
// Create the browser window.
|
let mainWindow, loginWindow
|
||||||
const mainWindow = new BrowserWindow({
|
|
||||||
|
//登录窗口
|
||||||
|
function createLoginWindow() {
|
||||||
|
if (loginWindow) return
|
||||||
|
loginWindow = new BrowserWindow({
|
||||||
width: 888,
|
width: 888,
|
||||||
height: 520,
|
height: 520,
|
||||||
show: false,
|
show: false,
|
||||||
frame: false,
|
frame: false,
|
||||||
autoHideMenuBar: true,
|
autoHideMenuBar: true,
|
||||||
|
maximizable: false,
|
||||||
|
resizable: false,
|
||||||
|
icon: join(__dirname, '../../resources/logo2.ico'),
|
||||||
...(process.platform === 'linux' ? { icon } : {}),
|
...(process.platform === 'linux' ? { icon } : {}),
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
preload: join(__dirname, '../preload/index.js'),
|
preload: join(__dirname, '../preload/index.js'),
|
||||||
sandbox: false,
|
sandbox: false,
|
||||||
nodeIntegration: true
|
nodeIntegration: true,
|
||||||
|
contextIsolation: false // 沙箱取消
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
loginWindow.type = 'login' // 唯一标识
|
||||||
|
// handleUpdate(loginWindow,ipcMain)
|
||||||
|
// const loginURL = is.dev ? `http://localhost:5173/#/login` : `file://${__dirname}/index.html/#/login`
|
||||||
|
// loginWindow.loadURL(loginURL)
|
||||||
|
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
|
||||||
|
loginWindow.loadURL('http://localhost:5173/#/login')
|
||||||
|
} else {
|
||||||
|
loginWindow.loadFile(join(__dirname, '../renderer/index.html'), { hash: 'login' })
|
||||||
|
updateInit(loginWindow)
|
||||||
|
}
|
||||||
|
|
||||||
|
// loginWindow.webContents.openDevTools()
|
||||||
|
loginWindow.once('ready-to-show', () => {
|
||||||
|
loginWindow.show()
|
||||||
|
})
|
||||||
|
|
||||||
|
loginWindow.on('closed', () => {
|
||||||
|
loginWindow = null
|
||||||
|
})
|
||||||
|
|
||||||
|
remote.enable(loginWindow.webContents)
|
||||||
|
}
|
||||||
|
//主窗口
|
||||||
|
function createMainWindow() {
|
||||||
|
mainWindow = new BrowserWindow({
|
||||||
|
width: 1200,
|
||||||
|
height: 700,
|
||||||
|
show: false,
|
||||||
|
frame: false, // 无边框
|
||||||
|
autoHideMenuBar: true,
|
||||||
|
icon: join(__dirname, '../../resources/logo2.ico'),
|
||||||
|
...(process.platform === 'linux' ? { icon } : {}),
|
||||||
|
webPreferences: {
|
||||||
|
preload: join(__dirname, '../preload/index.js'),
|
||||||
|
sandbox: false,
|
||||||
|
// nodeIntegration: true,
|
||||||
|
nodeIntegration: true, // nodeApi调用
|
||||||
|
contextIsolation: false // 沙箱取消
|
||||||
|
// webSecurity: false // 跨域关闭
|
||||||
|
}
|
||||||
|
})
|
||||||
|
mainWindow.type = 'main' // 唯一标识
|
||||||
mainWindow.on('ready-to-show', () => {
|
mainWindow.on('ready-to-show', () => {
|
||||||
mainWindow.show()
|
mainWindow.show()
|
||||||
})
|
})
|
||||||
|
mainWindow.on('closed', () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
// 延迟销毁
|
||||||
|
mainWindow = null
|
||||||
|
}, 1000)
|
||||||
|
// app.quit() // 主窗口关闭-结束所有进程
|
||||||
|
})
|
||||||
mainWindow.webContents.setWindowOpenHandler((details) => {
|
mainWindow.webContents.setWindowOpenHandler((details) => {
|
||||||
shell.openExternal(details.url)
|
shell.openExternal(details.url)
|
||||||
return { action: 'deny' }
|
return { action: 'deny' }
|
||||||
})
|
})
|
||||||
mainWindow.webContents.openDevTools()
|
mainWindow.webContents.openDevTools()
|
||||||
// HMR for renderer base on electron-vite cli.
|
|
||||||
// Load the remote URL for development or the local html file for production.
|
|
||||||
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
|
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
|
||||||
mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
|
mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
|
||||||
|
|
||||||
// mainWindow.loadURL('https://file.ysaix.com:7868/')
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// mainWindow.loadURL('https://file.ysaix.com:7868/')
|
|
||||||
mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
|
mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
|
||||||
}
|
}
|
||||||
|
// mainWindow.setAlwaysOnTop(true, "screen-saver") // 将窗口设置为顶层窗口
|
||||||
|
// mainWindow.setVisibleOnAllWorkspaces(true) // 如果窗口在所有工作区都可见
|
||||||
|
// 第三步: 开启remote服务
|
||||||
|
remote.enable(mainWindow.webContents)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
// 打开外部链接窗口
|
||||||
// initialization and is ready to create browser windows.
|
let linkWin = {}
|
||||||
// Some APIs can only be used after this event occurs.
|
async function createLinkWin(data) {
|
||||||
app.whenReady().then(() => {
|
if (linkWin[data.key]) return
|
||||||
// Set app user model id for windows
|
|
||||||
|
linkWin[data.key] = new BrowserWindow({
|
||||||
|
show: false,
|
||||||
|
frame: true,
|
||||||
|
maximizable: true,
|
||||||
|
autoHideMenuBar: true,
|
||||||
|
...(process.platform === 'linux' ? { icon } : {}),
|
||||||
|
webPreferences: {
|
||||||
|
sandbox: false,
|
||||||
|
nodeIntegration: true,
|
||||||
|
worldSafeExecuteJavaScript: true,
|
||||||
|
contextIsolation: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
linkWin[data.key].type = 'link' // 唯一标识
|
||||||
|
|
||||||
|
let cookieDetails = { ...data.cookieData }
|
||||||
|
await linkWin[data.key].webContents.session.cookies
|
||||||
|
.set(cookieDetails)
|
||||||
|
.then(() => {
|
||||||
|
console.log('Cookie is successful')
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Cookie is error', error)
|
||||||
|
})
|
||||||
|
data.fullPath = data.fullPath.replaceAll('//', '/')
|
||||||
|
linkWin[data.key].loadURL(data.fullPath)
|
||||||
|
|
||||||
|
linkWin[data.key].once('ready-to-show', () => {
|
||||||
|
linkWin[data.key].show()
|
||||||
|
linkWin[data.key].maximize()
|
||||||
|
})
|
||||||
|
linkWin[data.key].on('closed', () => {
|
||||||
|
linkWin[data.key] = null
|
||||||
|
delete linkWin[data.key]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化完成
|
||||||
|
app.on('ready', () => {
|
||||||
|
// 设置应用程序用户模型标识符
|
||||||
electronApp.setAppUserModelId('com.electron')
|
electronApp.setAppUserModelId('com.electron')
|
||||||
|
|
||||||
// Default open or close DevTools by F12 in development
|
//一个新的browserWindow 被创建时触发
|
||||||
// and ignore CommandOrControl + R in production.
|
|
||||||
// see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
|
|
||||||
app.on('browser-window-created', (_, window) => {
|
app.on('browser-window-created', (_, window) => {
|
||||||
optimizer.watchWindowShortcuts(window)
|
optimizer.watchWindowShortcuts(window)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
//窗口 最大、最小、关闭
|
||||||
|
ipcMain.on('minimize-window', () => {
|
||||||
|
if (loginWindow) {
|
||||||
|
loginWindow.minimize()
|
||||||
|
}
|
||||||
|
if (mainWindow) {
|
||||||
|
mainWindow.minimize()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('maximize-window', () => {
|
||||||
|
mainWindow.isMaximized() ? mainWindow.unmaximize() : mainWindow.maximize()
|
||||||
|
})
|
||||||
|
|
||||||
createWindow()
|
ipcMain.on('close-window', () => {
|
||||||
|
if (loginWindow) {
|
||||||
|
loginWindow.destroy()
|
||||||
|
}
|
||||||
|
if (mainWindow) {
|
||||||
|
mainWindow.close() // 先发出这个关闭指令
|
||||||
|
setTimeout(() => {
|
||||||
|
//
|
||||||
|
mainWindow.destroy()
|
||||||
|
}, 200)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 打开主窗口
|
||||||
|
ipcMain.on('openMainWindow', () => {
|
||||||
|
if (!mainWindow) {
|
||||||
|
createMainWindow()
|
||||||
|
}
|
||||||
|
loginWindow.destroy()
|
||||||
|
loginWindow = null
|
||||||
|
})
|
||||||
|
// 打开登录窗口
|
||||||
|
ipcMain.on('openLoginWindow', () => {
|
||||||
|
if (!loginWindow) {
|
||||||
|
createLoginWindow()
|
||||||
|
}
|
||||||
|
mainWindow.destroy()
|
||||||
|
mainWindow = null
|
||||||
|
loginWindow.show()
|
||||||
|
loginWindow.focus()
|
||||||
|
})
|
||||||
|
|
||||||
|
//打开作业窗口
|
||||||
|
ipcMain.on('openWindow', (e, data) => {
|
||||||
|
createLinkWin(data)
|
||||||
|
})
|
||||||
|
// zdg: 消息监听
|
||||||
|
handleAll()
|
||||||
|
// 打开-登录窗口
|
||||||
|
createLoginWindow()
|
||||||
|
|
||||||
app.on('activate', function () {
|
app.on('activate', function () {
|
||||||
// On macOS it's common to re-create a window in the app when the
|
if (BrowserWindow.getAllWindows().length === 0) createLoginWindow()
|
||||||
// dock icon is clicked and there are no other windows open.
|
|
||||||
if (BrowserWindow.getAllWindows().length === 0) createWindow()
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -79,34 +224,23 @@ app.on('window-all-closed', () => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('toggle-top', (event) => {
|
// 监听全局事件
|
||||||
const win = BrowserWindow.getFocusedWindow();
|
function handleAll() {
|
||||||
const isAlwaysOnTop = win.isAlwaysOnTop();
|
// 新窗口创建-监听
|
||||||
win.setAlwaysOnTop(!isAlwaysOnTop);
|
ipcMain.on('new-window', (e, data) => {
|
||||||
event.sender.send('top-status-changed', !isAlwaysOnTop);
|
const { id, type } = data
|
||||||
})
|
const win = BrowserWindow.fromId(id)
|
||||||
|
win.type = type // 绑定独立标识
|
||||||
|
remote.enable(win.webContents) // 开启远程服务
|
||||||
ipcMain.on('minimize-window', () => {
|
})
|
||||||
const win = BrowserWindow.getFocusedWindow();
|
// 用于监听-状态管理变化-同步所有窗口
|
||||||
win.minimize();
|
ipcMain.handle('pinia-state-change', (e, storeName, jsonStr) => {
|
||||||
});
|
for(const curWin of BrowserWindow.getAllWindows()){
|
||||||
|
const id = curWin.webContents.id
|
||||||
ipcMain.on('maximize-window', () => {
|
const bool = id !== e.sender.id && !curWin.isDestroyed()
|
||||||
const win = BrowserWindow.getFocusedWindow();
|
if (bool) { // 除了消息发送窗口和销毁的窗口 其他都发送
|
||||||
if (win.isMaximized()) {
|
curWin.webContents.send('pinia-state-set', storeName, jsonStr)
|
||||||
win.unmaximize();
|
|
||||||
} else {
|
|
||||||
win.maximize();
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
})
|
||||||
ipcMain.on('close-window', () => {
|
}
|
||||||
const win = BrowserWindow.getFocusedWindow();
|
|
||||||
win.close();
|
|
||||||
});
|
|
||||||
ipcMain.on('set-winsize', (e, {x, y})=>{
|
|
||||||
const win = BrowserWindow.getFocusedWindow();
|
|
||||||
win.setSize(x,y);
|
|
||||||
win.center()
|
|
||||||
})
|
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/**
|
||||||
|
* @description: electron 封装的工具函数
|
||||||
|
* 消息整理
|
||||||
|
* tool-sphere:create 创建-悬浮球-窗口
|
||||||
|
*/
|
||||||
|
import { app, shell, BrowserWindow, ipcMain } from 'electron'
|
||||||
|
import { is } from '@electron-toolkit/utils'
|
||||||
|
|
||||||
|
// const baseUrl = 'http://localhost:5173/#' // 开发环境使用
|
||||||
|
const baseUrl = process.env['ELECTRON_RENDERER_URL']+'/#' // 开发环境使用
|
||||||
|
// 所有窗口
|
||||||
|
let allWindow = {}
|
||||||
|
// 其他已有窗口 wins
|
||||||
|
export function init() {
|
||||||
|
// 创建工具-悬浮球
|
||||||
|
ipcMain.on('tool-sphere:create', async(e, data) => {
|
||||||
|
// console.log('测试xxxx', data)
|
||||||
|
await createTools(data) // 执行逻辑
|
||||||
|
e.reply('tool-sphere:create-reply', {code: 200, msg: 'success'}) // 返回结果
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @description: 创建工具
|
||||||
|
* @param {*} url 路由地址
|
||||||
|
* @param {number} [width=800] 窗口宽度
|
||||||
|
* @param {number} [height=600] 窗口高度
|
||||||
|
* @param {{}} [option={}] 自定义选项
|
||||||
|
* @author: zdg
|
||||||
|
* @date 2021-07-05 14:07:01
|
||||||
|
*/
|
||||||
|
export function createTools({url, width = 800, height = 600, option={}}) {
|
||||||
|
const { mainWindow } = allWindow||{} // 获取主窗口
|
||||||
|
const devUrl = `${baseUrl}${url}`
|
||||||
|
const buildUrl = `file://${__dirname}/index.html${url}`
|
||||||
|
const urlAll = is.dev ? devUrl : buildUrl
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
let win = new BrowserWindow({
|
||||||
|
width, height,
|
||||||
|
type: 'toolbar', // 创建的窗口类型为工具栏窗口
|
||||||
|
frame: false, // 要创建无边框窗口
|
||||||
|
resizable: false, // 禁止窗口大小缩放
|
||||||
|
transparent: true, // 设置透明
|
||||||
|
alwaysOnTop: true, // 窗口是否总是显示在其他窗口之前
|
||||||
|
|
||||||
|
parent: mainWindow, // 父窗口
|
||||||
|
autoClose: true, // 关闭窗口后自动关闭
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true, // nodeApi调用
|
||||||
|
contextIsolation: false, // 沙箱取消
|
||||||
|
webSecurity: false // 跨域关闭
|
||||||
|
},
|
||||||
|
...option
|
||||||
|
})
|
||||||
|
// console.log(urlAll)
|
||||||
|
// url = 'https://www.baidu.com'
|
||||||
|
console.log(urlAll)
|
||||||
|
win.loadURL(urlAll)
|
||||||
|
win.setFullScreen(true) // 设置窗口为全屏
|
||||||
|
win.setIgnoreMouseEvents(true) // 忽略鼠标事件|使窗口不可选中
|
||||||
|
win.once('ready-to-show', () => {
|
||||||
|
win.show()
|
||||||
|
resolve(win)
|
||||||
|
})
|
||||||
|
win.on('closed', () => {
|
||||||
|
win = null
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 保存窗口
|
||||||
|
export function setWin(win = {}) {
|
||||||
|
if (win && Object.keys(win).length){
|
||||||
|
Object.keys(win).forEach(key => {
|
||||||
|
if (!allWindow[key]) { // 不存在就保存
|
||||||
|
allWindow[key] = win[key]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
import { dialog } from 'electron'
|
||||||
|
import logger from 'electron-log'
|
||||||
|
const updateURL = 'http://27.128.240.72:3000/zhuhao/AIx_Smarttalk/releases/tag/V1.0.0%28%E6%B5%8B%E8%AF%95%E7%89%88%29/'
|
||||||
|
|
||||||
|
// 主进程中的更新检查
|
||||||
|
const { autoUpdater } = require('electron-updater')
|
||||||
|
|
||||||
|
const updateInit = (win) => {
|
||||||
|
logger.info('进来了')
|
||||||
|
// 检查更新
|
||||||
|
autoUpdater.checkForUpdates()
|
||||||
|
// 自动下载
|
||||||
|
autoUpdater.autoDownload = false
|
||||||
|
// 设置版本更新服务器地址
|
||||||
|
// autoUpdater.setFeedURL(updateURL)
|
||||||
|
|
||||||
|
//监听更新事件
|
||||||
|
autoUpdater.on('update-available', (info) => {
|
||||||
|
logger.info('发现新版本')
|
||||||
|
dialog
|
||||||
|
.showMessageBox(win,{
|
||||||
|
type: 'info',
|
||||||
|
title: '新版本可用',
|
||||||
|
message: '有一个可用的新版本,要更新吗',
|
||||||
|
buttons: ['是', '否']
|
||||||
|
})
|
||||||
|
.then((result) => {
|
||||||
|
if (result.response === 0) {
|
||||||
|
// 用户选择更新,触发下载和安装
|
||||||
|
autoUpdater.downloadUpdate()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 没有新版本
|
||||||
|
autoUpdater.on('update-not-available', () => {
|
||||||
|
logger.info('没有新版本')
|
||||||
|
})
|
||||||
|
|
||||||
|
// 更新发生错误
|
||||||
|
autoUpdater.on('error', () => {
|
||||||
|
logger.error('检查更新失败')
|
||||||
|
})
|
||||||
|
|
||||||
|
// 监听下载进度
|
||||||
|
autoUpdater.on('download-progress', (progressObj) => {
|
||||||
|
win.webContents.send('update-app-progress', progressObj.percent);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 跟新下载完毕
|
||||||
|
autoUpdater.on('update-downloaded', () => {
|
||||||
|
dialog
|
||||||
|
.showMessageBox({
|
||||||
|
type: 'info',
|
||||||
|
title: '更新下载完成',
|
||||||
|
message: '点击确定重启获取最新内容',
|
||||||
|
buttons: ['确定']
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
// 调用 quitAndInstall 来安装更新
|
||||||
|
autoUpdater.quitAndInstall()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export default updateInit
|
|
@ -2,8 +2,8 @@ import { contextBridge } from 'electron'
|
||||||
import { electronAPI } from '@electron-toolkit/preload'
|
import { electronAPI } from '@electron-toolkit/preload'
|
||||||
|
|
||||||
// Custom APIs for renderer
|
// Custom APIs for renderer
|
||||||
const api = {}
|
const api = {
|
||||||
|
}
|
||||||
// Use `contextBridge` APIs to expose Electron APIs to
|
// Use `contextBridge` APIs to expose Electron APIs to
|
||||||
// renderer only if context isolation is enabled, otherwise
|
// renderer only if context isolation is enabled, otherwise
|
||||||
// just add to the DOM global.
|
// just add to the DOM global.
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<title>Electron</title>
|
<title>AIx智慧教育</title>
|
||||||
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
|
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
|
||||||
<!-- <meta
|
<!-- <meta
|
||||||
http-equiv="Content-Security-Policy"
|
http-equiv="Content-Security-Policy"
|
||||||
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:"
|
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:"
|
||||||
/> -->
|
/> -->
|
||||||
<meta http-equiv="Content-Security-Policy" content="connect-src *; default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src * 'self' data: blob:" />
|
<meta http-equiv="Content-Security-Policy" content="connect-src *; default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src * 'self' data: blob:" />
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,175 @@
|
||||||
|
// 查询evaluation列表
|
||||||
|
import request from '@/utils/request'
|
||||||
|
// 查询班级列表
|
||||||
|
export function listClassmain(query) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classmain/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 查询学生列表
|
||||||
|
export function listClassuser(query) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classuser/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 新增班级
|
||||||
|
export function addClassmain(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classmain',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 查询所有学科的列表
|
||||||
|
export function listEvaluation(query) {
|
||||||
|
return request({
|
||||||
|
url: '/education/evaluation/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 新增小组
|
||||||
|
export function addClassgroup(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classgroup',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//班级详情
|
||||||
|
export function getClassmain(id) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classmain/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 获取小组列表
|
||||||
|
export function listClassgroup(query) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classgroup/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//删除小组
|
||||||
|
export function delClassgroup(id) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classgroup/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//查询小组信息
|
||||||
|
export function getClassgroup(id) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classgroup/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//修改小组信息
|
||||||
|
export function updateClassgroup(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classgroup',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//新增学生
|
||||||
|
export function addStudentmain(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/studentmain',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//修改学生信息
|
||||||
|
export function updateStudentmain(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/studentmain',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//获取学生信息
|
||||||
|
export function getStudentmain(id) {
|
||||||
|
return request({
|
||||||
|
url: '/education/studentmain/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//删除学生
|
||||||
|
export function leaveClass(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classuser/leaveClass',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//删除学生所有数据
|
||||||
|
export function removeStudentDataAll(id) {
|
||||||
|
return request({
|
||||||
|
url: '/education/studentmain/removeStudent/' + id,
|
||||||
|
method: 'post'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//删除教室
|
||||||
|
export function delClassroom(id) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classroom/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//导入学生
|
||||||
|
export function addStudentmainByNameArray(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/studentmain/addByNameArray',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//新增课程预约
|
||||||
|
export function addSmartClassReserv(data) {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/classReserv/addSmartClassReserv',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//修改课程预约
|
||||||
|
export function updateSmartClassReserv(data) {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/classReserv/updateSmartClassReserv',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//查询课程预约
|
||||||
|
export function getSelfReserv() {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/classReserv/getSelfReserv',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export function deleteSmartReserv(id) {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/classReserv/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export function startClass(id) {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/classReserv/startClass',
|
||||||
|
method: 'get',
|
||||||
|
params: {id}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export function endClass(id) {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/classReserv/endClass',
|
||||||
|
method: 'get',
|
||||||
|
params: {id}
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 新增pdf圈点勾画
|
||||||
|
export const addsmartBookMark = (params) => {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/bookMark/addSmartBookMark',
|
||||||
|
method: 'post',
|
||||||
|
data:params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改pdf圈点勾画
|
||||||
|
export const updateSmartBookMarkContent = (params) => {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/bookMark/updateSmartBookMarkContent',
|
||||||
|
method: 'post',
|
||||||
|
data:params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据书id获取pdf圈点勾画
|
||||||
|
export const getBookMarkById = (bookId) => {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/bookMark/' + bookId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//根据id删除对应页数
|
||||||
|
export function deleteBookMark(ids) {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/bookMark/' + ids,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
|
@ -9,6 +9,13 @@ export const getSmarttalkPage = (params) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const getPrepareById = (id) => {
|
||||||
|
return request({
|
||||||
|
url: '/smarttalk/file/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function deleteSmarttalk(id) {
|
export function deleteSmarttalk(id) {
|
||||||
return request({
|
return request({
|
||||||
url: '/smarttalk/file/' + id,
|
url: '/smarttalk/file/' + id,
|
||||||
|
|
|
@ -9,7 +9,6 @@ export const listEvaluation = (params)=> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const addFileToPrepare = (params) => {
|
export const addFileToPrepare = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/smarttalk/file/addFileToPrepare',
|
url: '/smarttalk/file/addFileToPrepare',
|
||||||
|
@ -17,3 +16,4 @@ export const addFileToPrepare = (params) => {
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询classwork列表
|
||||||
|
export function homeworklist(params) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classwork/list',
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询entpcourse列表
|
||||||
|
export function listEntpcourse(query) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcourse/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增entpcourse
|
||||||
|
export function addEntpcourse(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcourse',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 布置作业
|
||||||
|
export function saveByClassWorkArray(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classwork/saveByClassWorkArray',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除classwork 作业
|
||||||
|
export function delClasswork(id) {
|
||||||
|
return request({
|
||||||
|
url: '/education/classwork/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,9 +1,9 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "iconfont"; /* Project id 2794390 */
|
font-family: "iconfont"; /* Project id 2794390 */
|
||||||
src: url('iconfont.woff2?t=1721179711733') format('woff2'),
|
src: url('iconfont.woff2?t=1723452423265') format('woff2'),
|
||||||
url('iconfont.woff?t=1721179711733') format('woff'),
|
url('iconfont.woff?t=1723452423265') format('woff'),
|
||||||
url('iconfont.ttf?t=1721179711733') format('truetype'),
|
url('iconfont.ttf?t=1723452423265') format('truetype'),
|
||||||
url('iconfont.svg?t=1721179711733#iconfont') format('svg');
|
url('iconfont.svg?t=1723452423265#iconfont') format('svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
.iconfont {
|
.iconfont {
|
||||||
|
@ -14,6 +14,542 @@
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-zanwushuju:before {
|
||||||
|
content: "\e655";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiangzuo:before {
|
||||||
|
content: "\e64d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-kechengziyuan1:before {
|
||||||
|
content: "\e647";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tubiaozhizuomobanyihuifu-:before {
|
||||||
|
content: "\e69d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-window-01:before {
|
||||||
|
content: "\e70b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-chuangkou-chuangkouhua:before {
|
||||||
|
content: "\e64b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-a-lujing13357:before {
|
||||||
|
content: "\e64c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-icon:before {
|
||||||
|
content: "\e640";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-ke:before {
|
||||||
|
content: "\e641";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jiaocaixuanze:before {
|
||||||
|
content: "\e642";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-organization-framework-line:before {
|
||||||
|
content: "\e9fe";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jiaocai:before {
|
||||||
|
content: "\e67b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zaixiankaoshi:before {
|
||||||
|
content: "\e643";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-mubiaohuizhi:before {
|
||||||
|
content: "\e652";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tupushujuyuan:before {
|
||||||
|
content: "\e653";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-mubiao:before {
|
||||||
|
content: "\e723";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zhishitupu:before {
|
||||||
|
content: "\e644";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tupu:before {
|
||||||
|
content: "\f48c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zhongwenwenxian:before {
|
||||||
|
content: "\e645";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tupu1:before {
|
||||||
|
content: "\e952";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-kuangjia:before {
|
||||||
|
content: "\e6ea";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-wenxian:before {
|
||||||
|
content: "\e7b6";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tupu-01:before {
|
||||||
|
content: "\e679";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tupu2:before {
|
||||||
|
content: "\e69c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tupu3:before {
|
||||||
|
content: "\e6a7";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zuzhikuangjia:before {
|
||||||
|
content: "\e646";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tupu4:before {
|
||||||
|
content: "\e6d5";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-a-kaoshi1:before {
|
||||||
|
content: "\eb13";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-fankui:before {
|
||||||
|
content: "\e738";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tiku:before {
|
||||||
|
content: "\e621";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-ldc-position:before {
|
||||||
|
content: "\e63a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-sucai:before {
|
||||||
|
content: "\e620";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-pengyou:before {
|
||||||
|
content: "\e61a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zuoye:before {
|
||||||
|
content: "\e61c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jiaoxuefenxi:before {
|
||||||
|
content: "\e605";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-wenjianjia:before {
|
||||||
|
content: "\ec17";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jiaoxueyanxiu:before {
|
||||||
|
content: "\e60d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jiaoxuesheji:before {
|
||||||
|
content: "\e606";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zhuanyeziyuanku:before {
|
||||||
|
content: "\e651";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-pengyouquan:before {
|
||||||
|
content: "\e616";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-dangqianhuihua:before {
|
||||||
|
content: "\e675";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-yanjiushi:before {
|
||||||
|
content: "\e607";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-gongzuotai:before {
|
||||||
|
content: "\e676";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-lunwen:before {
|
||||||
|
content: "\e60e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-decheng_xianshangxuexi:before {
|
||||||
|
content: "\e624";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jitibeike-:before {
|
||||||
|
content: "\e65b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-keti:before {
|
||||||
|
content: "\e6fe";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-pengyouquan1:before {
|
||||||
|
content: "\e635";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-beike1:before {
|
||||||
|
content: "\e61b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-fenxiang:before {
|
||||||
|
content: "\e611";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zhucetianjiahaoyou:before {
|
||||||
|
content: "\e8ca";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-duoqudaojicheng:before {
|
||||||
|
content: "\e696";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-yewukaizhan:before {
|
||||||
|
content: "\e612";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-fankui1:before {
|
||||||
|
content: "\e6fa";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shezhi:before {
|
||||||
|
content: "\e614";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-chayue:before {
|
||||||
|
content: "\e617";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-baogao:before {
|
||||||
|
content: "\e630";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xuekezuhe:before {
|
||||||
|
content: "\e625";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-fenxiang1:before {
|
||||||
|
content: "\eb24";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tongzhizhongxin:before {
|
||||||
|
content: "\eb43";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiajia:before {
|
||||||
|
content: "\e618";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shengchanguochengguanli:before {
|
||||||
|
content: "\e62a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-kejian:before {
|
||||||
|
content: "\e64a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-liulan:before {
|
||||||
|
content: "\e648";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-fabiao:before {
|
||||||
|
content: "\e654";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-kecheng:before {
|
||||||
|
content: "\e619";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-bianji1:before {
|
||||||
|
content: "\e61d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-pingjia:before {
|
||||||
|
content: "\e628";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zonghezhenduan:before {
|
||||||
|
content: "\e6a0";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-banji:before {
|
||||||
|
content: "\e71e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tousuyujianyi:before {
|
||||||
|
content: "\e729";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jiaoliu:before {
|
||||||
|
content: "\e6b8";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-pingyi:before {
|
||||||
|
content: "\e79a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xueqingfenxi:before {
|
||||||
|
content: "\e67a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-check:before {
|
||||||
|
content: "\e622";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-upload:before {
|
||||||
|
content: "\e634";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-taolun:before {
|
||||||
|
content: "\e61e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tujing:before {
|
||||||
|
content: "\e947";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zixun:before {
|
||||||
|
content: "\e6b3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-liulan1:before {
|
||||||
|
content: "\e6b4";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-yaosu:before {
|
||||||
|
content: "\e68c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-baogao1:before {
|
||||||
|
content: "\e62e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shoucang:before {
|
||||||
|
content: "\e61f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shenhe:before {
|
||||||
|
content: "\e623";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-w_duoxuanti:before {
|
||||||
|
content: "\e677";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-fenxi:before {
|
||||||
|
content: "\e76d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-kanshu:before {
|
||||||
|
content: "\e626";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-qwe:before {
|
||||||
|
content: "\e627";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jiancha:before {
|
||||||
|
content: "\e6c1";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-qunzu:before {
|
||||||
|
content: "\e62b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zuopin:before {
|
||||||
|
content: "\e6a9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shuyi_jiaoxueguanli:before {
|
||||||
|
content: "\e678";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-liangsuan:before {
|
||||||
|
content: "\e657";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-business-report:before {
|
||||||
|
content: "\e880";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiangmupingshen:before {
|
||||||
|
content: "\e742";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiangmushenbao:before {
|
||||||
|
content: "\e743";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiajia1:before {
|
||||||
|
content: "\e62c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-a-fenxiang2:before {
|
||||||
|
content: "\e62f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-icon_kaoshifenxi:before {
|
||||||
|
content: "\e6d3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-a-ketangshilu1:before {
|
||||||
|
content: "\e631";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-tubiao_moshileixingpeizhi:before {
|
||||||
|
content: "\e632";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiezuo:before {
|
||||||
|
content: "\e633";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-buzhi:before {
|
||||||
|
content: "\e636";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-ziyuanfenxi:before {
|
||||||
|
content: "\e637";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shoucang1:before {
|
||||||
|
content: "\e638";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-iconku-zhuanqu-:before {
|
||||||
|
content: "\e649";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-PPT:before {
|
||||||
|
content: "\e639";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-fabiaolunwen:before {
|
||||||
|
content: "\e772";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiezuo1:before {
|
||||||
|
content: "\e63b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-fenxi1:before {
|
||||||
|
content: "\e63c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-kechengziyuan:before {
|
||||||
|
content: "\e6e9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-36zuoyepingtai:before {
|
||||||
|
content: "\e699";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jiekebiaozhunbijishu:before {
|
||||||
|
content: "\e63d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xunzhang:before {
|
||||||
|
content: "\e63e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jiaocaizhengding:before {
|
||||||
|
content: "\e6a4";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xinzengmoxing:before {
|
||||||
|
content: "\e7b8";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-a-biaozhangxunzhangyingxiong:before {
|
||||||
|
content: "\e79d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xunzhang1:before {
|
||||||
|
content: "\e63f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-paizhao-xianxing:before {
|
||||||
|
content: "\e8d1";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zhuye2:before {
|
||||||
|
content: "\e604";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zuoye2:before {
|
||||||
|
content: "\f48d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-zuoye1:before {
|
||||||
|
content: "\e610";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiazai9:before {
|
||||||
|
content: "\e60b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-hudong:before {
|
||||||
|
content: "\e60c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiangpica:before {
|
||||||
|
content: "\e6be";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-gengduo:before {
|
||||||
|
content: "\e62d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jujiao:before {
|
||||||
|
content: "\e615";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-huabi:before {
|
||||||
|
content: "\e795";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-mouse:before {
|
||||||
|
content: "\e603";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xiayiye:before {
|
||||||
|
content: "\e68b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shangyiye:before {
|
||||||
|
content: "\e68e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shuangye:before {
|
||||||
|
content: "\e64e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-danyemoban:before {
|
||||||
|
content: "\e859";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-lingdang:before {
|
||||||
|
content: "\e613";
|
||||||
|
}
|
||||||
|
|
||||||
.icon-yidongdaozu:before {
|
.icon-yidongdaozu:before {
|
||||||
content: "\e67d";
|
content: "\e67d";
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,944 @@
|
||||||
"css_prefix_text": "icon-",
|
"css_prefix_text": "icon-",
|
||||||
"description": "",
|
"description": "",
|
||||||
"glyphs": [
|
"glyphs": [
|
||||||
|
{
|
||||||
|
"icon_id": "9689424",
|
||||||
|
"name": "暂无数据",
|
||||||
|
"font_class": "zanwushuju",
|
||||||
|
"unicode": "e655",
|
||||||
|
"unicode_decimal": 58965
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6176588",
|
||||||
|
"name": "向左",
|
||||||
|
"font_class": "xiangzuo",
|
||||||
|
"unicode": "e64d",
|
||||||
|
"unicode_decimal": 58957
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "3053509",
|
||||||
|
"name": "课程资源",
|
||||||
|
"font_class": "kechengziyuan1",
|
||||||
|
"unicode": "e647",
|
||||||
|
"unicode_decimal": 58951
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4427402",
|
||||||
|
"name": "窗口",
|
||||||
|
"font_class": "tubiaozhizuomobanyihuifu-",
|
||||||
|
"unicode": "e69d",
|
||||||
|
"unicode_decimal": 59037
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "18418603",
|
||||||
|
"name": "窗口",
|
||||||
|
"font_class": "window-01",
|
||||||
|
"unicode": "e70b",
|
||||||
|
"unicode_decimal": 59147
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "30970631",
|
||||||
|
"name": "窗口-窗口化",
|
||||||
|
"font_class": "chuangkou-chuangkouhua",
|
||||||
|
"unicode": "e64b",
|
||||||
|
"unicode_decimal": 58955
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "41196567",
|
||||||
|
"name": "下课",
|
||||||
|
"font_class": "a-lujing13357",
|
||||||
|
"unicode": "e64c",
|
||||||
|
"unicode_decimal": 58956
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "680440",
|
||||||
|
"name": "教材",
|
||||||
|
"font_class": "icon",
|
||||||
|
"unicode": "e640",
|
||||||
|
"unicode_decimal": 58944
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "3069674",
|
||||||
|
"name": "课",
|
||||||
|
"font_class": "ke",
|
||||||
|
"unicode": "e641",
|
||||||
|
"unicode_decimal": 58945
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4287869",
|
||||||
|
"name": "教材选择",
|
||||||
|
"font_class": "jiaocaixuanze",
|
||||||
|
"unicode": "e642",
|
||||||
|
"unicode_decimal": 58946
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6235034",
|
||||||
|
"name": "组织框架",
|
||||||
|
"font_class": "organization-framework-line",
|
||||||
|
"unicode": "e9fe",
|
||||||
|
"unicode_decimal": 59902
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "10900222",
|
||||||
|
"name": "教材",
|
||||||
|
"font_class": "jiaocai",
|
||||||
|
"unicode": "e67b",
|
||||||
|
"unicode_decimal": 59003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "12820192",
|
||||||
|
"name": "在线考试",
|
||||||
|
"font_class": "zaixiankaoshi",
|
||||||
|
"unicode": "e643",
|
||||||
|
"unicode_decimal": 58947
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "12975221",
|
||||||
|
"name": "目标绘制",
|
||||||
|
"font_class": "mubiaohuizhi",
|
||||||
|
"unicode": "e652",
|
||||||
|
"unicode_decimal": 58962
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "15222476",
|
||||||
|
"name": "图谱数据源",
|
||||||
|
"font_class": "tupushujuyuan",
|
||||||
|
"unicode": "e653",
|
||||||
|
"unicode_decimal": 58963
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "18455976",
|
||||||
|
"name": "目标",
|
||||||
|
"font_class": "mubiao",
|
||||||
|
"unicode": "e723",
|
||||||
|
"unicode_decimal": 59171
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22387410",
|
||||||
|
"name": "知识图谱",
|
||||||
|
"font_class": "zhishitupu",
|
||||||
|
"unicode": "e644",
|
||||||
|
"unicode_decimal": 58948
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "23514020",
|
||||||
|
"name": "图谱",
|
||||||
|
"font_class": "tupu",
|
||||||
|
"unicode": "f48c",
|
||||||
|
"unicode_decimal": 62604
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "24204139",
|
||||||
|
"name": "中文文献",
|
||||||
|
"font_class": "zhongwenwenxian",
|
||||||
|
"unicode": "e645",
|
||||||
|
"unicode_decimal": 58949
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "25426189",
|
||||||
|
"name": "图谱",
|
||||||
|
"font_class": "tupu1",
|
||||||
|
"unicode": "e952",
|
||||||
|
"unicode_decimal": 59730
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "25597826",
|
||||||
|
"name": "框架",
|
||||||
|
"font_class": "kuangjia",
|
||||||
|
"unicode": "e6ea",
|
||||||
|
"unicode_decimal": 59114
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "25843549",
|
||||||
|
"name": "文献",
|
||||||
|
"font_class": "wenxian",
|
||||||
|
"unicode": "e7b6",
|
||||||
|
"unicode_decimal": 59318
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "26904934",
|
||||||
|
"name": "122-图谱",
|
||||||
|
"font_class": "tupu-01",
|
||||||
|
"unicode": "e679",
|
||||||
|
"unicode_decimal": 59001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "28551525",
|
||||||
|
"name": "图谱",
|
||||||
|
"font_class": "tupu2",
|
||||||
|
"unicode": "e69c",
|
||||||
|
"unicode_decimal": 59036
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "29570352",
|
||||||
|
"name": "图谱",
|
||||||
|
"font_class": "tupu3",
|
||||||
|
"unicode": "e6a7",
|
||||||
|
"unicode_decimal": 59047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "31509204",
|
||||||
|
"name": "组织框架",
|
||||||
|
"font_class": "zuzhikuangjia",
|
||||||
|
"unicode": "e646",
|
||||||
|
"unicode_decimal": 58950
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "34748859",
|
||||||
|
"name": "图谱",
|
||||||
|
"font_class": "tupu4",
|
||||||
|
"unicode": "e6d5",
|
||||||
|
"unicode_decimal": 59093
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "35203463",
|
||||||
|
"name": "考试 (1)",
|
||||||
|
"font_class": "a-kaoshi1",
|
||||||
|
"unicode": "eb13",
|
||||||
|
"unicode_decimal": 60179
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "577336",
|
||||||
|
"name": "反馈",
|
||||||
|
"font_class": "fankui",
|
||||||
|
"unicode": "e738",
|
||||||
|
"unicode_decimal": 59192
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1447760",
|
||||||
|
"name": "题库",
|
||||||
|
"font_class": "tiku",
|
||||||
|
"unicode": "e621",
|
||||||
|
"unicode_decimal": 58913
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1837440",
|
||||||
|
"name": "ldc-position",
|
||||||
|
"font_class": "ldc-position",
|
||||||
|
"unicode": "e63a",
|
||||||
|
"unicode_decimal": 58938
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4138813",
|
||||||
|
"name": "素材",
|
||||||
|
"font_class": "sucai",
|
||||||
|
"unicode": "e620",
|
||||||
|
"unicode_decimal": 58912
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4166140",
|
||||||
|
"name": "朋友",
|
||||||
|
"font_class": "pengyou",
|
||||||
|
"unicode": "e61a",
|
||||||
|
"unicode_decimal": 58906
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4310077",
|
||||||
|
"name": "作业",
|
||||||
|
"font_class": "zuoye",
|
||||||
|
"unicode": "e61c",
|
||||||
|
"unicode_decimal": 58908
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4686996",
|
||||||
|
"name": "教学分析",
|
||||||
|
"font_class": "jiaoxuefenxi",
|
||||||
|
"unicode": "e605",
|
||||||
|
"unicode_decimal": 58885
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4893191",
|
||||||
|
"name": "文件夹",
|
||||||
|
"font_class": "wenjianjia",
|
||||||
|
"unicode": "ec17",
|
||||||
|
"unicode_decimal": 60439
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5838892",
|
||||||
|
"name": "教学研修",
|
||||||
|
"font_class": "jiaoxueyanxiu",
|
||||||
|
"unicode": "e60d",
|
||||||
|
"unicode_decimal": 58893
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5931005",
|
||||||
|
"name": "教学设计",
|
||||||
|
"font_class": "jiaoxuesheji",
|
||||||
|
"unicode": "e606",
|
||||||
|
"unicode_decimal": 58886
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6360457",
|
||||||
|
"name": "专业资源库",
|
||||||
|
"font_class": "zhuanyeziyuanku",
|
||||||
|
"unicode": "e651",
|
||||||
|
"unicode_decimal": 58961
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6556747",
|
||||||
|
"name": "朋友圈",
|
||||||
|
"font_class": "pengyouquan",
|
||||||
|
"unicode": "e616",
|
||||||
|
"unicode_decimal": 58902
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6992598",
|
||||||
|
"name": "当前会话",
|
||||||
|
"font_class": "dangqianhuihua",
|
||||||
|
"unicode": "e675",
|
||||||
|
"unicode_decimal": 58997
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "7327280",
|
||||||
|
"name": "研究室",
|
||||||
|
"font_class": "yanjiushi",
|
||||||
|
"unicode": "e607",
|
||||||
|
"unicode_decimal": 58887
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "7905547",
|
||||||
|
"name": "工作台",
|
||||||
|
"font_class": "gongzuotai",
|
||||||
|
"unicode": "e676",
|
||||||
|
"unicode_decimal": 58998
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "9023128",
|
||||||
|
"name": "论文",
|
||||||
|
"font_class": "lunwen",
|
||||||
|
"unicode": "e60e",
|
||||||
|
"unicode_decimal": 58894
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "10130330",
|
||||||
|
"name": "德诚_线上学习001",
|
||||||
|
"font_class": "decheng_xianshangxuexi",
|
||||||
|
"unicode": "e624",
|
||||||
|
"unicode_decimal": 58916
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "10493421",
|
||||||
|
"name": "集体备课",
|
||||||
|
"font_class": "jitibeike-",
|
||||||
|
"unicode": "e65b",
|
||||||
|
"unicode_decimal": 58971
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "13228302",
|
||||||
|
"name": "课题",
|
||||||
|
"font_class": "keti",
|
||||||
|
"unicode": "e6fe",
|
||||||
|
"unicode_decimal": 59134
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "16364339",
|
||||||
|
"name": "朋友圈",
|
||||||
|
"font_class": "pengyouquan1",
|
||||||
|
"unicode": "e635",
|
||||||
|
"unicode_decimal": 58933
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "37075078",
|
||||||
|
"name": "备课",
|
||||||
|
"font_class": "beike1",
|
||||||
|
"unicode": "e61b",
|
||||||
|
"unicode_decimal": 58907
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1425581",
|
||||||
|
"name": "share",
|
||||||
|
"font_class": "fenxiang",
|
||||||
|
"unicode": "e611",
|
||||||
|
"unicode_decimal": 58897
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1727462",
|
||||||
|
"name": "227注册、添加好友",
|
||||||
|
"font_class": "zhucetianjiahaoyou",
|
||||||
|
"unicode": "e8ca",
|
||||||
|
"unicode_decimal": 59594
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "2071695",
|
||||||
|
"name": "场景灵活",
|
||||||
|
"font_class": "duoqudaojicheng",
|
||||||
|
"unicode": "e696",
|
||||||
|
"unicode_decimal": 59030
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "2077372",
|
||||||
|
"name": "业务开展",
|
||||||
|
"font_class": "yewukaizhan",
|
||||||
|
"unicode": "e612",
|
||||||
|
"unicode_decimal": 58898
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "2680657",
|
||||||
|
"name": "反馈",
|
||||||
|
"font_class": "fankui1",
|
||||||
|
"unicode": "e6fa",
|
||||||
|
"unicode_decimal": 59130
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4520331",
|
||||||
|
"name": "设置",
|
||||||
|
"font_class": "shezhi",
|
||||||
|
"unicode": "e614",
|
||||||
|
"unicode_decimal": 58900
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4572456",
|
||||||
|
"name": "查阅",
|
||||||
|
"font_class": "chayue",
|
||||||
|
"unicode": "e617",
|
||||||
|
"unicode_decimal": 58903
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4662757",
|
||||||
|
"name": "报告",
|
||||||
|
"font_class": "baogao",
|
||||||
|
"unicode": "e630",
|
||||||
|
"unicode_decimal": 58928
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5062867",
|
||||||
|
"name": "学科组合",
|
||||||
|
"font_class": "xuekezuhe",
|
||||||
|
"unicode": "e625",
|
||||||
|
"unicode_decimal": 58917
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5387651",
|
||||||
|
"name": "分享",
|
||||||
|
"font_class": "fenxiang1",
|
||||||
|
"unicode": "eb24",
|
||||||
|
"unicode_decimal": 60196
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5387730",
|
||||||
|
"name": "通知中心",
|
||||||
|
"font_class": "tongzhizhongxin",
|
||||||
|
"unicode": "eb43",
|
||||||
|
"unicode_decimal": 60227
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5643535",
|
||||||
|
"name": "下架",
|
||||||
|
"font_class": "xiajia",
|
||||||
|
"unicode": "e618",
|
||||||
|
"unicode_decimal": 58904
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6241672",
|
||||||
|
"name": "生产过程管理",
|
||||||
|
"font_class": "shengchanguochengguanli",
|
||||||
|
"unicode": "e62a",
|
||||||
|
"unicode_decimal": 58922
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6286025",
|
||||||
|
"name": "课件",
|
||||||
|
"font_class": "kejian",
|
||||||
|
"unicode": "e64a",
|
||||||
|
"unicode_decimal": 58954
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6447187",
|
||||||
|
"name": "浏览",
|
||||||
|
"font_class": "liulan",
|
||||||
|
"unicode": "e648",
|
||||||
|
"unicode_decimal": 58952
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6548533",
|
||||||
|
"name": "发表",
|
||||||
|
"font_class": "fabiao",
|
||||||
|
"unicode": "e654",
|
||||||
|
"unicode_decimal": 58964
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6560965",
|
||||||
|
"name": "课程",
|
||||||
|
"font_class": "kecheng",
|
||||||
|
"unicode": "e619",
|
||||||
|
"unicode_decimal": 58905
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6682548",
|
||||||
|
"name": "编辑",
|
||||||
|
"font_class": "bianji1",
|
||||||
|
"unicode": "e61d",
|
||||||
|
"unicode_decimal": 58909
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "7291078",
|
||||||
|
"name": "评价",
|
||||||
|
"font_class": "pingjia",
|
||||||
|
"unicode": "e628",
|
||||||
|
"unicode_decimal": 58920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "7339813",
|
||||||
|
"name": "综合诊断",
|
||||||
|
"font_class": "zonghezhenduan",
|
||||||
|
"unicode": "e6a0",
|
||||||
|
"unicode_decimal": 59040
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "7712190",
|
||||||
|
"name": "班级",
|
||||||
|
"font_class": "banji",
|
||||||
|
"unicode": "e71e",
|
||||||
|
"unicode_decimal": 59166
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "7712222",
|
||||||
|
"name": "投诉与建议",
|
||||||
|
"font_class": "tousuyujianyi",
|
||||||
|
"unicode": "e729",
|
||||||
|
"unicode_decimal": 59177
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "8136353",
|
||||||
|
"name": "交流",
|
||||||
|
"font_class": "jiaoliu",
|
||||||
|
"unicode": "e6b8",
|
||||||
|
"unicode_decimal": 59064
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "8198365",
|
||||||
|
"name": "评议",
|
||||||
|
"font_class": "pingyi",
|
||||||
|
"unicode": "e79a",
|
||||||
|
"unicode_decimal": 59290
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "8225912",
|
||||||
|
"name": "学情分析",
|
||||||
|
"font_class": "xueqingfenxi",
|
||||||
|
"unicode": "e67a",
|
||||||
|
"unicode_decimal": 59002
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "9922803",
|
||||||
|
"name": "check",
|
||||||
|
"font_class": "check",
|
||||||
|
"unicode": "e622",
|
||||||
|
"unicode_decimal": 58914
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "9927174",
|
||||||
|
"name": "upload",
|
||||||
|
"font_class": "upload",
|
||||||
|
"unicode": "e634",
|
||||||
|
"unicode_decimal": 58932
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "10360972",
|
||||||
|
"name": "讨论",
|
||||||
|
"font_class": "taolun",
|
||||||
|
"unicode": "e61e",
|
||||||
|
"unicode_decimal": 58910
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "10373863",
|
||||||
|
"name": "途径",
|
||||||
|
"font_class": "tujing",
|
||||||
|
"unicode": "e947",
|
||||||
|
"unicode_decimal": 59719
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "11594397",
|
||||||
|
"name": "咨询",
|
||||||
|
"font_class": "zixun",
|
||||||
|
"unicode": "e6b3",
|
||||||
|
"unicode_decimal": 59059
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "11594406",
|
||||||
|
"name": "浏览",
|
||||||
|
"font_class": "liulan1",
|
||||||
|
"unicode": "e6b4",
|
||||||
|
"unicode_decimal": 59060
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "11677828",
|
||||||
|
"name": "要素",
|
||||||
|
"font_class": "yaosu",
|
||||||
|
"unicode": "e68c",
|
||||||
|
"unicode_decimal": 59020
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "11810655",
|
||||||
|
"name": "报告",
|
||||||
|
"font_class": "baogao1",
|
||||||
|
"unicode": "e62e",
|
||||||
|
"unicode_decimal": 58926
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "12476912",
|
||||||
|
"name": "收藏",
|
||||||
|
"font_class": "shoucang",
|
||||||
|
"unicode": "e61f",
|
||||||
|
"unicode_decimal": 58911
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "12771482",
|
||||||
|
"name": "审核",
|
||||||
|
"font_class": "shenhe",
|
||||||
|
"unicode": "e623",
|
||||||
|
"unicode_decimal": 58915
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "12842682",
|
||||||
|
"name": "w_多选题",
|
||||||
|
"font_class": "w_duoxuanti",
|
||||||
|
"unicode": "e677",
|
||||||
|
"unicode_decimal": 58999
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "14095222",
|
||||||
|
"name": "分析",
|
||||||
|
"font_class": "fenxi",
|
||||||
|
"unicode": "e76d",
|
||||||
|
"unicode_decimal": 59245
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "14898108",
|
||||||
|
"name": "kanshu",
|
||||||
|
"font_class": "kanshu",
|
||||||
|
"unicode": "e626",
|
||||||
|
"unicode_decimal": 58918
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "15053387",
|
||||||
|
"name": "上传",
|
||||||
|
"font_class": "qwe",
|
||||||
|
"unicode": "e627",
|
||||||
|
"unicode_decimal": 58919
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "15644340",
|
||||||
|
"name": "检查",
|
||||||
|
"font_class": "jiancha",
|
||||||
|
"unicode": "e6c1",
|
||||||
|
"unicode_decimal": 59073
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "17334540",
|
||||||
|
"name": "群组",
|
||||||
|
"font_class": "qunzu",
|
||||||
|
"unicode": "e62b",
|
||||||
|
"unicode_decimal": 58923
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "17335274",
|
||||||
|
"name": "作品",
|
||||||
|
"font_class": "zuopin",
|
||||||
|
"unicode": "e6a9",
|
||||||
|
"unicode_decimal": 59049
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22779610",
|
||||||
|
"name": "教学管理",
|
||||||
|
"font_class": "shuyi_jiaoxueguanli",
|
||||||
|
"unicode": "e678",
|
||||||
|
"unicode_decimal": 59000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "27538561",
|
||||||
|
"name": "liangsuan",
|
||||||
|
"font_class": "liangsuan",
|
||||||
|
"unicode": "e657",
|
||||||
|
"unicode_decimal": 58967
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "27787858",
|
||||||
|
"name": "business-report",
|
||||||
|
"font_class": "business-report",
|
||||||
|
"unicode": "e880",
|
||||||
|
"unicode_decimal": 59520
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "28627465",
|
||||||
|
"name": "项目评审",
|
||||||
|
"font_class": "xiangmupingshen",
|
||||||
|
"unicode": "e742",
|
||||||
|
"unicode_decimal": 59202
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "28627468",
|
||||||
|
"name": "项目申报",
|
||||||
|
"font_class": "xiangmushenbao",
|
||||||
|
"unicode": "e743",
|
||||||
|
"unicode_decimal": 59203
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "33848036",
|
||||||
|
"name": "下架",
|
||||||
|
"font_class": "xiajia1",
|
||||||
|
"unicode": "e62c",
|
||||||
|
"unicode_decimal": 58924
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "33987020",
|
||||||
|
"name": "分享 2",
|
||||||
|
"font_class": "a-fenxiang2",
|
||||||
|
"unicode": "e62f",
|
||||||
|
"unicode_decimal": 58927
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "37863983",
|
||||||
|
"name": "考试分析",
|
||||||
|
"font_class": "icon_kaoshifenxi",
|
||||||
|
"unicode": "e6d3",
|
||||||
|
"unicode_decimal": 59091
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "37966293",
|
||||||
|
"name": "课堂实录 1",
|
||||||
|
"font_class": "a-ketangshilu1",
|
||||||
|
"unicode": "e631",
|
||||||
|
"unicode_decimal": 58929
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "38963985",
|
||||||
|
"name": "图标_模式类型配置",
|
||||||
|
"font_class": "tubiao_moshileixingpeizhi",
|
||||||
|
"unicode": "e632",
|
||||||
|
"unicode_decimal": 58930
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39005401",
|
||||||
|
"name": "写作-copy",
|
||||||
|
"font_class": "xiezuo",
|
||||||
|
"unicode": "e633",
|
||||||
|
"unicode_decimal": 58931
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39313770",
|
||||||
|
"name": "布置-copy",
|
||||||
|
"font_class": "buzhi",
|
||||||
|
"unicode": "e636",
|
||||||
|
"unicode_decimal": 58934
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39506557",
|
||||||
|
"name": "资源分析",
|
||||||
|
"font_class": "ziyuanfenxi",
|
||||||
|
"unicode": "e637",
|
||||||
|
"unicode_decimal": 58935
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "3267408",
|
||||||
|
"name": "收藏",
|
||||||
|
"font_class": "shoucang1",
|
||||||
|
"unicode": "e638",
|
||||||
|
"unicode_decimal": 58936
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "3161194",
|
||||||
|
"name": "题目数量",
|
||||||
|
"font_class": "iconku-zhuanqu-",
|
||||||
|
"unicode": "e649",
|
||||||
|
"unicode_decimal": 58953
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4349654",
|
||||||
|
"name": "PPT",
|
||||||
|
"font_class": "PPT",
|
||||||
|
"unicode": "e639",
|
||||||
|
"unicode_decimal": 58937
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5708257",
|
||||||
|
"name": "发表论文",
|
||||||
|
"font_class": "fabiaolunwen",
|
||||||
|
"unicode": "e772",
|
||||||
|
"unicode_decimal": 59250
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6837777",
|
||||||
|
"name": "写作",
|
||||||
|
"font_class": "xiezuo1",
|
||||||
|
"unicode": "e63b",
|
||||||
|
"unicode_decimal": 58939
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "7171145",
|
||||||
|
"name": "粮食动态决策分析系统",
|
||||||
|
"font_class": "fenxi1",
|
||||||
|
"unicode": "e63c",
|
||||||
|
"unicode_decimal": 58940
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "12252416",
|
||||||
|
"name": "课程资源",
|
||||||
|
"font_class": "kechengziyuan",
|
||||||
|
"unicode": "e6e9",
|
||||||
|
"unicode_decimal": 59113
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "19567416",
|
||||||
|
"name": "作业平台",
|
||||||
|
"font_class": "36zuoyepingtai",
|
||||||
|
"unicode": "e699",
|
||||||
|
"unicode_decimal": 59033
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "975544",
|
||||||
|
"name": "结课标准-笔记数",
|
||||||
|
"font_class": "jiekebiaozhunbijishu",
|
||||||
|
"unicode": "e63d",
|
||||||
|
"unicode_decimal": 58941
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "7086494",
|
||||||
|
"name": "勋章",
|
||||||
|
"font_class": "xunzhang",
|
||||||
|
"unicode": "e63e",
|
||||||
|
"unicode_decimal": 58942
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "12573415",
|
||||||
|
"name": "教材征订",
|
||||||
|
"font_class": "jiaocaizhengding",
|
||||||
|
"unicode": "e6a4",
|
||||||
|
"unicode_decimal": 59044
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "35789485",
|
||||||
|
"name": "新增模型",
|
||||||
|
"font_class": "xinzengmoxing",
|
||||||
|
"unicode": "e7b8",
|
||||||
|
"unicode_decimal": 59320
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39690914",
|
||||||
|
"name": "表彰勋章英雄",
|
||||||
|
"font_class": "a-biaozhangxunzhangyingxiong",
|
||||||
|
"unicode": "e79d",
|
||||||
|
"unicode_decimal": 59293
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39798902",
|
||||||
|
"name": "勋章",
|
||||||
|
"font_class": "xunzhang1",
|
||||||
|
"unicode": "e63f",
|
||||||
|
"unicode_decimal": 58943
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1727478",
|
||||||
|
"name": "237拍照-线性",
|
||||||
|
"font_class": "paizhao-xianxing",
|
||||||
|
"unicode": "e8d1",
|
||||||
|
"unicode_decimal": 59601
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1123930",
|
||||||
|
"name": "主页未选",
|
||||||
|
"font_class": "zhuye2",
|
||||||
|
"unicode": "e604",
|
||||||
|
"unicode_decimal": 58884
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "41372607",
|
||||||
|
"name": "作业-2",
|
||||||
|
"font_class": "zuoye2",
|
||||||
|
"unicode": "f48d",
|
||||||
|
"unicode_decimal": 62605
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "8023423",
|
||||||
|
"name": "作业",
|
||||||
|
"font_class": "zuoye1",
|
||||||
|
"unicode": "e610",
|
||||||
|
"unicode_decimal": 58896
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "720967",
|
||||||
|
"name": "更多",
|
||||||
|
"font_class": "xiazai9",
|
||||||
|
"unicode": "e60b",
|
||||||
|
"unicode_decimal": 58891
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "3596229",
|
||||||
|
"name": "互动",
|
||||||
|
"font_class": "hudong",
|
||||||
|
"unicode": "e60c",
|
||||||
|
"unicode_decimal": 58892
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5233263",
|
||||||
|
"name": "橡皮擦",
|
||||||
|
"font_class": "xiangpica",
|
||||||
|
"unicode": "e6be",
|
||||||
|
"unicode_decimal": 59070
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5905756",
|
||||||
|
"name": "更多",
|
||||||
|
"font_class": "gengduo",
|
||||||
|
"unicode": "e62d",
|
||||||
|
"unicode_decimal": 58925
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "11107711",
|
||||||
|
"name": "聚焦",
|
||||||
|
"font_class": "jujiao",
|
||||||
|
"unicode": "e615",
|
||||||
|
"unicode_decimal": 58901
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "36969022",
|
||||||
|
"name": "画笔",
|
||||||
|
"font_class": "huabi",
|
||||||
|
"unicode": "e795",
|
||||||
|
"unicode_decimal": 59285
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "30792830",
|
||||||
|
"name": "28D鼠标箭头-copy",
|
||||||
|
"font_class": "mouse",
|
||||||
|
"unicode": "e603",
|
||||||
|
"unicode_decimal": 58883
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "694110",
|
||||||
|
"name": "下一页",
|
||||||
|
"font_class": "xiayiye",
|
||||||
|
"unicode": "e68b",
|
||||||
|
"unicode_decimal": 59019
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "694115",
|
||||||
|
"name": "上一页",
|
||||||
|
"font_class": "shangyiye",
|
||||||
|
"unicode": "e68e",
|
||||||
|
"unicode_decimal": 59022
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "930693",
|
||||||
|
"name": "双页",
|
||||||
|
"font_class": "shuangye",
|
||||||
|
"unicode": "e64e",
|
||||||
|
"unicode_decimal": 58958
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "2144697",
|
||||||
|
"name": "单页模板",
|
||||||
|
"font_class": "danyemoban",
|
||||||
|
"unicode": "e859",
|
||||||
|
"unicode_decimal": 59481
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "17990800",
|
||||||
|
"name": "铃铛",
|
||||||
|
"font_class": "lingdang",
|
||||||
|
"unicode": "e613",
|
||||||
|
"unicode_decimal": 58899
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"icon_id": "1207918",
|
"icon_id": "1207918",
|
||||||
"name": "移动到组",
|
"name": "移动到组",
|
||||||
|
|
Before Width: | Height: | Size: 352 KiB After Width: | Height: | Size: 263 KiB |
|
@ -0,0 +1,177 @@
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|