feat: 代码提交

main
xiangcongshuai 8 months ago
parent 92f49e2c06
commit d23c55fb49

@ -0,0 +1,5 @@
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true

@ -0,0 +1,9 @@
build/*.js
src/assets
public
dist
.env.development
.env.production
package-lock.json

@ -0,0 +1,200 @@
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint',
sourceType: 'module'
},
env: {
browser: true,
node: true,
es6: true,
},
extends: ['plugin:vue/recommended', 'eslint:recommended'],
// add your Customize rules here
//it is base on https://github.com/vuejs/eslint-config-vue
rules: {
"vue/max-attributes-per-line": [2, {
"singleline": 10,
"multiline": {
"max": 1,
"allowFirstLine": false
}
}],
"vue/singleline-html-element-content-newline": "off",
'vue/no-unused-components': 'off',
"vue/multiline-html-element-content-newline":"off",
"vue/multi-word-component-name": 0,
"vue/name-property-casing": ["error", "PascalCase"],
"vue/no-v-html": "off",
'accessor-pairs': 2,
'arrow-spacing': [2, {
'before': true,
'after': true
}],
'block-spacing': [2, 'always'],
'brace-style': [2, '1tbs', {
'allowSingleLine': true
}],
'camelcase': [0, {
'properties': 'always'
}],
'comma-dangle': [2, 'never'],
'comma-spacing': [2, {
'before': false,
'after': true
}],
'comma-style': [2, 'last'],
'constructor-super': 2,
'curly': [2, 'multi-line'],
'dot-location': [2, 'property'],
'eol-last': 2,
'eqeqeq': ["error", "always", {"null": "ignore"}],
'generator-star-spacing': [2, {
'before': true,
'after': true
}],
'handle-callback-err': [2, '^(err|error)$'],
'indent': [2, 2, {
'SwitchCase': 1
}],
'jsx-quotes': [2, 'prefer-single'],
'key-spacing': [2, {
'beforeColon': false,
'afterColon': true
}],
'keyword-spacing': [2, {
'before': true,
'after': true
}],
'new-cap': [2, {
'newIsCap': true,
'capIsNew': false
}],
'new-parens': 2,
'no-array-constructor': 2,
'no-caller': 2,
'no-console': 'off',
'no-class-assign': 2,
'no-cond-assign': 2,
'no-const-assign': 2,
'no-control-regex': 0,
'no-delete-var': 2,
'no-dupe-args': 2,
'no-dupe-class-members': 2,
'no-dupe-keys': 2,
'no-duplicate-case': 2,
'no-empty-character-class': 2,
'no-empty-pattern': 2,
'no-eval': 2,
'no-ex-assign': 2,
'no-extend-native': 2,
'no-extra-bind': 2,
'no-extra-boolean-cast': 2,
'no-extra-parens': [2, 'functions'],
'no-fallthrough': 2,
'no-floating-decimal': 2,
'no-func-assign': 2,
'no-implied-eval': 2,
'no-inner-declarations': [2, 'functions'],
'no-invalid-regexp': 2,
'no-irregular-whitespace': 2,
'no-iterator': 2,
'no-label-var': 2,
'no-labels': [2, {
'allowLoop': false,
'allowSwitch': false
}],
'no-lone-blocks': 2,
'no-mixed-spaces-and-tabs': 2,
'no-multi-spaces': 2,
'no-multi-str': 2,
'no-multiple-empty-lines': [2, {
'max': 1
}],
'no-native-reassign': 2,
'no-negated-in-lhs': 2,
'no-new-object': 2,
'no-new-require': 2,
'no-new-symbol': 2,
'no-new-wrappers': 2,
'no-obj-calls': 2,
'no-octal': 2,
'no-octal-escape': 2,
'no-path-concat': 2,
'no-proto': 2,
'no-redeclare': 2,
'no-regex-spaces': 2,
'no-return-assign': [2, 'except-parens'],
'no-self-assign': 2,
'no-self-compare': 2,
'no-sequences': 2,
'no-shadow-restricted-names': 2,
'no-spaced-func': 2,
'no-sparse-arrays': 2,
'no-this-before-super': 2,
'no-throw-literal': 2,
'no-trailing-spaces': 2,
'no-undef': 2,
'no-undef-init': 2,
'no-unexpected-multiline': 2,
'no-unmodified-loop-condition': 2,
'no-unneeded-ternary': [2, {
'defaultAssignment': false
}],
'no-unreachable': 2,
'no-unsafe-finally': 2,
'no-unused-vars': [2, {
'vars': 'all',
'args': 'none'
}],
'no-useless-call': 2,
'no-useless-computed-key': 2,
'no-useless-constructor': 2,
'no-useless-escape': 0,
'no-whitespace-before-property': 2,
'no-with': 2,
'one-var': [2, {
'initialized': 'never'
}],
'operator-linebreak': [2, 'after', {
'overrides': {
'?': 'before',
':': 'before'
}
}],
'padded-blocks': [2, 'never'],
'quotes': [2, 'single', {
'avoidEscape': true,
'allowTemplateLiterals': true
}],
'semi': [2, 'never'],
'semi-spacing': [2, {
'before': false,
'after': true
}],
'space-before-blocks': [2, 'always'],
'space-before-function-paren': [2, 'never'],
'space-in-parens': [2, 'never'],
'space-infix-ops': 2,
'space-unary-ops': [2, {
'words': true,
'nonwords': false
}],
'spaced-comment': [2, 'always', {
'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
}],
'template-curly-spacing': [2, 'never'],
'use-isnan': 2,
'valid-typeof': 2,
'wrap-iife': [2, 'any'],
'yield-star-spacing': [2, 'both'],
'yoda': [2, 'never'],
'prefer-const': 2,
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'object-curly-spacing': [2, 'always', {
objectsInObjects: false
}],
'array-bracket-spacing': [2, 'never']
}
}

31
.gitignore vendored

@ -1,11 +1,22 @@
# ---> Vue
# gitignore template for Vue.js projects
#
# Recommended template: Node.gitignore
# TODO: where does this rule come from?
docs/_book
# TODO: where does this rule come from?
test/
.DS_Store
node_modules
dist
dist.zip
# local env files
.env.local
.env.*.local
package-lock.json
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

@ -1,3 +1,24 @@
# fu-hsi-web
伏羲大模型前端地址
## Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Lints and fixes files
```
npm run lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

@ -0,0 +1,19 @@
{
"compilerOptions": {
"target": "es5",
"module": "esnext",
"baseUrl": "./",
"moduleResolution": "node",
"paths": {
"@/*": [
"src/*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
}
}

@ -0,0 +1,85 @@
{
"name": "fu-hsi-web",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"@riophae/vue-treeselect": "0.4.0",
"@vue/composition-api": "1.7.1",
"axios": "1.6.0",
"core-js": "3.30.1",
"countup.js": "^2.8.0",
"crypto-js": "4.2.0",
"docx-preview": "^0.3.2",
"echarts": "5.4.2",
"element-ui": "2.15.13",
"exceljs": "4.3.0",
"file-saver": "2.0.5",
"js-md5": "0.7.3",
"jszip": "3.10.1",
"moment": "2.29.4",
"node-polyfill-webpack-plugin": "2.0.1",
"nprogress": "0.2.0",
"qs": "6.11.1",
"screenfull": "6.0.2",
"vue": "2.6.14",
"vue-avatar": "2.3.3",
"vue-countup-v2": "^4.0.0",
"vue-echarts": "6.5.5",
"vue-router": "3.6.5",
"vuedraggable": "2.24.3",
"vuex": "3.6.2",
"vxe-table": "3.6.13",
"vxe-table-plugin-element": "3.0.6",
"vxe-table-plugin-export-xlsx": "2.2.2",
"xe-utils": "3.5.7",
"xgplayer": "^3.0.18",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@babel/core": "7.21.4",
"@babel/eslint-parser": "7.21.3",
"@vue/cli-plugin-babel": "5.0.8",
"@vue/cli-plugin-eslint": "5.0.8",
"@vue/cli-plugin-vuex": "5.0.8",
"@vue/cli-service": "5.0.8",
"@vue/eslint-config-standard": "6.1.0",
"ace-builds": "^1.17.0",
"babel-eslint": "10.1.0",
"compression-webpack-plugin": "10.0.0",
"dayjs": "1.11.7",
"eslint": "6.8.0",
"eslint-plugin-vue": "6.2.2",
"image-webpack-loader": "^8.1.0",
"lodash": "4.17.21",
"sass": "1.62.0",
"sass-loader": "12.6.0",
"svg-sprite-loader": "6.0.11",
"vue-template-compiler": "2.6.14",
"webpack-cli": "5.0.2",
"webpackbar": "5.0.2"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<meta name="referrer" content="no-referrer" />
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong
>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work
properly without JavaScript enabled. Please enable it to
continue.</strong
>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

Binary file not shown.

@ -0,0 +1,34 @@
<template>
<div id="app">
<router-view />
</div>
</template>
<script>
import { debounce } from '@/utils/index'
export default {
name: 'App',
mounted() {
if (this._isMobile()) {
// alert('')
this.$router.replace('/to-pc')
}
// ResizeObserver
const _ResizeObserver = window.ResizeObserver
window.ResizeObserver = class ResizeObserver extends _ResizeObserver {
constructor(callback) {
callback = debounce(callback, 16)
super(callback)
}
}
},
methods: {
_isMobile() {
const flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)
return flag
}
}
}
</script>
<style lang="scss">
</style>

@ -0,0 +1,32 @@
/**
* @description: 原子指标相关接口
* @fileName: index
* @author: 17076
* @date: 2024/7/5-下午7:25
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
/** 查看原子指标列表 */
export function queryAtomicIndex(data, page, size) {
return request({
url: `${routes.modelIndex}/selectAllAtomic?page=${page}&size=${size}`,
method: 'post',
data
})
}
/** 删除原子指标 */
export function delAtomicIndex(id) {
return request({
url: `${routes.modelIndex}/delAtomic?id=${id}`,
method: 'post'
})
}
/** 新增/编辑原子指标 */
export function addOrUpdAtomicIndex(data) {
return request({
url: `${routes.modelIndex}/addOrUpdAtomic`,
method: 'post',
data
})
}

@ -0,0 +1,50 @@
/**
* @description:
* @fileName: menu
* @author: xsz
* @date: 2022/9/30-10:36
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
// 查询菜单列表
export function getSysMenu(data) {
return request({
url: `${routes.auth}/sysMenu`,
method: 'get',
params: data
})
}
// 添加菜单信息
export function addSysMenu(data) {
return request({
url: `${routes.auth}/sysMenu`,
method: 'post',
data
})
}
// 修改菜单信息
export function chgSysMenu(data) {
return request({
url: `${routes.auth}/sysMenu/upd`,
method: 'post',
data
})
}
// 查询菜单列表(id,title)
export function getSysMenuOption() {
return request({
url: `${routes.auth}/sysMenu/option`,
method: 'get'
})
}
// 删除菜单
export function delSysMenu(data) {
return request({
url: `${routes.auth}/sysMenu/del`,
method: 'post',
params: data
})
}

@ -0,0 +1,49 @@
/**
* @description: 角色相关接口
* @fileName: user
* @author: xsz
* @date: 2022/9/20-13:46
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
/**
* 查询角色列表
*/
export function getRoleList(params) {
return request({
url: `${routes.auth}/sysRole`,
method: 'get',
params
})
}
/**
* 查询角色option
*/
export function getRoleOption() {
return request({
url: `${routes.auth}/sysRole/option`,
method: 'get'
})
}
/**
* 修改-新增角色信息
*/
export function putAddRoleInfo(data) {
return request({
url: `${routes.auth}/sysRole/save`,
method: 'post',
data
})
}
/**
* 删除角色
*/
export function delRole(id) {
return request({
url: `${routes.auth}/sysRole/del`,
method: 'post',
params: { id: id }
})
}

@ -0,0 +1,26 @@
/**
* @description: 单位相关
* @fileName: unit
* @author: luhuixu
* @date: 2023/6/6-13:10
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '@/api/gateway-routes'
/** 查询单位树 */
export function getUnitInfoTree() {
return request({
url: `${routes.auth}/unitInfo/getUnitInfoTree`,
method: 'get'
})
}
/** 查询一个单位的子级单位 */
export function queryChildrenUnit(unitId) {
return request({
url: `${routes.auth}/unitInfo/queryChildrenUnit`,
method: 'get',
params: { unitId }
})
}

@ -0,0 +1,97 @@
/**
* @description: 用户相关接口
* @fileName: user
* @author: xsz
* @date: 2022/9/20-13:46
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
/** 获取验证码 */
export function getVerifyCode() {
return request({
url: `${routes.auth}/api/user/verifyCode`,
method: 'get'
})
}
/** 登录接口 */
export function login(data) {
return request({
url: `${routes.auth}/api/user/admin/login`,
method: 'post',
params: data
})
}
/** 管理员用户修改密码 */
export function changePassword(params) {
return request({
url: `${routes.auth}/api/user/admin/pass`,
method: 'post',
params
})
}
/** 管理员用户修改个人信息 */
export function changeSelfInfo(data) {
return request({
url: `${routes.auth}/api/user/updateSelfInfo`,
method: 'post',
data
})
}
/** 登录后获取登录用户信息 */
export function getUserInfo() {
return request({
url: `${routes.auth}/api/user/admin/info`,
method: 'post'
})
}
/** 获取权限菜单 */
export function getRouterList() {
return request({
url: `${routes.auth}/api/user/admin/menu`,
method: 'post'
})
}
/** 重置密码 */
export function resetPass(data) {
return request({
url: `${routes.auth}/adminInfo/resetPass`,
method: 'post',
params: data
})
}
/** 检查邮件验证码是否正确 */
export function checkVerificationCode(params) {
return request({
url: `${routes.auth}/api/user/checkVerificationCode`,
method: 'get',
params
})
}
/** 发送找回密码邮件 */
export function sendMail(params) {
return request({
url: `${routes.auth}/api/user/sendMail`,
method: 'get',
params
})
}
/**
* 字典相关
* */
export function queryByType(data) {
return request({
url: `${routes.auth}/comDictionary/queryByType`,
method: 'post',
data
})
}

@ -0,0 +1,100 @@
/**
* @description: 案件详情
* @fileName: index
* @author: 17076
* @date: 2024/7/1-下午5:06
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
import axios from 'axios'
import { baseURL, requestTimeout } from '@/config/net.config'
/** 获取模型分析笔录信息 */
export function queryTripletInfo(data) {
return request({
url: `${routes.record}/getThreeInfo`,
method: 'get',
params: data
})
}
/** 保存入库 */
export function saveTripletInfo(data) {
return request({
url: `${routes.record}/addNeo4j`,
method: 'post',
data
})
}
/** 查询图谱信息 */
export function queryAtlasInfo(data) {
return request({
url: `${routes.neo4j}/getNode`,
method: 'get',
params: data
})
}
/** 获取人员列表 */
export function queryUserList(data) {
return request({
url: `${routes.modelCase}/getPerson`,
method: 'get',
params: data
})
}
/** 新增人员 */
export function addUser(data) {
return request({
url: `${routes.modelCase}/addPerson`,
method: 'post',
data
})
}
/** 上传笔录 */
export function addOrUpdRecords(formData) {
return axios.request({
baseURL,
timeout: requestTimeout,
url: `${routes.record}/addOrUpdRecords`,
method: 'post',
headers: {
'Content-Type': 'multipart/form-data'
},
data: formData
}).then(response => {
return Promise.resolve(response.data)
}).catch(error => {
return Promise.reject(error)
})
}
/** 删除笔录 */
export function delRecords(id) {
return request({
url: `${routes.record}/delRecords?id=${id}`,
method: 'post'
})
}
/** 获取上传笔录列表 */
export function queryRecordList(data, page, size) {
return request({
url: `${routes.record}/queryRecords?page=${page}&size=${size}`,
method: 'post',
data
})
}
/** 查询案件详情 */
export function queryCaseDetails(data) {
return request({
url: `${routes.record}/queryCaseDetails`,
method: 'post',
data
})
}
/** 获取案件指标详情 */
export function queryIndexDetail(data, page, size) {
return request({
url: `${routes.modelCase}/getIndexDetail?page=${page}&size=${size}`,
method: 'post',
params: data
})
}

@ -0,0 +1,67 @@
/**
* @description: 案件管理相关
* @fileName: index
* @author: 17076
* @date: 2024/7/2-下午4:46
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
import axios from 'axios'
import { baseURL, requestTimeout } from '@/config/net.config'
/** 查询案件列表 */
export function queryCaseList(data, page, size) {
return request({
url: `${routes.modelCase}/queryList?page=${page}&size=${size}`,
method: 'post',
data
})
}
/** 新增案件信息 */
export function addCaseInfo(data) {
return request({
url: `${routes.modelCase}/addOrUpd`,
method: 'post',
data
})
}
/** 删除案件信息 */
export function delCaseInfo(id) {
return request({
url: `${routes.modelCase}/del?id=${id}`,
method: 'post'
})
}
/** 检验案件编号是否存在 */
export function checkCaseNo(data) {
return request({
url: `${routes.modelCase}/checkCaseNo`,
method: 'get',
params: data
})
}
/** 导入案件 */
export function uploadCase(data) {
return axios.request({
baseURL,
timeout: requestTimeout,
url: `${routes.modelCase}/uploadCase`,
method: 'post',
headers: {
'Content-Type': 'multipart/form-data'
},
data
}).then(response => {
return Promise.resolve(response.data)
}).catch(error => {
return Promise.reject(error)
})
}
/** 执行模型分析 */
export function executeModelAnalyse(data) {
return request({
url: `${routes.model}/analyseCase`,
method: 'post',
data
})
}

@ -0,0 +1,24 @@
/**
* @Description:各类文件上传地址
* @fileName: upload
* @Author:WXM
* @Date: 2023/05/10 10:53:54
*/
import routes from '../gateway-routes'
import request from '@/utils/request'
/**
* 各类文件上传地址
*/
/** 下载文件 */
export const commonDownloadFile = `${routes.minio}/downloadFile?fileId=`
/** 删除文件 */
export const commonDeleteFile = `${routes.minio}/delFile?fileId=`
/** 删除文件 */
export function deleteFile(id) {
return request({
url: `${commonDeleteFile}${id}`,
method: 'post'
})
}

@ -0,0 +1,17 @@
/**
* @description:
* @fileName: getway
* @author: luhuixu
* @date: 2023/4/24-14:27
* @version: V1.0.0
**/
export default {
auth: '/auth',
minio: '/minio',
comDictionary: '/comDictionary',
model: '/model',
modelCase: '/modelCase',
modelIndex: '/modelIndex',
record: '/record',
neo4j: '/neo4j'
}

@ -0,0 +1,18 @@
/**
* @description: 首页相关
* @fileName: index
* @author: luhuixu
* @date: 2023/6/27-09:17
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '@/api/gateway-routes'
/** 查询首页数据 */
export function queryHome(data) {
return request({
url: `${routes.auth}/home/home`,
method: 'get',
params: data
})
}

@ -0,0 +1,32 @@
/**
* @description: 指标规则相关
* @fileName: index
* @author: 17076
* @date: 2024/7/5-上午9:44
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
/** 查看指标规则列表 */
export function queryIndexData(data, page, size) {
return request({
url: `${routes.modelIndex}/selectAll?page=${page}&size=${size}`,
method: 'post',
data
})
}
/** 删除指标规则 */
export function deleteModelIndex(id) {
return request({
url: `${routes.modelIndex}/del?id=${id}`,
method: 'post'
})
}
/** 新增/编辑指标 */
export function addOrUpdIndex(data) {
return request({
url: `${routes.modelIndex}/addOrUpd`,
method: 'post',
data
})
}

@ -0,0 +1,41 @@
/**
* @description: 提示词模板设置相关接口
* @fileName: index
* @author: 17076
* @date: 2024/6/24-上午9:24
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
/** 获取分类列表 */
export function getChunkClassify(data) {
return request({
url: `${routes.record}/queryType`,
method: 'get',
data
})
}
/** 保存分类列表 */
export function saveChunkClassify(data) {
return request({
url: `${routes.record}/saveType`,
method: 'post',
data
})
}
/** 保存提示词 */
export function addOrUpdPrompt(data) {
return request({
url: `${routes.record}/addOrUpdPrompt`,
method: 'post',
data
})
}
/** 删除提示词 */
export function delPrompt(data) {
return request({
url: `${routes.record}/delPrompt`,
method: 'post',
data
})
}

@ -0,0 +1,112 @@
/**
* @description: 组管理
* @fileName: group
* @author: xsz
* @date: 2023/2/9-13:04
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
/** 查询单位管理表 */
export function getGroupList(page, size, params) {
return request({
url: `${routes.auth}/unitInfo/getUnitInfo?page=${page}&size=${size}`,
method: 'get',
params
})
}
/** 查询单位树 */
export function findAdminInfoList() {
return request({
url: `${routes.auth}/unitInfo/findAdminInfoList`,
method: 'get'
})
}
/** 查询单位树 */
export function getGroupTree() {
return request({
url: `${routes.auth}/unitInfo/getUnitInfoTree`,
method: 'get'
})
}
/** 根据组id查询组成员 */
export function findAdminInfoByUnit(params) {
return request({
url: `${routes.auth}/unitInfo/findAdminInfoByUnit`,
method: 'get',
params
})
}
/** 查询一个单位的子级单位 */
export function getChildrenGroup(params) {
return request({
url: `${routes.auth}/unitInfo/queryChildrenUnit`,
method: 'get',
params
})
}
/** 查询一个单位的子级单位 */
export function getChildrenGroups(params) {
return request({
url: `${routes.auth}/unitInfo/queryChildrenUnit`,
method: 'get',
params
})
}
/** 根据id新增或修改单位管理*/
export function changeGroupInfo(data) {
return request({
url: `${routes.auth}/unitInfo/saveUnit`,
method: 'post',
data
})
}
/** 添加小组成员*/
export function addGroupUser(data) {
return request({
url: `${routes.auth}/unitInfo/moveAdd`,
method: 'post',
params: data
})
}
/** 删除小组成员*/
export function delGroupUser(data) {
return request({
url: `${routes.auth}/unitInfo/moveDelete`,
method: 'post',
params: data
})
}
/** 根据id新增或修改单位管理*/
export function addGroupInfo(data) {
return request({
url: `${routes.auth}/unitInfo/saveUnit`,
method: 'post',
data
})
}
/** 删除单位管理表表中信息*/
export function deleteGroupInfo(params) {
return request({
url: `${routes.auth}/unitInfo/deleteUnit`,
method: 'post',
params
})
}
/** 查询考点*/
export function selectUnit(params) {
return request({
url: `${routes.auth}/unitInfo/selectUnit`,
method: 'get',
params
})
}

@ -0,0 +1,159 @@
/**
* @description: 用户管理
* @fileName: index
* @author: xsz
* @date: 2023/2/9-13:04
* @version: V1.0.0
**/
import request from '@/utils/request'
import routes from '../gateway-routes'
/** 查询管理员列表 三级阅卷人 */
export function getAdminInfo(page, size, params) {
return request({
url: `${routes.auth}/adminInfo/select?page=${page}&size=${size}`,
method: 'get',
params
})
}
/** 创建账号*/
export function createAccount(data) {
return request({
url: `${routes.auth}/adminInfo/createAccounts`,
method: 'post',
params: data
})
}
/** 新增考生账户*/
export function saveExaminee(data) {
return request({
url: `${routes.auth}/adminInfo/saveExaminee`,
method: 'post',
data
})
}
/** 批量导入考生账号*/
export function importExaminee(data) {
return request({
url: `${routes.auth}/adminInfo/upload/excel`,
method: 'post',
data
})
}
/** 修改-新增管理员信息*/
export function changeAdminInfo(data) {
return request({
url: `${routes.auth}/adminInfo/save`,
method: 'post',
data: data
})
}
/** 删除管理员*/
export function deleteAdminInfo(id) {
return request({
url: `${routes.auth}/adminInfo/del`,
method: 'post',
params: { id: id }
})
}
/** 导入用户文件 */
export function importUser(data) {
return request({
url: `${routes.auth}/adminInfo/import`,
method: 'post',
data
})
}
/** 导出用户文件 */
export function exportUser(data) {
return request({
url: `${routes.auth}/adminInfo/exportAdminList`,
method: 'post',
responseType: 'blob',
params: data
})
}
/** 获取操作日志数据*/
export function querySystemLog(data, page, size) {
return request({
url: `${routes.auth}/sysLog/find?page=${page}&size=${size}`,
method: 'get',
params: data
})
}
/** 考生登录记录导出 */
export function exportLastLogin(data) {
return request({
url: `${routes.auth}/sysLog/exportLastLogin`,
method: 'get',
responseType: 'blob',
params: data
})
}
/** 获取字典数据*/
export function queryDictionary(data) {
return request({
url: `${routes.comDictionary}/queryByType`,
method: 'post',
data
})
}
/** 删除字典数据*/
export function deleteDictionary(data) {
return request({
url: `${routes.comDictionary}/del`,
method: 'post',
params: data
})
}
/** 新增字典数据*/
export function addDictionary(data) {
return request({
url: `${routes.comDictionary}/add`,
method: 'post',
data
})
}
/** 修改字典数据*/
export function updateDictionary(data) {
return request({
url: `${routes.comDictionary}/upd`,
method: 'post',
data
})
}
/** 查询个人信息*/
export function queryExamineeInfo(data) {
return request({
url: `${routes.csexam}/info/query`,
method: 'get',
params: data
})
}
/** 导入鉴定点要素 */
export function importChapter(data) {
return request({
url: `${routes.csexam}/qbChapter/importChapter`,
method: 'post',
data
})
}
/** 查询题库字典(无方法) */
export function selectComExceptMethod(data) {
return request({
url: `${routes.auth}/comDictionary/selectComExceptMethod`,
method: 'get',
data
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 801 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

@ -0,0 +1,237 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
This is a custom SVG webfont generated by Font Squirrel.
</metadata>
<defs>
<font id="webfontrOia6SZf" horiz-adv-x="743" >
<font-face units-per-em="1000" ascent="800" descent="-200" />
<missing-glyph horiz-adv-x="435" />
<glyph unicode=" " horiz-adv-x="435" />
<glyph unicode="&#x09;" horiz-adv-x="435" />
<glyph unicode="&#xa0;" horiz-adv-x="435" />
<glyph unicode="!" horiz-adv-x="255" d="M194 212l-129 65v357l129 86v-508zM194 0h-129v155h129v-155z" />
<glyph unicode="&#x22;" horiz-adv-x="429" d="M356 720l-30 -225h-95l30 225h95zM200 720l-30 -225h-95l30 225h95z" />
<glyph unicode="#" horiz-adv-x="875" d="M801 491l-15 -45h-172l-54 -172h172l-15 -45h-172l-68 -213h-67l67 213h-162l-67 -213h-68l68 213h-173l15 45h173l54 172h-173l14 45h174l66 213h67l-66 -213h162l66 213h68l-66 -213h172zM546 446h-162l-54 -172h162z" />
<glyph unicode="$" d="M441 736l-67 -41l-62 41v66l63 43l66 -40v-69zM618 720l-51 -86h-349l-62 44l62 42h84l73 -49l77 49h166zM680 101l-65 -43l-64 43v205l129 43v-248zM651 360l-121 -40h-314l-121 40l121 47h314zM194 421l-129 -50v248l64 43l65 -43v-198zM597 45l-63 -45h-78l-81 47 l-73 -47h-227l141 86h317zM441 -84l-64 -36l-66 41v68l64 35l66 -36v-72z" />
<glyph unicode="%" horiz-adv-x="1362" d="M1085 720l-345 -379l-72 87l265 292h152zM1331 104l-66 -43l-63 43v169l61 44l68 -43v-170zM1244 329l-66 -47h-257l-66 46l66 41h258zM509 675l-65 -41h-258l-64 41l64 45h260zM596 451l-66 -44l-63 43v170l63 43l66 -42v-170zM902 103l-66 -43l-68 44v169l68 43l66 -43 v-170zM1244 45l-65 -45h-259l-65 45l66 41h257zM509 392l-65 -39h-258l-66 39l68 46h256zM167 450l-66 -43l-68 43v170l68 42l66 -43v-169zM722 320l-291 -320h-152l293 320h150z" />
<glyph unicode="&#x26;" horiz-adv-x="861" d="M596 676l-66 -42h-314l-66 42l66 44h314zM686 420l-68 -47l-63 48v91l65 45l66 -45v-92zM896 360l-108 -40h-81l-66 39l69 48h61zM599 360l-66 -40h-111l-129 41l109 46h131zM684 100l-67 -41l-63 42v204l64 40l66 -41v-204zM194 421l-129 -50v248l64 43l65 -43v-198z M194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="'" horiz-adv-x="273" d="M200 720l-30 -225h-95l30 225h95z" />
<glyph unicode="(" horiz-adv-x="402" d="M383 720l-96 -86h-71l-66 42l66 44h167zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM383 0h-167l-66 44l66 42h71z" />
<glyph unicode=")" horiz-adv-x="402" d="M255 676l-66 -42h-70l-98 86h168zM339 371l-129 43v205l65 43l64 -43v-248zM339 101l-64 -43l-65 43v198l129 50v-248zM255 44l-66 -44h-168l98 86h70z" />
<glyph unicode="*" horiz-adv-x="600" d="M369 583l-66 -32l-66 34v130l66 33l66 -34v-131zM570 442l-66 -26l-186 69v51l62 24l180 -66zM284 486l-176 -70l-75 21l9 55l183 71l59 -29v-48z" />
<glyph unicode="+" horiz-adv-x="744" d="M683 403l-59 -86h-166l-59 43l63 43h221zM435 418l-63 -44l-67 45v107l130 39v-147zM353 361l-69 -44h-221l60 86h162zM435 195l-129 -39v146l66 44l63 -44v-107z" />
<glyph unicode="," horiz-adv-x="215" d="M183 155l-70 -249h-134l71 249h133z" />
<glyph unicode="-" horiz-adv-x="513" d="M482 302l-87 -86h-362l87 86h362z" />
<glyph unicode="." horiz-adv-x="194" d="M162 0h-129v155h129v-155z" />
<glyph unicode="/" horiz-adv-x="870" d="M839 720l-345 -379l-74 87l266 292h153zM474 320l-289 -320h-152l291 320h150z" />
<glyph unicode="0" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="1" d="M437 371l-129 50v213l129 86v-349zM437 0l-129 86v220l129 43v-349z" />
<glyph unicode="2" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-465l151 86h314zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0h-464l-66 44l66 42h341zM194 101l-65 -43l-64 43v248l129 -43v-205z" />
<glyph unicode="3" d="M626 371l-129 50v198l64 43l65 -43v-248zM542 676l-66 -42h-314l-124 86h438zM626 101l-65 -43l-64 43v205l129 43v-248zM597 360l-121 -40h-314l-121 40l121 47h314zM542 44l-66 -44h-438l124 86h314z" />
<glyph unicode="4" d="M680 371l-129 50v213l129 86v-349zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349z" />
<glyph unicode="5" d="M653 720l-123 -86h-314l-66 42l66 44h437zM680 101l-65 -43l-64 43v205l129 43v-248zM651 360l-121 -40h-314l-121 40l121 47h314zM194 421l-129 -50v248l64 43l65 -43v-198zM596 44l-66 -44h-465l124 86h341z" />
<glyph unicode="6" d="M653 720l-123 -86h-314l-66 42l66 44h437zM680 101l-65 -43l-64 43v205l129 43v-248zM651 360l-121 -40h-314l-121 40l121 47h314zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="7" d="M594 371l-129 50v198l129 87v-335zM573 720l-130 -86h-314l-129 86h573zM594 0l-129 86v220l129 43v-349z" />
<glyph unicode="8" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM651 360l-121 -40h-314l-121 40l121 47h314zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44 l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="9" d="M680 371l-129 43v205l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v198l129 50v-248zM651 360l-121 -40h-314l-121 40l121 47h314zM194 414l-129 -43v248l64 43l65 -43v-205zM596 44l-66 -44h-438l124 86h314z" />
<glyph unicode=":" horiz-adv-x="204" d="M173 320h-129v148h129v-148zM173 0h-129v155h129v-155z" />
<glyph unicode=";" horiz-adv-x="215" d="M177 320h-129v148h129v-148zM183 155l-70 -249h-134l71 249h133z" />
<glyph unicode="&#x3c;" horiz-adv-x="780" d="M707 122l-632 238l632 238v-71l-455 -167l455 -167v-71z" />
<glyph unicode="=" d="M680 473l-63 -86h-552l63 86h552zM680 336l-63 -87h-552l63 87h552z" />
<glyph unicode="&#x3e;" horiz-adv-x="780" d="M707 360l-632 -238v71l455 167l-455 167v71z" />
<glyph unicode="?" horiz-adv-x="627" d="M479 676l-66 -42h-314l-66 42l66 44h314zM564 371l-130 50v198l64 43l66 -43v-248zM534 362l-121 -42h-92l-130 87h222zM294 203h-129v190l129 -83v-107zM294 0h-130v155h130v-155z" />
<glyph unicode="@" horiz-adv-x="1160" d="M830 145q-6 -1 -12 -1h-12q-58 0 -96 26q-33 22 -33 52q0 4 1 8q-16 -36 -61.5 -55t-98.5 -19q-75 0 -124 45q-55 51 -55 141q13 104 100 177q81 68 169 68q45 0 82 -16.5t51 -43.5l15 59h72l-67 -217l-16 -52q-9 -30 -9 -48q0 -28 17 -52q11 -15 27.5 -23.5t37.5 -8.5 q10 0 21 3q59 15 107 69q62 70 62 169q0 118 -107 189.5t-275 71.5q-176 0 -311 -92q-142 -97 -142 -234q0 -127 131.5 -229t303.5 -102q111 0 222 38t178 98l33 -31q-89 -75 -198.5 -111.5t-234.5 -36.5q-222 0 -371.5 106.5t-149.5 267.5q0 157 182 268q171 104 379 104 q188 0 307 -86t119 -217q0 -105 -75 -191t-169 -94zM708 426q6 26 6 44q0 46 -34 65q-25 14 -72 14q-57 0 -119 -72q-66 -77 -66 -165q0 -64 25 -92q22 -25 70 -25q50 0 79 17q36 21 71 84q6 14 24 75q5 19 16 55z" />
<glyph unicode="A" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="B" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-130 86h444zM194 421l-129 -50v335l129 -87v-198zM680 101l-65 -43l-64 43v205l129 43v-248zM651 360l-121 -40h-314l-121 40l121 47h314zM194 101l-129 -87v335l129 -43v-205zM596 44l-66 -44h-444 l130 86h314z" />
<glyph unicode="C" horiz-adv-x="668" d="M659 720l-129 -86h-314l-66 42l66 44h443zM194 414l-129 -43v248l64 43l65 -43v-205zM659 0h-443l-66 44l66 42h314zM194 101l-65 -43l-64 43v248l129 -50v-198z" />
<glyph unicode="D" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-130 86h444zM194 421l-129 -50v335l129 -87v-198zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-129 -87v335l129 -43v-205zM596 44l-66 -44h-444l130 86h314z" />
<glyph unicode="E" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205z" />
<glyph unicode="F" horiz-adv-x="657" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="G" d="M653 720l-123 -86h-314l-66 42l66 44h437zM651 360l-121 -40h-120l-122 40l122 47h120zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="H" d="M680 371l-129 50v213l129 86v-349zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="I" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349z" />
<glyph unicode="J" d="M680 371l-129 50v213l129 86v-349zM680 14l-129 87v205l129 43v-335zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205z" />
<glyph unicode="K" d="M680 661l-368 -237h-91v62l364 234h95v-59zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="L" horiz-adv-x="720" d="M194 421l-129 -50v349l129 -86v-213zM680 14l-129 87v205l129 43v-335zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205z" />
<glyph unicode="M" horiz-adv-x="1230" d="M1166 371l-129 50v198l129 86v-334zM1145 720l-131 -86h-313l-86 56l-85 -56h-317l-127 86h1059zM680 398l-65 -33l-64 33v223l64 44l65 -46v-221zM1166 0l-129 86v220l129 43v-349zM194 421l-129 -50v335l129 -87v-198zM680 72l-65 -72l-64 72v238l64 39l65 -39v-238z M194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="N" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="O" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="P" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-130 86h444zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="Q" horiz-adv-x="746" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM683 -128l-335 214h179l156 -98v-116zM194 101l-65 -43l-64 43v248l129 -43v-205zM441 0h-225 l-64 47l64 39h92z" />
<glyph unicode="R" horiz-adv-x="746" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-130 86h444zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM774 -1l-225 101l-156 206h146zM194 101l-129 -87v335l129 -43v-205z" />
<glyph unicode="S" d="M680 720l-140 -86h-324l-66 42l66 44h464zM680 101l-65 -43l-64 43v205l129 43v-248zM651 360l-121 -40h-314l-121 40l121 47h314zM194 421l-129 -50v248l64 43l65 -43v-198zM596 44l-66 -44h-465l141 86h324z" />
<glyph unicode="T" horiz-adv-x="615" d="M627 720l-103 -86h-140l-73 50l-78 -50h-141l-103 86h638zM374 404l-65 -42l-66 42v212l66 47l65 -47v-212zM374 47l-66 -47l-66 47v258l67 46l65 -46v-258z" />
<glyph unicode="U" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="V" horiz-adv-x="746" d="M680 371l-129 50v198l129 87v-335zM194 421l-129 -50v335l129 -87v-198zM683 358l-293 -358v180l123 149zM357 -1l-292 360l169 -30l123 -149v-181z" />
<glyph unicode="W" horiz-adv-x="1230" d="M1167 371l-130 43v220l130 86v-349zM681 410l-66 -39l-64 39v238l64 72l66 -72v-238zM1167 99l-61 -42l-68 42v200l129 53v-253zM195 414l-130 -43v349l130 -86v-220zM681 99l-64 -44l-66 46v221l64 33l66 -33v-223zM1083 43l-64 -43h-804l-63 41l64 45h314l85 -58l87 58 h315zM194 99l-65 -43l-64 43v253l129 -54v-199z" />
<glyph unicode="X" horiz-adv-x="654" d="M623 649l-212 -279h-67v100l189 250h90v-71zM314 370h-68l-213 282v68h93l188 -250v-100zM623 0h-93l-186 248v102h67l212 -279v-71zM314 248l-189 -248h-92v73l213 277h68v-102z" />
<glyph unicode="Y" d="M680 371l-129 50v213l129 86v-349zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM441 50l-69 -50l-63 50v251h132v-251z" />
<glyph unicode="Z" horiz-adv-x="633" d="M624 720l-231 -355l-84 91l174 264h141zM455 720l-56 -86h-235l-129 86h420zM384 350l-232 -350h-141l220 330zM599 0h-422l63 86h228z" />
<glyph unicode="[" horiz-adv-x="398" d="M389 720l-129 -86h-44l-130 86h303zM194 421l-129 -50v335l129 -87v-198zM194 101l-129 -87v335l129 -43v-205zM389 0h-303l130 86h44z" />
<glyph unicode="\" horiz-adv-x="432" d="M359 0h-95l-189 720h95z" />
<glyph unicode="]" horiz-adv-x="398" d="M314 720l-131 -86h-43l-129 86h303zM335 371l-129 43v205l129 87v-335zM335 14l-129 87v198l129 50v-335zM314 0h-303l129 86h43z" />
<glyph unicode="^" horiz-adv-x="863" d="M791 174h-108l-251 303l-249 -303h-108l357 421z" />
<glyph unicode="_" horiz-adv-x="689" d="M615 -27h-540v27h540v-27z" />
<glyph unicode="`" horiz-adv-x="237" d="M239 362h-141l-98 144h141z" />
<glyph unicode="a" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="b" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-130 86h444zM194 421l-129 -50v335l129 -87v-198zM680 101l-65 -43l-64 43v205l129 43v-248zM651 360l-121 -40h-314l-121 40l121 47h314zM194 101l-129 -87v335l129 -43v-205zM596 44l-66 -44h-444 l130 86h314z" />
<glyph unicode="c" horiz-adv-x="668" d="M659 720l-129 -86h-314l-66 42l66 44h443zM194 414l-129 -43v248l64 43l65 -43v-205zM659 0h-443l-66 44l66 42h314zM194 101l-65 -43l-64 43v248l129 -50v-198z" />
<glyph unicode="d" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-130 86h444zM194 421l-129 -50v335l129 -87v-198zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-129 -87v335l129 -43v-205zM596 44l-66 -44h-444l130 86h314z" />
<glyph unicode="e" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205z" />
<glyph unicode="f" horiz-adv-x="657" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="g" d="M653 720l-123 -86h-314l-66 42l66 44h437zM651 360l-121 -40h-120l-122 40l122 47h120zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="h" d="M680 371l-129 50v213l129 86v-349zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="i" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349z" />
<glyph unicode="j" d="M680 371l-129 50v213l129 86v-349zM680 14l-129 87v205l129 43v-335zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205z" />
<glyph unicode="k" d="M680 661l-368 -237h-91v62l364 234h95v-59zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="l" horiz-adv-x="720" d="M194 421l-129 -50v349l129 -86v-213zM680 14l-129 87v205l129 43v-335zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205z" />
<glyph unicode="m" horiz-adv-x="1230" d="M1166 371l-129 50v198l129 86v-334zM1145 720l-131 -86h-313l-86 56l-85 -56h-317l-127 86h1059zM680 398l-65 -33l-64 33v223l64 44l65 -46v-221zM1166 0l-129 86v220l129 43v-349zM194 421l-129 -50v335l129 -87v-198zM680 72l-65 -72l-64 72v238l64 39l65 -39v-238z M194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="n" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="o" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="p" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-130 86h444zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM194 86l-129 -86v349l129 -43v-220z" />
<glyph unicode="q" horiz-adv-x="746" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM683 -128l-335 214h179l156 -98v-116zM194 101l-65 -43l-64 43v248l129 -43v-205zM441 0h-225 l-64 47l64 39h92z" />
<glyph unicode="r" horiz-adv-x="746" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-130 86h444zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM774 -1l-225 101l-156 206h146zM194 101l-129 -87v335l129 -43v-205z" />
<glyph unicode="s" d="M680 720l-140 -86h-324l-66 42l66 44h464zM680 101l-65 -43l-64 43v205l129 43v-248zM651 360l-121 -40h-314l-121 40l121 47h314zM194 421l-129 -50v248l64 43l65 -43v-198zM596 44l-66 -44h-465l141 86h324z" />
<glyph unicode="t" horiz-adv-x="615" d="M627 720l-103 -86h-140l-73 50l-78 -50h-141l-103 86h638zM374 404l-65 -42l-66 42v212l66 47l65 -47v-212zM374 47l-66 -47l-66 47v258l67 46l65 -46v-258z" />
<glyph unicode="u" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="v" horiz-adv-x="746" d="M680 371l-129 50v198l129 87v-335zM194 421l-129 -50v335l129 -87v-198zM683 358l-293 -358v180l123 149zM357 -1l-292 360l169 -30l123 -149v-181z" />
<glyph unicode="w" horiz-adv-x="1230" d="M1167 371l-130 43v220l130 86v-349zM681 410l-66 -39l-64 39v238l64 72l66 -72v-238zM1167 99l-61 -42l-68 42v200l129 53v-253zM195 414l-130 -43v349l130 -86v-220zM681 99l-64 -44l-66 46v221l64 33l66 -33v-223zM1083 43l-64 -43h-804l-63 41l64 45h314l85 -58l87 58 h315zM194 99l-65 -43l-64 43v253l129 -54v-199z" />
<glyph unicode="x" horiz-adv-x="654" d="M623 649l-212 -279h-67v100l189 250h90v-71zM314 370h-68l-213 282v68h93l188 -250v-100zM623 0h-93l-186 248v102h67l212 -279v-71zM314 248l-189 -248h-92v73l213 277h68v-102z" />
<glyph unicode="y" d="M680 371l-129 50v213l129 86v-349zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM441 50l-69 -50l-63 50v251h132v-251z" />
<glyph unicode="z" horiz-adv-x="633" d="M624 720l-231 -355l-84 91l174 264h141zM455 720l-56 -86h-235l-129 86h420zM384 350l-232 -350h-141l220 330zM599 0h-422l63 86h228z" />
<glyph unicode="{" horiz-adv-x="455" d="M381 -112h-96q-117 0 -117 66v335q0 48 -58 65q-17 6 -35 6q41 0 67 20t26 51v335q0 66 117 66h96v-37h-16q-53 0 -71 -12t-18 -49v-296q0 -31 -28.5 -54.5t-71.5 -23.5q43 0 71.5 -23t28.5 -55v-296q0 -37 17 -49t72 -12h16v-37z" />
<glyph unicode="|" horiz-adv-x="243" d="M170 0h-95v720h95v-720z" />
<glyph unicode="}" horiz-adv-x="455" d="M381 360q-19 0 -34 -6q-59 -18 -59 -65v-335q0 -66 -115 -66h-98v37h17q54 0 71 12t17 49v296q0 31 29.5 54.5t72.5 23.5q-8 0 -18 1.5t-21 5.5q-63 21 -63 71v296q0 38 -16.5 49.5t-71.5 11.5h-17v37h98q115 0 115 -66v-335q0 -23 15.5 -40t43.5 -25q15 -6 34 -6z" />
<glyph unicode="~" horiz-adv-x="687" d="M614 402q-6 -53 -42 -81t-95 -28q-19 0 -40 3t-47 10l-115 32l-20 4q-29 6 -48 6q-24 0 -36 -10t-19 -36l-2 -10h-75v17q6 53 42 81t95 28q19 0 40 -3t47 -10l115 -32l18 -5q29 -6 48 -6q25 0 37.5 10.5t19.5 36.5l2 9h75v-16z" />
<glyph unicode="&#xa1;" horiz-adv-x="255" d="M194 565h-129v155h129v-155zM194 86l-129 -86v508l129 -65v-357z" />
<glyph unicode="&#xa2;" horiz-adv-x="696" d="M434 736l-69 -47l-62 47v72l63 47l68 -50v-69zM665 720l-129 -86h-318l-62 41l63 45h74l73 -53l80 53h219zM194 414l-129 -43v248l64 43l65 -43v-205zM663 0h-223l-77 57l-76 -57h-71l-63 42l65 44h316zM194 101l-65 -43l-64 43v248l129 -50v-198zM429 -84l-64 -57 l-68 55v72l66 43l66 -44v-69z" />
<glyph unicode="&#xa3;" horiz-adv-x="801" d="M770 720l-131 -86h-313l-65 42l65 44h444zM306 413l-67 -40l-63 42v204l66 45l64 -45v-206zM573 358l-64 -38h-182l-66 38l69 49h179zM221 358l-71 -38h-118l-65 39l68 48h112zM770 0h-593l149 86h313zM305 102l-132 -72v271l69 40l63 -40v-199z" />
<glyph unicode="&#xa4;" horiz-adv-x="683" d="M609 505l-94 -60q40 -37 40 -83q0 -47 -42 -86l95 -63l-11 -8l-10 -7l-26 -15l-93 63q-55 -28 -126 -28q-72 0 -126 29l-97 -63q-12 5 -23 13t-21 17l96 63q-43 37 -43 84t42 83l-93 60l19 17l12 8l11 7l96 -62q56 28 128 28q71 0 127 -28l93 63q25 -12 46 -32zM443 292 q43 28 43 68t-43 68q-21 14 -46.5 21t-54.5 7q-58 0 -101.5 -28.5t-43.5 -67.5t43 -68q20 -14 46.5 -21t55.5 -7q60 0 101 28z" />
<glyph unicode="&#xa5;" horiz-adv-x="762" d="M683 371l-129 50v213l129 86v-349zM731 253l-30 -26h-213v59h217zM197 421l-129 -50v349l129 -86v-213zM653 360l-122 -40h-313l-122 40l122 47h313zM731 158l-32 -29h-211v60h213zM444 50l-69 -50l-63 50v251h132v-251zM279 226h-214l-32 28l36 32h210v-60zM279 128 h-217l-27 27l28 32h216v-59z" />
<glyph unicode="&#xa6;" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349z" />
<glyph unicode="&#xa7;" horiz-adv-x="734" d="M671 469l-66 -43l-63 43v151l61 43l68 -42v-152zM584 675l-66 -41h-300l-65 41l65 45h301zM584 409l-74 -47h-280l-77 47l54 40h324zM671 150l-66 -43l-63 43v198l61 43l68 -42v-199zM198 149l-66 -43l-67 44v198l67 43l66 -43v-199zM584 86l-54 -34h-324l-54 34l78 51 h277zM584 -181l-65 -38h-301l-66 38l67 47h299zM198 -122l-66 -43l-67 43v150l67 42l66 -43v-149z" />
<glyph unicode="&#xa8;" horiz-adv-x="368" d="M369 761h-129v130h129v-130zM129 761h-129v130h129v-130z" />
<glyph unicode="&#xa9;" horiz-adv-x="1292" d="M1197 363q0 -154 -163 -263t-395 -109q-230 0 -394 109t-164 263t163.5 263t394.5 109q230 0 394 -109t164 -263zM1134 363q0 136 -145 233t-350 97q-206 0 -350.5 -96t-144.5 -234q0 -136 145 -233t350 -97q206 0 350.5 96t144.5 234zM795 578l-81 -55h-201l-42 27 l42 28h282zM498 382l-81 -27v158l41 28l40 -28v-131zM795 117h-282l-42 28l42 28h201zM498 182l-40 -28l-41 28v159l81 -32v-127z" />
<glyph unicode="&#xaa;" horiz-adv-x="663" d="M590 394h-87v76l-5 -8q-22 -34 -73 -55t-113 -21q-45 0 -90 12q-56 16 -93 47.5t-49 76.5q-4 15 -4 35v17q0 3 4 18q18 63 84.5 101t150.5 38q21 0 44 -3q88 -13 132 -64l7 -8l5 -7v71h87v-326zM590 290h-498v54h498v-54zM500 533q5 13 5 25q0 11 -5 26q-9 30 -33.5 51.5 t-60 32.5t-72.5 11q-61 0 -107.5 -27t-58.5 -72l-3 -22q0 -11 1 -15l4 -8q13 -51 72 -77q45 -20 93 -20q51 0 96 21q25 12 44 31.5t25 42.5z" />
<glyph unicode="&#xab;" horiz-adv-x="596" d="M564 468l-153 -223h-139l151 223h141zM327 468l-154 -223h-140l152 223h142zM563 0h-141l-150 221h139zM324 0h-141l-150 221h140z" />
<glyph unicode="&#xac;" horiz-adv-x="1200" d="M1162 -83h-1123v765h1123v-765zM1067 255v18h-16q-21 0 -29 5t-8 27v250q0 10 -0.5 20t-0.5 19q0 24 9.5 31.5t44.5 7.5v18h-160v-18q37 0 45 -7t8 -37v-24v-258q0 -22 -9.5 -28t-29.5 -6h-14v-18h160zM1141 27q0 50 -78 66t-78 50q0 21 15.5 33.5t37.5 12.5 q16 0 31 -7.5t27 -21.5q3 -14 4 -17q1 -6 1 -18l16 -1q0 17 3 37.5t4 31.5q-42 13 -80 13q-44 0 -71 -18q-32 -22 -32 -64q0 -53 77.5 -68t77.5 -51q0 -25 -18 -38.5t-44 -13.5q-42 0 -57 15t-15 56h-16q0 -11 -2 -37.5t-2 -29.5q0 -10 22.5 -16.5t59.5 -6.5q47 0 79 22 q38 26 38 71zM941 184h-86q0 24 1 48.5t4 46.5q28 23 42 44q18 27 18 58q0 88 -115 98t-115 74q0 38 27 59t67 21q19 0 44 -7.5t38 -18.5q5 -11 5 -34v-20h18q0 30 1.5 43t7.5 37q-53 21 -111 21q-62 0 -102 -29q-45 -33 -45 -93q0 -87 115.5 -98t115.5 -75q0 -42 -32 -64 t-76 -22q-26 0 -52 8q-35 11 -42 29l-1 48h-19v-33v-14q0 -20 -3 -40q51 -21 106 -21q27 0 51 6q5 -40 5 -72q-19 -11 -45 -19v-12h45v-157q0 -62 64 -62q8 0 18 2t18 4l27 34l-8 11q-13 -15 -32 -15t-29.5 14t-10.5 53v13v108q8 0 25.5 1t25.5 1q15 0 29 -3zM802 -60v17 q-29 0 -37 5t-8 23q1 20 1 33v92q0 96 -93 96q-25 0 -50 -15t-43 -38q1 18 1 27q0 16 -5 26q-23 -10 -46 -16t-47 -6v-17q11 1 17 1q13 0 21.5 -3.5t8.5 -13.5v-172q0 -11 -5 -17t-21 -6q-14 1 -21 1v-17h144l-1 17q-30 0 -39.5 8.5t-9.5 31.5q0 6 1 23.5t1 29.5v28 q0 46 10 64q16 28 63 28q38 0 53 -23q12 -19 12 -62v-54v-12q0 -44 -4 -79h97zM680 633v18h-119v-18q14 0 32 -2.5t18 -10.5q0 -25 -38 -154l-40 -130l-116 318h-14l-122 -315l-32 138q-16 71 -28 131q-4 6 -3 10q0 10 15 12.5t22 2.5h12v18h-143v-18q26 0 32.5 -6.5 t12.5 -35.5q10 -43 22 -88q28 -105 32 -149q-23 0 -58.5 -32.5t-46.5 -57.5q-4 -10 -5.5 -21t-1.5 -30v-30l-40 -20v-10l40 4l1 -153q0 -32 -8.5 -39.5t-41.5 -7.5v-17h155v17h-17q-19 0 -25 2q-16 6 -16 39l1 160q17 0 35 -0.5t36 -0.5l5 25l-2 2h-74v36v25q0 32 8.5 50 t35.5 18q17 0 29 -9l11 -54h29q27 80 57 156q22 57 65 155q9 -26 58 -154q37 -98 54 -157h30q15 61 54 198q46 160 60 181q7 4 29 4zM487 80q0 56 -36 91t-93 35q-61 0 -102 -36t-41 -97q0 -59 34 -99t92 -40q64 0 105 41t41 105zM434 56q0 -41 -16 -69q-20 -34 -59 -34 q-46 0 -70 49q-19 38 -19 90q0 39 19 68t56 29q48 0 71 -45q18 -35 18 -88z" />
<glyph unicode="&#xad;" horiz-adv-x="447" d="M449 306l-87 -86h-362l87 86h362z" />
<glyph unicode="&#xae;" horiz-adv-x="1292" d="M1197 363q0 -154 -163 -263t-395 -109q-230 0 -394 109t-164 263t163.5 263t394.5 109q230 0 394 -109t164 -263zM1134 363q0 136 -145 233t-350 97q-206 0 -350.5 -96t-144.5 -234q0 -136 145 -233t350 -97q206 0 350.5 96t144.5 234zM828 367l-82 32v126l42 28l40 -28 v-158zM776 562l-44 -27h-199l-84 55h283zM518 399l-83 -32v214l83 -56v-126zM810 360l-78 -26h-199l-78 26l78 30h199zM890 129l-144 64l-101 132h93zM518 194l-83 -56v215l83 -28v-131z" />
<glyph unicode="&#xaf;" horiz-adv-x="447" d="M458 880l-87 -86h-362l87 86h362z" />
<glyph unicode="&#xb0;" horiz-adv-x="548" d="M474 601q0 -55 -58 -94t-141 -39q-82 0 -141 39t-59 94q0 56 58.5 94.5t141.5 38.5q84 0 141.5 -38.5t57.5 -94.5zM410 601q0 38 -39 64t-96 26t-96 -26t-39 -64t39 -64t96 -26t96 26t39 64z" />
<glyph unicode="&#xb1;" horiz-adv-x="822" d="M759 263h-295v-122h-102v122h-296v68h296v122h102v-122h295v-68zM759 19h-693v68h693v-68z" />
<glyph unicode="&#xb2;" horiz-adv-x="371" d="M341 696l-65 25v99l32 21l33 -21v-124zM299 848l-33 -21h-233l75 43h158zM326 690l-60 -20h-158l-60 20l60 24h158zM341 510h-233l-33 22l33 21h171zM98 561l-33 -22l-32 22v124l65 -22v-102z" />
<glyph unicode="&#xb3;" horiz-adv-x="371" d="M332 696l-65 25v99l32 21l33 -21v-124zM290 848l-33 -21h-158l-61 43h219zM332 561l-33 -22l-32 22v102l65 22v-124zM317 690l-60 -20h-158l-60 20l60 24h158zM290 532l-33 -22h-219l61 43h158z" />
<glyph unicode="&#xb4;" horiz-adv-x="237" d="M239 507l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xb6;" horiz-adv-x="792" d="M686 421l-129 -50v335l129 -87v-198zM500 720l-131 -86h-148l-66 42l66 44h279zM521 371l-129 50v198l129 87v-335zM200 421l-129 -50v248l64 43l65 -43v-198zM686 86l-129 -86v349l129 -43v-220zM491 360l-122 -40h-148l-122 40l122 47h148zM521 0l-129 86v220l129 43 v-349z" />
<glyph unicode="&#xb7;" horiz-adv-x="194" d="M162 285h-129v155h129v-155z" />
<glyph unicode="&#x2219;" horiz-adv-x="194" d="M162 285h-129v155h129v-155z" />
<glyph unicode="&#xb8;" horiz-adv-x="276" d="M278 -25l-81 -73h-138l82 73h137z" />
<glyph unicode="&#xb9;" horiz-adv-x="371" d="M219 702l-64 25v106l64 43v-174zM219 516l-64 43v110l64 22v-175z" />
<glyph unicode="&#xba;" horiz-adv-x="665" d="M587 525q-16 -54 -69 -90t-132 -47q-23 -4 -53 -4h-32q-14 3 -20 4q-79 11 -132 47t-69 90q-3 14 -4 17q-1 6 -1 18q0 16 5 34q19 63 89.5 102.5t160.5 39.5q53 0 107 -15q123 -35 150 -127q5 -18 5 -34t-2 -24zM584 290h-500v54h500v-54zM503 560q0 15 -3 23 q-10 44 -58 71t-109 27q-36 0 -69 -10q-46 -14 -73 -44t-27 -67q0 -15 3 -22q9 -38 43.5 -63.5t86.5 -33.5q18 -3 36 -3q70 0 120 34.5t50 87.5z" />
<glyph unicode="&#xbb;" horiz-adv-x="596" d="M564 247h-138l-153 221h143zM327 247h-139l-153 221h142zM564 223l-150 -223h-142l154 223h138zM326 223l-150 -223h-143l155 223h138z" />
<glyph unicode="&#xbc;" horiz-adv-x="935" d="M219 702l-64 25v106l64 43v-174zM219 516l-64 43v110l64 22v-175zM885 195l-64 25v106l64 43v-174zM642 220l-64 -25v174l64 -43v-106zM870 189l-60 -20h-157l-60 20l60 24h157zM885 9l-64 43v110l64 22v-175zM603 720l-204 -379l-43 87l157 292h90zM389 320l-173 -320 h-90l173 320h90z" />
<glyph unicode="&#xbd;" horiz-adv-x="845" d="M786 192l-64 25v99l31 21l33 -21v-124zM744 344l-33 -21h-232l75 43h157zM771 186l-60 -20h-157l-60 20l60 24h157zM786 6h-232l-33 22l33 21h171zM543 57l-33 -22l-31 22v124l64 -22v-102zM219 702l-64 25v106l64 43v-174zM219 516l-64 43v110l64 22v-175zM558 720 l-204 -379l-43 87l157 292h90zM344 320l-173 -320h-90l173 320h90z" />
<glyph unicode="&#xbe;" horiz-adv-x="935" d="M332 696l-65 25v99l32 21l33 -21v-124zM290 848l-33 -21h-158l-61 43h219zM332 561l-33 -22l-32 22v102l65 22v-124zM317 690l-60 -20h-158l-60 20l60 24h158zM290 532l-33 -22h-219l61 43h158zM885 195l-64 25v106l64 43v-174zM642 220l-64 -25v174l64 -43v-106z M870 189l-60 -20h-157l-60 20l60 24h157zM885 9l-64 43v110l64 22v-175zM633 720l-204 -379l-43 87l157 292h90zM419 320l-173 -320h-90l173 320h90z" />
<glyph unicode="&#xbf;" horiz-adv-x="627" d="M464 565h-129v155h129v-155zM464 327l-131 83v107h131v-190zM437 313h-222l-120 45l121 42h90zM194 101l-65 -43l-64 43v248l129 -50v-198zM596 44l-66 -44h-314l-66 44l66 42h314z" />
<glyph unicode="&#xc0;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM408 754h-141l-98 144h141z" />
<glyph unicode="&#xc1;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM531 903l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xc2;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM666 772h-190l-93 59l40 99zM350 831 l-93 -59h-179l236 159z" />
<glyph unicode="&#xc3;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM609 908l-54 -115l-87 107l15 31zM524 781 l-210 43l-90 107l217 -45zM278 812l-15 -31l-125 24l53 115z" />
<glyph unicode="&#xc4;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM549 768h-129v130h129v-130zM309 768h-129 v130h129v-130z" />
<glyph unicode="&#xc5;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM574 825l-59 -37l-51 35v84l51 36l59 -37 v-81zM497 953l-54 -34h-127l-56 34l57 39h125zM497 774l-45 -28h-147l-45 28l66 43h107zM298 823l-54 -35l-59 37v80l59 37l54 -36v-83z" />
<glyph unicode="&#xc6;" horiz-adv-x="1188" d="M1157 720l-129 -86h-323l-82 55l-90 -55h-315l-129 86h1068zM1136 361l-125 -41h-306l-58 44l63 43h306zM683 422l-63 -44l-68 45v198l68 44l63 -44v-199zM197 422l-132 -50v334l132 -87v-197zM1157 0h-575l131 86h316zM599 364l-68 -44h-315l-121 41l123 46h315zM683 93 l-129 -86v299l66 43l63 -43v-213zM195 85l-130 -85v350l130 -45v-220z" />
<glyph unicode="&#xc7;" horiz-adv-x="690" d="M659 720l-129 -86h-314l-66 42l66 44h443zM194 414l-129 -43v248l64 43l65 -43v-205zM659 0h-443l-66 44l66 42h314zM194 101l-65 -43l-64 43v248l129 -50v-198zM455 -25l-87 -73h-138l87 73h138z" />
<glyph unicode="&#xc8;" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205zM401 754h-141l-98 144h141z" />
<glyph unicode="&#xc9;" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205zM540 899l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xca;" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205zM661 772h-190l-93 59l40 99zM345 831l-93 -59h-179l236 159z" />
<glyph unicode="&#xcb;" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205zM552 768h-129v130h129v-130zM312 768h-129v130h129v-130z" />
<glyph unicode="&#xcc;" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349zM204 754h-141l-98 144h141z" />
<glyph unicode="&#xcd;" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349zM294 898l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xce;" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349zM460 770h-190l-93 59l40 99zM144 829l-93 -59h-179l236 159z" />
<glyph unicode="&#xcf;" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349zM332 770h-129v130h129v-130zM92 770h-129v130h129v-130z" />
<glyph unicode="&#xd0;" horiz-adv-x="899" d="M845 371l-129 50v198l64 43l65 -43v-248zM761 676l-66 -42h-314l-130 86h444zM359 421l-129 -50v335l129 -87v-198zM845 101l-65 -43l-64 43v205l129 43v-248zM359 101l-129 -87v335l129 -43v-205zM761 44l-66 -44h-444l130 86h314zM200 403l-63 -86h-148l64 86h147z" />
<glyph unicode="&#xd1;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM615 902l-54 -115l-87 107l15 31zM530 775l-210 43l-90 107l217 -45zM284 806l-15 -31 l-125 24l53 115z" />
<glyph unicode="&#xd2;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM440 752h-141 l-98 144h141z" />
<glyph unicode="&#xd3;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM533 898 l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xd4;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM678 773h-190 l-93 59l40 99zM362 832l-93 -59h-179l236 159z" />
<glyph unicode="&#xd5;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM590 902 l-54 -115l-87 107l15 31zM505 775l-210 43l-90 107l217 -45zM259 806l-15 -31l-125 24l53 115z" />
<glyph unicode="&#xd6;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM552 769h-129 v130h129v-130zM312 769h-129v130h129v-130z" />
<glyph unicode="&#xd7;" horiz-adv-x="744" d="M546 537l50 -88l-119 -78l-87 2v61zM354 431l3 -60h-96l-112 75l49 89zM357 352l-3 -63l-156 -104l-48 89l114 76zM591 274l-49 -89l-155 104v62l90 -2z" />
<glyph unicode="&#xd8;" horiz-adv-x="750" d="M572 694l-51 -60h-300l-65 42l65 44h318zM689 372l-132 49v36l132 149v-234zM681 101l-64 -43l-65 43v205l129 43v-248zM689 649l-558 -649h-66v73l561 647h63v-71zM195 421l-129 -50v248l65 43l64 -43v-198zM198 263l-132 -151v236l132 -41v-44zM597 43l-63 -43h-315 l-36 25l57 61l296 -1z" />
<glyph unicode="&#xd9;" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM430 755h-141l-98 144h141z" />
<glyph unicode="&#xda;" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM546 898l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xdb;" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM668 769h-190l-93 59l40 99zM352 828l-93 -59h-179l236 159z" />
<glyph unicode="&#xdc;" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM549 769h-129v130h129v-130zM309 769h-129v130h129v-130z" />
<glyph unicode="&#xdd;" d="M680 371l-129 50v213l129 86v-349zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM441 50l-69 -50l-63 50v251h132v-251zM544 898l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xde;" horiz-adv-x="1000" />
<glyph unicode="&#xe0;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM438 754h-141l-98 144h141z" />
<glyph unicode="&#xe1;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM546 898l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xe2;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM671 767h-190l-93 59l40 99zM355 826 l-93 -59h-179l236 159z" />
<glyph unicode="&#xe3;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM594 908l-54 -115l-87 107l15 31zM509 781 l-210 43l-90 107l217 -45zM263 812l-15 -31l-125 24l53 115z" />
<glyph unicode="&#xe4;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM549 768h-129v130h129v-130zM309 768h-129 v130h129v-130z" />
<glyph unicode="&#xe5;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM574 825l-59 -37l-51 35v84l51 36l59 -37 v-81zM497 953l-54 -34h-127l-56 34l57 39h125zM497 774l-45 -28h-147l-45 28l66 43h107zM298 823l-54 -35l-59 37v80l59 37l54 -36v-83z" />
<glyph unicode="&#xe6;" horiz-adv-x="1188" d="M1157 720l-129 -86h-323l-82 55l-90 -55h-315l-129 86h1068zM1136 361l-125 -41h-306l-58 44l63 43h306zM683 422l-63 -44l-68 45v198l68 44l63 -44v-199zM197 422l-132 -50v334l132 -87v-197zM1157 0h-575l131 86h316zM599 364l-68 -44h-315l-121 41l123 46h315zM683 93 l-129 -86v299l66 43l63 -43v-213zM195 85l-130 -85v350l130 -45v-220z" />
<glyph unicode="&#xe7;" horiz-adv-x="690" d="M659 720l-129 -86h-314l-66 42l66 44h443zM194 414l-129 -43v248l64 43l65 -43v-205zM659 0h-443l-66 44l66 42h314zM194 101l-65 -43l-64 43v248l129 -50v-198zM455 -25l-87 -73h-138l87 73h138z" />
<glyph unicode="&#xe8;" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205zM401 754h-141l-98 144h141z" />
<glyph unicode="&#xe9;" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205zM530 899l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xea;" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205zM656 772h-190l-93 59l40 99zM340 831l-93 -59h-179l236 159z" />
<glyph unicode="&#xeb;" horiz-adv-x="668" d="M659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM651 360l-121 -40h-314l-121 40l121 47h314zM659 0h-573l130 86h314zM194 101l-129 -87v335l129 -43v-205zM542 768h-129v130h129v-130zM302 768h-129v130h129v-130z" />
<glyph unicode="&#xec;" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349zM204 754h-141l-98 144h141z" />
<glyph unicode="&#xed;" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349zM289 898l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xee;" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349zM440 770h-190l-93 59l40 99zM124 829l-93 -59h-179l236 159z" />
<glyph unicode="&#xef;" horiz-adv-x="255" d="M194 371l-129 50v213l129 86v-349zM194 0l-129 86v220l129 43v-349zM332 770h-129v130h129v-130zM92 770h-129v130h129v-130z" />
<glyph unicode="&#xf0;" horiz-adv-x="899" d="M845 371l-129 50v198l64 43l65 -43v-248zM761 676l-66 -42h-314l-130 86h444zM359 421l-129 -50v335l129 -87v-198zM845 101l-65 -43l-64 43v205l129 43v-248zM359 101l-129 -87v335l129 -43v-205zM761 44l-66 -44h-444l130 86h314zM200 403l-63 -86h-148l64 86h147z" />
<glyph unicode="&#xf1;" d="M680 371l-129 50v198l129 87v-335zM659 720l-129 -86h-314l-130 86h573zM194 421l-129 -50v335l129 -87v-198zM680 0l-129 86v220l129 43v-349zM194 86l-129 -86v349l129 -43v-220zM595 902l-54 -115l-87 107l15 31zM510 775l-210 43l-90 107l217 -45zM264 806l-15 -31 l-125 24l53 115z" />
<glyph unicode="&#xf2;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM440 752h-141 l-98 144h141z" />
<glyph unicode="&#xf3;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM543 898 l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xf4;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM673 773h-190 l-93 59l40 99zM357 832l-93 -59h-179l236 159z" />
<glyph unicode="&#xf5;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM610 892 l-54 -115l-87 107l15 31zM525 765l-210 43l-90 107l217 -45zM279 796l-15 -31l-125 24l53 115z" />
<glyph unicode="&#xf6;" d="M680 371l-129 50v198l64 43l65 -43v-248zM596 676l-66 -42h-314l-66 42l66 44h314zM680 101l-65 -43l-64 43v205l129 43v-248zM194 421l-129 -50v248l64 43l65 -43v-198zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM557 769h-129 v130h129v-130zM317 769h-129v130h129v-130z" />
<glyph unicode="&#xf7;" horiz-adv-x="513" d="M482 302l-87 -86h-362l87 86h362zM326 341h-129v148h129v-148zM326 21h-129v155h129v-155z" />
<glyph unicode="&#xf8;" horiz-adv-x="750" d="M572 694l-51 -60h-300l-65 42l65 44h318zM689 372l-132 49v36l132 149v-234zM681 101l-64 -43l-65 43v205l129 43v-248zM689 649l-558 -649h-66v73l561 647h63v-71zM195 421l-129 -50v248l65 43l64 -43v-198zM198 263l-132 -151v236l132 -41v-44zM597 43l-63 -43h-315 l-36 25l57 61l296 -1z" />
<glyph unicode="&#xf9;" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM440 755h-141l-98 144h141z" />
<glyph unicode="&#xfa;" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM561 898l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xfb;" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM663 769h-190l-93 59l40 99zM347 828l-93 -59h-179l236 159z" />
<glyph unicode="&#xfc;" d="M680 371l-129 50v216l129 83v-349zM194 421l-129 -50v349l129 -83v-216zM680 101l-65 -43l-64 43v205l129 43v-248zM194 101l-65 -43l-64 43v248l129 -43v-205zM596 44l-66 -44h-314l-66 44l66 42h314zM544 769h-129v130h129v-130zM304 769h-129v130h129v-130z" />
<glyph unicode="&#xfd;" d="M680 371l-129 50v213l129 86v-349zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM441 50l-69 -50l-63 50v251h132v-251zM534 898l-99 -144h-140l98 144h141z" />
<glyph unicode="&#xfe;" horiz-adv-x="1000" />
<glyph unicode="&#xff;" d="M680 371l-129 50v213l129 86v-349zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM441 50l-69 -50l-63 50v251h132v-251zM543 770h-129v130h129v-130zM303 770h-129v130h129v-130z" />
<glyph unicode="&#x152;" horiz-adv-x="1193" d="M1161 720l-130 -86h-329l-78 58l-91 -58h-314l-66 45l68 41h940zM1136 361l-125 -41h-306l-58 44l63 43h306zM683 422l-63 -44l-68 45v198l68 44l63 -44v-199zM681 92l-61 -43l-69 44v216l70 44l60 -45v-216zM197 425l-132 -51v249l66 40l66 -41v-197zM1160 0h-945 l-65 36l81 50h299l88 -62l93 62h321zM197 86l-66 -39l-66 39v267l132 -46v-221z" />
<glyph unicode="&#x153;" horiz-adv-x="1193" d="M1161 720l-130 -86h-329l-78 58l-91 -58h-314l-66 45l68 41h940zM1136 361l-125 -41h-306l-58 44l63 43h306zM683 422l-63 -44l-68 45v198l68 44l63 -44v-199zM681 92l-61 -43l-69 44v216l70 44l60 -45v-216zM197 425l-132 -51v249l66 40l66 -41v-197zM1160 0h-945 l-65 36l81 50h299l88 -62l93 62h321zM197 86l-66 -39l-66 39v267l132 -46v-221z" />
<glyph unicode="&#x178;" d="M680 371l-129 50v213l129 86v-349zM194 421l-129 -50v349l129 -86v-213zM651 360l-121 -40h-314l-121 40l121 47h314zM441 50l-69 -50l-63 50v251h132v-251zM568 770h-129v130h129v-130zM328 770h-129v130h129v-130z" />
<glyph unicode="&#x2c6;" horiz-adv-x="585" d="M588 730h-190l-93 59l40 99zM272 789l-93 -59h-179l236 159z" />
<glyph unicode="&#x2da;" d="M575 834l-59 -37l-51 35v84l51 36l59 -37v-81zM498 962l-54 -34h-127l-56 34l57 39h125zM498 783l-45 -28h-147l-45 28l66 43h107zM299 832l-54 -35l-59 37v80l59 37l54 -36v-83z" />
<glyph unicode="&#x2dc;" horiz-adv-x="470" d="M471 869l-54 -115l-87 107l15 31zM386 742l-210 43l-90 107l217 -45zM140 773l-15 -31l-125 24l53 115z" />
<glyph unicode="&#x2000;" horiz-adv-x="500" />
<glyph unicode="&#x2001;" horiz-adv-x="1001" />
<glyph unicode="&#x2002;" horiz-adv-x="500" />
<glyph unicode="&#x2003;" horiz-adv-x="1001" />
<glyph unicode="&#x2004;" horiz-adv-x="333" />
<glyph unicode="&#x2005;" horiz-adv-x="250" />
<glyph unicode="&#x2006;" horiz-adv-x="166" />
<glyph unicode="&#x2007;" horiz-adv-x="166" />
<glyph unicode="&#x2008;" horiz-adv-x="125" />
<glyph unicode="&#x2009;" horiz-adv-x="200" />
<glyph unicode="&#x200a;" horiz-adv-x="55" />
<glyph unicode="&#x2010;" horiz-adv-x="513" d="M482 302l-87 -86h-362l87 86h362z" />
<glyph unicode="&#x2011;" horiz-adv-x="513" d="M482 302l-87 -86h-362l87 86h362z" />
<glyph unicode="&#x2013;" d="M680 403l-63 -86h-552l63 86h552z" />
<glyph unicode="&#x2014;" horiz-adv-x="1328" d="M680 403l-63 -86h-552l63 86h552zM1295 403l-63 -86h-552l63 86h552z" />
<glyph unicode="&#x2018;" horiz-adv-x="270" d="M237 720l-70 -248h-134l71 248h133z" />
<glyph unicode="&#x2019;" horiz-adv-x="270" d="M237 720l-70 -248h-134l71 248h133z" />
<glyph unicode="&#x201a;" horiz-adv-x="215" d="M183 155l-70 -249h-134l71 249h133z" />
<glyph unicode="&#x201c;" horiz-adv-x="495" d="M464 720l-71 -248h-133l70 248h134zM237 720l-70 -248h-134l71 248h133z" />
<glyph unicode="&#x201d;" horiz-adv-x="495" d="M464 720l-71 -248h-133l70 248h134zM237 720l-70 -248h-134l71 248h133z" />
<glyph unicode="&#x201e;" horiz-adv-x="441" d="M410 155l-71 -249h-133l70 249h134zM183 155l-70 -249h-134l71 249h133z" />
<glyph unicode="&#x2022;" horiz-adv-x="548" d="M474 360q0 -55 -58 -94t-141 -39t-141.5 38.5t-58.5 94.5t58.5 94.5t141.5 38.5q84 0 141.5 -38.5t57.5 -94.5z" />
<glyph unicode="&#x2026;" horiz-adv-x="857" d="M797 45q0 -22 -24 -38t-57 -16q-34 0 -57.5 15.5t-23.5 38.5t23.5 38.5t57.5 15.5t57.5 -15t23.5 -39zM510 45q0 -23 -23.5 -38.5t-57.5 -15.5t-57.5 15.5t-23.5 38.5t23.5 38.5t57.5 15.5t57.5 -15.5t23.5 -38.5zM224 45q0 -23 -23.5 -38.5t-57.5 -15.5t-57.5 15.5 t-23.5 38.5t23.5 38.5t57.5 15.5t57.5 -15.5t23.5 -38.5z" />
<glyph unicode="&#x202f;" horiz-adv-x="200" />
<glyph unicode="&#x2039;" horiz-adv-x="360" d="M327 468l-154 -223h-140l152 223h142zM324 0h-141l-150 221h140z" />
<glyph unicode="&#x203a;" horiz-adv-x="360" d="M327 247h-139l-153 221h142zM326 223l-150 -223h-143l155 223h138z" />
<glyph unicode="&#x205f;" horiz-adv-x="250" />
<glyph unicode="&#x2122;" horiz-adv-x="1098" d="M1025 360h-80l-55 214l-3 12l-2 6q-1 8 -1 12q0 10 3 22l-14 -33l-7 -12l-2 -5l-150 -225h-22l-150 225l-3 6l-6 11l-14 33q3 -12 3 -22q-1 -8 -1 -12l-2 -6l-3 -12l-55 -214h-80l107 371h31l161 -239l9 -14l4 -8q3 -7 6 -17.5t3 -18.5q4 29 23 58l162 239h31zM399 673 h-123v-313h-79v313h-122v47h324v-47z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

@ -0,0 +1,381 @@
<!--
* @description: 对话弹窗
* @fileName: index
* @author: 17076
* @date: 2024/6/13-上午11:19
* @version: V1.0.0
-->
<template>
<el-dialog
:visible.sync="dialogVisible"
width="65%"
:show-close="false"
append-to-body
:before-close="handleClose"
>
<template slot="title">
<div class="header">
<div style="color: #FFFFFF">案件信息</div>
<div class="flex-row" style="align-items: center;justify-content: space-between;margin: 10px 0">
<div class="flex-row form-row">
<span>案件名称</span>
<el-input v-model="baseForm['caseName']" placeholder="请输入案件名称" style="flex: 1" />
</div>
<div class="flex-row form-row">
<span>行为人</span>
<el-input v-model="baseForm['caseName']" placeholder="请输入案件名称" style="flex: 1" />
</div>
<div class="config-button">
<el-button type="text" icon="el-icon-check" style="width: 100%" @click="handleConfirm"></el-button>
</div>
</div>
</div>
</template>
<div class="conversation-content">
<el-row>
<el-col :span="16">
<div class="content-left">
<div ref="message" class="left-top" :style="{ height: height + 'px' }">
<div v-if="firstEnter" class="conversation-item">
<div class="flex-row robot-message">
<img src="~@/assets/common/touxiang@2x.png">
<span>
<p class="case-assistant">案件助手</p>
<p style="margin-bottom: 0;margin-top: 5px;font-size: 13px">可输入或选择您要查询的行为人指标名称将自动回复证据指标结果</p>
</span>
</div>
</div>
<div
v-for="(message, index) in conversationList"
:key="index"
class="conversation-item"
:id="'message' + index"
>
<div v-if="message.type === 'user'" class="flex-row user-message">
<img src="~@/assets/avatar/man.png">
<span>{{ message['text'] }}</span>
</div>
<div v-if="message.type === 'robot'" class="flex-row robot-message">
<img src="~@/assets/common/touxiang@2x.png">
<span>
<p>{{ `指标名称:${message['indexName']}` }}</p>
<p>{{ `笔录结果:${message['recordResult']}` }}</p>
<p>{{ `笔录信息:${message['recordInfo']}` }}</p>
<p>{{ `证据:${message['evidence']}` }}</p>
<p>涉及笔录</p>
<div class="flex-column">
<a
v-for="(item, subIndex) in message['recordList']"
:key="subIndex"
>
{{ item.fileName }}
</a>
</div>
</span>
</div>
</div>
</div>
<div class="left-bottom">
<el-input
v-model="caseIndex"
type="textarea"
placeholder="请输入咨询的案件指标......"
:autosize="{ minRows: 2, maxRows: 2 }"
/>
<el-button
type="primary"
icon="el-icon-s-promotion"
:disabled="caseIndex === ''"
@click="handleSend"
>
发送
</el-button>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="content-right">
<div class="right-title">案件指标</div>
<el-tabs v-model="activeTab">
<el-tab-pane
v-for="item in tabs"
:key="item.name"
:label="item.label"
:name="item.name"
>
<div class="index-content" :style="{ height: height + 'px' }">
<div
v-for="subItem in item.list"
:key="subItem.key"
class="index-item"
>
<el-tooltip placement="top" :content="subItem.label">
<span class="etc">{{ subItem.label }}</span>
</el-tooltip>
<div class="ask-button" @click="handelAsk(subItem)"></div>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</el-col>
</el-row>
</div>
</el-dialog>
</template>
<script>
export default {
name: 'Index',
data() {
return {
//
dialogVisible: false,
baseForm: {
caseName: '',
dore: ''
},
// tab
activeTab: '1',
tabs: [
{ label: '共性指标', name: '1', list: [
{ label: '是否有受害人对行为人的辨认笔录?', id: 0 },
{ label: '是否有行为人与受害人签订的协议、合同', id: 1 },
{ label: '是否有被骗财产的产权等级证明(如车辆登记证...', id: 2 },
{ label: '是否有行为人到案方式、违法犯罪证明、前科情...', id: 3 },
{ label: '是否有对被骗财产进行提取、固定的证据(如拍照、扣押、查封等', id: 4 }
] },
{ label: '入罪指标', name: '2', list: [] },
{ label: '出罪指标', name: '3', list: [] }
],
//
caseIndex: '',
//
height: 0,
//
conversationList: [],
//
firstEnter: false
}
},
mounted() {
this.$nextTick(() => {
const _this = this
_this.height = (document.documentElement.clientHeight - 400)
window.onresize = () => {
_this.height = (document.documentElement.clientHeight - 400)
}
})
},
methods: {
//
show() {
this.dialogVisible = true
// 1
setTimeout(() => {
this.firstEnter = true
}, 1000)
},
//
fetchData() {
},
//
handelAsk(item) {
this.conversationList.push({
type: 'user',
text: item.label
})
this.scrollBottom()
this.fetchData()
},
//
handleConfirm() {
},
//
handleSend() {
this.conversationList.push({
type: 'user',
text: this.caseIndex,
recordList: [{ fileName: '裴金禄第1次笔录1.jpg', url: '' }, { fileName: '裴金禄第2次笔录1.jpg', url: '' }]
})
this.scrollBottom()
this.fetchData()
this.caseIndex = ''
},
//
handleClose(done) {
this.firstEnter = false
this.conversationList = []
done()
},
//
scrollBottom() {
this.$nextTick(() => {
//
const index = this.conversationList.length - 1
const element = document.getElementById('message' + index)
element.scrollIntoView({ behavior: 'smooth', block: 'end' })
})
}
}
}
</script>
<style scoped lang="scss">
.header {
background: url("~@/assets/common/beijing@2x.png") center no-repeat;
background-size: 100% 100%;
padding: 20px;
padding-bottom: 10px;
.form-row {
background: #FFFFFF;
align-items: center;
height: 36px;
border-radius: 18px;
padding: 0 10px;
flex: 1;
margin-right: 30px;
span {
font-size: 13px;
color: #333333;
border-right: 1px solid #333333;
padding-right: 10px;
font-weight: 400;
}
}
.config-button {
background: #FFFFFF;
height: 36px;
width: 70px;
line-height: 36px;
border-radius: 5px;
text-align: center;
}
}
.conversation-content {
.content-left {
.left-top {
overflow-y: auto;
overflow-x: hidden;
padding: 20px;
box-sizing: border-box;
.conversation-item {
margin-bottom: 20px;
.case-assistant {
font-weight: 700;
color: $base-color-default;
margin-bottom: 0;
}
}
.conversation-item>div>img {
width: 30px;
height: 30px;
border-radius: 15px;
}
.conversation-item>div>span {
margin-left: 10px;
flex: 1;
line-height: 30px;
}
.user-message {
color: #333333;
}
.robot-message {
color: #333333;
>span {
background: #F2F8FF;
border-radius: 8px;
display: inline-block;
padding: 10px;
p:nth-child(1) {
margin-top: 0;
}
p:nth-child(5) {
margin-bottom: 8px;
}
}
}
}
.left-bottom {
border-top: 1px solid rgba(0, 0, 0, 0.15);
height: 100px;
position: relative;
.el-button {
position: absolute;
bottom: 0;
right: 20px;
}
}
}
.content-right {
border-left: 1px solid rgba(0, 0, 0, 0.15);
padding: 20px;
box-sizing: border-box;
.right-title {
font-weight: bold;
color: #333333;
}
.index-content {
overflow-y: auto;
overflow-x: hidden;
.index-item {
position: relative;
height: 40px;
line-height: 40px;
cursor: pointer;
padding: 0 8px;
box-sizing: border-box;
border-radius: 5px;
>span {
display: inline-block;
width: 100%;
}
&:hover {
background: #F2F6FD;
.ask-button {
display: inline-block;
}
}
.ask-button {
position: absolute;
right: 8px;
bottom: 8px;
top: 8px;
line-height: 24px;
border: 1px solid #999999;
color: #999999;
border-radius: 5px;
padding: 0 10px;
text-align: center;
z-index: 99;
box-shadow: -10px 0 #F2F6FD;
background: #ffffff;
display: none;
cursor: pointer;
}
}
}
}
}
::v-deep {
.el-dialog__header {
padding: 0;
}
.el-input__inner {
border: none !important;
}
.el-dialog {
border-radius: 6px;
}
.el-dialog__body {
padding: 0;
}
.el-textarea__inner {
border: none;
resize: none;
}
}
</style>

@ -0,0 +1,79 @@
<!--
* @description:
* @fileName: index
* @author: luhuixu
* @date: 2023/5/29-12:17
* @version: V1.0.0
-->
<template>
<span :endTime="endTime" :endText="endText">
<slot>{{ content }}</slot>
</span>
</template>
<script>
export default {
name: 'CountDown',
props: { //
endTime: { type: String, default: '' },
endText: { type: String, default: '报名已截止' }
},
data() {
return {
content: '',
timer: null
}
},
watch: { //
endTime() {
this.countdowm(this.endTime)
}
},
mounted() {
this.countdowm(this.endTime)
},
beforeDestroy() {
clearInterval(this.timer)
this.timer = null
},
methods: {
countdowm(timestamp) {
const self = this
if (this.timer) {
clearInterval(this.timer)
}
this.timer = setInterval(function() {
const nowTime = new Date()
const endTime = new Date(timestamp).getTime()
const t = endTime - nowTime.getTime()
if (t > 0) {
const day = Math.floor(t / 86400000)
let hour = Math.floor((t / 3600000) % 24)
let min = Math.floor((t / 60000) % 60)
let sec = Math.floor((t / 1000) % 60)
hour = hour < 10 ? '0' + hour : hour
min = min < 10 ? '0' + min : min
sec = sec < 10 ? '0' + sec : sec
let format = ''
if (day > 0) {
format = `${day}${hour}小时${min}${sec}`
}
if (day <= 0 && hour > 0) {
format = `${hour}小时${min}${sec}`
}
if (day <= 0 && hour <= 0) {
format = `${min}${sec}`
}
self.content = format
} else {
clearInterval(this.timer)
this.timer = null
self.content = self.endText
}
}, 1000)
}
}
}
</script>

@ -0,0 +1,144 @@
<template>
<el-dialog
v-if="dialogOption.show"
:fullscreen="dialogOption.fullscreen"
:width="dialogOption.width"
:top="dialogOption.top"
:append-to-body="dialogOption.appendToBody"
:close-on-click-modal="dialogOption.closeOnClickModal || false"
destroy-on-close
:visible.sync="dialogOption.show"
>
<template #title>
<span>
<dialog-title
:icon="dialogOption.title && dialogOption.title.icon"
:title="dialogOption.title.title"
:is-close="close"
/>
</span>
</template>
<el-scrollbar
:style="{height: dialogOption.height + 'px'}"
class="scroll-container"
:native="false"
:noresize="true"
>
<div
class="dialog-content"
>
<slot name="content" />
</div>
</el-scrollbar>
<span
v-if="!dialogOption.hiddenFooter"
class="dialog-footer"
>
<el-button
size="mini"
@click="close"
plain
type="primary"
style="width: 120px"
> </el-button>
<el-button
size="mini"
type="primary"
@click="submit"
style="width: 120px"
> </el-button>
</span>
</el-dialog>
</template>
<script>
import DialogTitle from './title'
export default {
name: 'Index',
components: {
DialogTitle
},
props: {
dialog: {
type: Object,
default: () => {
return {}
}
}
},
data() {
return {
centerDialogVisible: true,
height: null
}
},
computed: {
dialogOption: {
get() {
return this.dialog
},
set(val) {
this.$emit('update:dialog', val)
}
}
},
mounted() {
this.height = document.body.offsetHeight -
(this.dialogOption.hiddenFooter
? this.dialogOption.fullscreen ? 110 : 250
: this.dialogOption.fullscreen ? 113 : 250)
window.addEventListener('resize', (e) => {
this.height = document.body.offsetHeight -
(this.dialogOption.hiddenFooter
? this.dialogOption.fullscreen
? 63 : 250 : this.dialogOption.fullscreen
? 113 : 250)
})
},
methods: {
close() {
this.$emit('onClose')
this.dialogOption.show = false
},
submit() {
this.$emit('onSubmit', status => {
if (status) this.close()
})
}
}
}
</script>
<style lang="scss" scoped>
.dialog-content {
border-radius: 5px;
padding: 20px;
box-sizing: border-box;
}
::v-deep .el-dialog__header {
padding: 10px;
border-bottom: 1px solid #5B8BFF;
}
::v-deep .el-dialog__body {
padding: 10px 0 0;
}
::v-deep .el-dialog__footer {
padding: 0;
text-align: right;
}
::v-deep .dialog-footer {
//background-color: #eff4f9;
text-align: center;
padding: 10px;
display: block;
border-top: 1px solid #dcdfe6;
}
::v-deep .el-dialog {
background: linear-gradient(to bottom, #E1ECFE, #FFFFFF);
}
.el-dialog__wrapper {
height: 1000px;
}
</style>

@ -0,0 +1,59 @@
<template>
<div class="flex-row" style="align-items: center">
<i v-if="icon.includes('el-icon')" :class="[icon, 'sub-el-icon']" />
<svg-icon v-else :icon-class="icon" />
<i class="border-left"/>
<span v-if="title" slot="title">{{ title }}</span>
<el-button v-if="false" type="primary" class="dialog-close" icon="el-icon-close" @click="isClose" />
</div>
</template>
<script>
export default {
name: 'DialogTitle',
// functional: true,
props: {
icon: {
type: String,
default: ''
},
title: {
type: String,
default: ''
},
isClose: {
type: Function,
default: () => {}
}
}
}
</script>
<style lang="scss" scoped>
.sub-el-icon {
color: $base-color-default;
font-size: 20px;
font-weight: bold;
}
span {
padding-left: 10px;
font-size: 18px;
line-height: 1.67;
font-weight: 600;
color: #242e42;
}
.border-left {
display: inline-block;
width: 5px;
border-radius: 2.5px;
height: 15px;
background: #0052D9;
}
.dialog-close {
position: absolute;
right: 20px;
}
.el-button {
padding: 8px;
box-shadow: 0 8px 16px 0 rgb(35 45 65 / 28%);
}
</style>

@ -0,0 +1,114 @@
<!--
* @description: 自定义抽屉视图
* @fileName: index
* @author: 17076
* @date: 2024/6/13-上午9:10
* @version: V1.0.0
-->
<template>
<el-drawer
:visible.sync="drawerOption['show']"
:append-to-body="drawerOption['appendToBody']"
:show-close="drawerOption['showClose'] || true"
:modal="drawerOption['modal']"
:direction="drawerOption['direction'] || 'rtl'"
:wrapper-closable="drawerOption['wrapperClosable'] || false"
:size="drawerOption['width'] || '35%'"
destroy-on-close
>
<template slot="title">
<span class="title">{{ drawerOption['title'] }}</span>
</template>
<el-scrollbar
:style="{height: drawerOption['height'] || height + 'px'}"
class="scroll-container"
:native="false"
:noresize="true"
>
<div class="drawer-content">
<slot name="content" />
</div>
</el-scrollbar>
<div
v-if="!drawerOption['hiddenFooter']"
class="drawer-footer"
>
<slot name="footer">
<el-button type="primary" plain @click="reset" style="width: 150px"> </el-button>
<el-button type="primary" @click="submit" style="width: 150px"> </el-button>
</slot>
</div>
<div
v-else
class="drawer-footer"
>
<slot name="footer" />
</div>
</el-drawer>
</template>
<script>
export default {
name: 'Index',
props: {
drawerOption: {
type: Object,
default: () => {
return {}
}
}
},
data() {
return {
height: null
}
},
mounted() {
this.height = document.body.offsetHeight -
(this.drawerOption['hiddenFooter'] ? 80 : 130)
window.addEventListener('resize', (e) => {
this.height = document.body.offsetHeight -
(this.drawerOption['hiddenFooter'] ? 80 : 130)
})
},
methods: {
//
reset() {
this.$emit('onReset')
},
//
submit() {
this.$emit('onSubmit', status => {
if (status) this.drawerOption.show = false
})
}
}
}
</script>
<style scoped lang="scss">
.title {
font-weight: bold;
font-size: 18px;
color: #333333;
padding-left: 10px;
border-left: 5px solid #005AA8;
}
.drawer-content {
padding: 20px;
box-sizing: border-box;
}
.drawer-footer {
text-align: right;
padding: 0 20px;
margin-top: 10px;
}
::v-deep {
.el-drawer__header {
border-bottom: 1px solid #E9E9E9;
margin-bottom: 0;
padding-bottom: 20px;
}
}
</style>

@ -0,0 +1,196 @@
<!--
* @description:
* @fileName: bottomBtn
* @author: xsz
* @date: 2023/4/13-10:52
* @version: V1.0.0
-->
<template>
<div class="image-nav-bottom">
<div class="image-nav-bottom__icon-wrap">
<div class="__image_view__nav-bottom-button-block">
<el-tooltip placement="top">
<div slot="content">缩小<br>👇</div>
<div class="__image_view__nav-bottom-icon-button image-viewer__actions__inner">
<i class="el-icon-zoom-out" @click="handleActions('zoomOut')" />
</div>
</el-tooltip>
</div>
<div class="__image_view__nav-bottom-button-block">
<el-tooltip placement="top">
<div slot="content">放大<br>👆</div>
<div class="__image_view__nav-bottom-icon-button image-viewer__actions__inner">
<i class="el-icon-zoom-in" @click="handleActions('zoomIn')" />
</div>
</el-tooltip>
</div>
<div class="__image_view__nav-bottom-icon-button image-viewer__actions__vertical">
<el-divider direction="vertical" />
</div>
<div class="__image_view__nav-bottom-button-block">
<el-tooltip placement="top">
<div slot="content">还原<br>SPACE</div>
<div class="__image_view__nav-bottom-icon-button image-viewer__actions__inner">
<i :class="mode.icon" @click="toggleMode" />
</div>
</el-tooltip>
</div>
<div class="__image_view__nav-bottom-button-block">
<el-tooltip placement="top">
<div slot="content">打印</div>
<div class="__image_view__nav-bottom-icon-button image-viewer__actions__inner">
<i title="打印" class="el-icon-printer" />
</div>
</el-tooltip>
</div>
<div class="__image_view__nav-bottom-button-block">
<el-tooltip placement="top">
<div slot="content">详细信息</div>
<div class="__image_view__nav-bottom-icon-button image-viewer__actions__inner">
<i title="详细信息" class="el-icon-info" @click="handleActions('drawer')" />
</div>
</el-tooltip>
</div>
<div class="__image_view__nav-bottom-icon-button image-viewer__actions__vertical">
<el-divider direction="vertical" />
</div>
<div class="__image_view__nav-bottom-button-block">
<el-tooltip placement="top">
<div slot="content">左转</div>
<div class="__image_view__nav-bottom-icon-button image-viewer__actions__inner">
<i class="el-icon-refresh-left" @click="handleActions('anticlocelise')" />
</div>
</el-tooltip>
</div>
<div class="__image_view__nav-bottom-button-block">
<el-tooltip placement="top">
<div slot="content">右转</div>
<div class="__image_view__nav-bottom-icon-button image-viewer__actions__inner">
<i class="el-icon-refresh-right" @click="handleActions('clocelise')" />
</div>
</el-tooltip>
</div>
</div>
</div>
</template>
<script>
const Mode = {
CONTAIN: {
name: 'contain',
icon: 'el-icon-full-screen'
},
ORIGINAL: {
name: 'original',
icon: 'el-icon-c-scale-to-original'
}
}
export default {
name: 'BottomBtn',
props: {
transform: {
type: Object,
default: () => {
return {
scale: 1,
deg: 0,
offsetX: 0,
offsetY: 0,
enableTransition: false
}
}
}
},
data() {
return {
mode: Mode.CONTAIN
}
},
computed: {
imgTransform: {
get() {
return this.transform
},
set(val) {
this.$emit('update:transform', val)
}
}
},
methods: {
toggleMode() {
if (this.loading) return
const modeNames = Object.keys(Mode)
const modeValues = Object.values(Mode)
const index = modeValues.indexOf(this.mode)
const nextIndex = (index + 1) % modeNames.length
this.mode = Mode[modeNames[nextIndex]]
this.reset()
},
reset() {
this.transform = {
scale: 1,
deg: 0,
offsetX: 0,
offsetY: 0,
enableTransition: false
}
},
handleActions(action, options = {}) {
this.$baseEventBus.$emit('handleActions', { action, ...options })
}
}
}
</script>
<style lang="scss" scoped>
@mixin image-viewer {
position: absolute;
height: 60px;
width: 100%;
background-repeat: repeat-x;
background-size: auto 100%;
z-index: 1006;
}
@mixin image-viewer__actions {
width: 100%;
height: 100%;
text-align: center;
font-size: 23px;
color: #fff;
line-height: 40px;
display: flex;
align-items: center;
justify-content: center;
}
.image-nav-bottom {
@include image-viewer;
right: 0;
bottom: 0;
background-image: url(https://staticsns.cdn.bcebos.com/amis/2022-6/1656311284898/nav-bottom-bg.png);
}
.image-nav-bottom__icon-wrap {
text-align: center;
padding: 10px 0;
box-sizing: border-box;
font-size: 0;
}
.image-viewer__actions__inner {
cursor: pointer;
@include image-viewer__actions
}
.image-viewer__actions__vertical {
@include image-viewer__actions
}
.__image_view__nav-bottom-button-block {
display: inline-block;
padding: 0 20px;
position: relative;
}
.__image_view__nav-bottom-icon-button {
display: inline-block;
width: 40px;
height: 40px;
overflow: hidden;
}
</style>

@ -0,0 +1,81 @@
<!--
* @description:
* @fileName: excel
* @author: xsz
* @date: 2023/4/14-9:11
* @version: V1.0.0
-->
<template>
<div>
<input
id="inputFile"
type="file"
accept=".xlsx,.xls,.csv"
style="margin-top: 80px;z-index: 99999"
@change="change"
>
</div>
</template>
<script>
import * as XLSX from 'xlsx'
export default {
name: 'ExcelViewer',
props: {
docxUrl: {
require: true
}
},
data() {
return {
excel: null
}
},
watch: {
docxUrl: {
handler: function(val) {
// this.excelRender(val)
},
immediate: true
}
},
mounted() {
},
methods: {
change(e) {
const file = e.target.files[0]
const reader = new FileReader()
reader.readAsBinaryString(file)
reader.onload = re => {
const data = re.target.result
this.$emit('sucess', data)
const zzexcel = XLSX.read(data, {
type: 'binary'
})
console.log(zzexcel)
this.$emit('update:sheetsContent', zzexcel)
// json
// sheet_to_html sheet_to_csv
const content = XLSX.utils.sheet_to_json(zzexcel.Sheets.Sheet1)
console.log(content)
this.context = content
}
},
excelRender(buffer) {
setTimeout(() => {
const bodyContainer = document.getElementById('bodyContainer')
const workbook = XLSX.read(buffer)
const wsname = workbook.SheetNames[0] //
const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]) // json
console.log(ws)
// console.log(XLSX.utils.sheet_to_html(this.excel))
})
}
}
}
</script>
<style lang="scss" scoped>
</style>

@ -0,0 +1,201 @@
<!--
* @description:
* @fileName: image
* @author: xsz
* @date: 2023/4/13-10:50
* @version: V1.0.0
-->
<template>
<div class="el-image-viewer__canvas">
<template v-for="(url, i) in urlList">
<img
v-if="i === index"
id="img"
ref="img"
:key="url.id"
class="el-image-viewer__img"
:src="url.image"
:style="imgStyle"
@mousedown="handleMouseDown"
>
</template>
</div>
</template>
<script>
import { isFirefox, rafThrottle } from '../utils'
import { off, on } from '../utils'
const mousewheelEventName = isFirefox() ? 'DOMMouseScroll' : 'mousewheel'
const Mode = {
CONTAIN: {
name: 'contain',
icon: 'el-icon-full-screen'
},
ORIGINAL: {
name: 'original',
icon: 'el-icon-c-scale-to-original'
}
}
export default {
name: 'ImageViewer',
props: {
urlList: {
type: Array,
default: () => []
},
index: {
type: Number,
default: 0
},
initialIndex: {
type: Number,
default: 0
}
},
data() {
return {
mode: Mode.CONTAIN,
transform: {
scale: 1,
deg: 0,
offsetX: 0,
offsetY: 0,
enableTransition: false
}
}
},
computed: {
imgStyle() {
const { scale, deg, offsetX, offsetY, enableTransition } = this.transform
const style = {
transform: `scale(${scale}) rotate(${deg}deg)`,
transition: enableTransition ? 'transform .3s' : '',
'margin-left': `${offsetX}px`,
'margin-top': `${offsetY}px`
}
if (this.mode === Mode.CONTAIN) {
style.maxWidth = '100%'
style.maxHeight = '100%'
}
return style
}
},
mounted() {
this.deviceSupportInstall()
this.handleActions()
},
destroyed() {
this.deviceSupportUninstall()
},
methods: {
deviceSupportInstall() {
this._keyDownHandler = rafThrottle(e => {
const keyCode = e.keyCode
switch (keyCode) {
// ESC
case 27:
this.hide()
break
// SPACE
case 32:
this.toggleMode()
break
// LEFT_ARROW
case 37:
this.$emit('prev')
break
// UP_ARROW
case 38:
this.performAction({ action: 'zoomIn' })
break
// RIGHT_ARROW
case 39:
this.$emit('next')
break
// DOWN_ARROW
case 40:
this.performAction({ action: 'zoomOut' })
break
}
})
this._mouseWheelHandler = rafThrottle(e => {
const delta = e.wheelDelta ? e.wheelDelta : -e.detail
if (delta > 0) {
this.performAction({ action: 'zoomIn', options: {
zoomRate: 0.015,
enableTransition: false
}})
} else {
this.performAction({ action: 'zoomOut', options: {
zoomRate: 0.015,
enableTransition: false
}})
}
})
on(document, 'keydown', this._keyDownHandler)
on(document, mousewheelEventName, this._mouseWheelHandler)
},
deviceSupportUninstall() {
off(document, 'keydown', this._keyDownHandler)
off(document, mousewheelEventName, this._mouseWheelHandler)
this._keyDownHandler = null
this._mouseWheelHandler = null
},
handleActions() {
this.$baseEventBus.$on('handleActions', (options) => {
this.performAction(options)
})
},
performAction({ action, options }) {
const { transform } = this
const { zoomRate, rotateDeg, enableTransition } = {
zoomRate: 0.2,
rotateDeg: 90,
enableTransition: true,
...options
}
switch (action) {
case 'zoomOut':
if (transform.scale > 0.2) {
transform.scale = parseFloat((transform.scale - zoomRate).toFixed(3))
}
break
case 'zoomIn':
transform.scale = parseFloat((transform.scale + zoomRate).toFixed(3))
break
case 'clocelise':
transform.deg += rotateDeg
break
case 'drawer':
this.$emit('drawer')
break
case 'anticlocelise':
transform.deg -= rotateDeg
break
}
transform.enableTransition = enableTransition
},
handleMouseDown(e) {
if (this.loading || e.button !== 0) return
const { offsetX, offsetY } = this.transform
const startX = e.pageX
const startY = e.pageY
this._dragHandler = rafThrottle(ev => {
this.transform.offsetX = offsetX + ev.pageX - startX
this.transform.offsetY = offsetY + ev.pageY - startY
})
on(document, 'mousemove', this._dragHandler)
on(document, 'mouseup', ev => {
off(document, 'mousemove', this._dragHandler)
})
e.preventDefault()
}
}
}
</script>
<style lang="scss" scoped>
</style>

@ -0,0 +1,46 @@
<!--
* @description:
* @fileName: pdf
* @author: xsz
* @date: 2023/4/21-11:24
* @version: V1.0.0
-->
<template>
<div style="position: absolute;width: 100%;height: 100%;top: 45px">
<iframe :src="docxUrl" width="100%" height="100%" />
</div>
</template>
<script>
export default {
name: 'PdfViewer',
props: {
docxUrl: {
require: true
}
},
data() {
return {}
},
watch: {
docxUrl: {
handler: function(val) {
this.docxRender(val)
},
immediate: true
}
},
methods: {
docxRender(url) {
setTimeout(() => {
})
}
}
}
</script>
<style lang="scss" scoped>
</style>

@ -0,0 +1,80 @@
<!--
* @description:
* @fileName: word
* @author: xsz
* @date: 2023/4/13-16:41
* @version: V1.0.0
-->
<template>
<div>
<div ref="ace" class="txt-viewer" />
</div>
</template>
<script>
import ace from 'ace-builds'
import 'ace-builds/src-noconflict/snippets/javascript'
import 'ace-builds/src-noconflict/snippets/text'
export default {
name: 'TxtViewer',
props: {
docxUrl: {
require: true
}
},
data() {
return {
aceEditor: null,
toggle: true,
wrap: true,
themePath: 'ace/theme/monokai',
modePath: 'ace/mode/text',
resultDa: '',
inputDa: '',
modelAce: '\nfunction hanlde(data){\n\t//请输入处理脚本\n\t\n\treturn data;\n}',
isValidate: true
}
},
watch: {
docxUrl: {
handler: function(val) {
this.txtRender(val)
},
immediate: true
}
},
mounted() {
this.aceEditor = ace.edit(this.$refs.ace, {
maxLines: 90,
minLines: 50,
fontSize: 14,
value: this.value ? this.value : '',
theme: this.themePath,
mode: this.modePath,
tabSize: 4
})
},
methods: {
txtRender(buffer) {
const blob = new Blob([buffer], { type: 'text/html' })
setTimeout(() => {
const reader = new FileReader()
reader.onload = (ev) => {
const content = ev.target.result || '空文件'
this.aceEditor.getSession().setValue(content)
}
reader.readAsText(blob)
})
}
}
}
</script>
<style lang="scss" scoped>
.txt-viewer {
// color: white;
width: 80%;
margin: 30px auto;
vertical-align: center;
}
</style>

@ -0,0 +1,89 @@
<!--
* @description:
* @fileName: word
* @author: xsz
* @date: 2023/4/13-16:41
* @version: V1.0.0
-->
<template>
<div style="height: 90vh;margin-bottom: 50px">
<div id="mse" />
</div>
</template>
<script>
import Player from 'xgplayer'
import 'xgplayer/dist/index.min.css'
export default {
name: 'VideoViewer',
props: {
docxUrl: {
require: true
}
},
data() {
return {
player: null
}
},
watch: {
docxUrl: {
handler: function(val) {
this.docxRender(val)
},
immediate: true
}
},
methods: {
docxRender(url) {
setTimeout(() => {
this.player = new Player({
id: 'mse',
fluid: true, // 使
url: url,
download: false, // download
danmu: {
panel: true,
comments: [
{
duration: 15000,
id: '1',
start: 6000,
txt: '长弹幕长弹幕长弹幕长弹幕长弹幕',
style: { //
color: '#ff9500',
fontSize: '20px',
border: 'solid 1px #ff9500',
borderRadius: '50px',
padding: '5px 11px',
zIndex: 99999,
backgroundColor: 'rgba(255, 255, 255, 0.1)'
},
mode: 'top'
}
],
area: {
start: 0.3,
end: 1
}
},
autoplay: true, //
videoInit: true //
})
this.player.emit('resourceReady',
[
{ name: '超清', url: '//sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4' },
{ name: '高清', url: '//sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4' },
{ name: '标清', url: '//sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-360p.mp4' }
])
})
}
}
}
</script>
<style lang="scss" scoped>
.xgplayer {
position: unset;
}
</style>

@ -0,0 +1,80 @@
<!--
* @description:
* @fileName: word
* @author: xsz
* @date: 2023/4/13-16:41
* @version: V1.0.0
-->
<template>
<div>
<el-scrollbar>
<div id="bodyContainer" style="height: 100vh" />
</el-scrollbar>
</div>
</template>
<script>
import { renderAsync } from 'docx-preview'
export default {
name: 'WordViewer',
props: {
docxUrl: {},
urlList: {
type: Array,
defaultValue: []
},
index: {
type: Number,
defaultValue: 0
}
},
data() {
return {
docxOptions: {
className: 'kaimo-docx-666', // string/
inWrapper: true, // boolean
ignoreWidth: false, // boolean
ignoreHeight: false, // boolean
ignoreFonts: false, // boolean
breakPages: true, // boolean
ignoreLastRenderedPageBreak: true, // boolean lastRenderedPageBreak
experimental: false, // boolean
trimXmlDeclaration: true, // booleantruexml xml
useBase64URL: false, // booleantruebase 64 URL使URL.createObjectURL
useMathMLPolyfill: false, // boolean chromeedge MathML polyfill
showChanges: false, // boolean/
debug: false // boolean
}
}
},
watch: {
urlList: {
handler: function(val) {
this.docxRender(val[this.index])
},
immediate: true
}
},
methods: {
docxRender(buffer) {
const self = this
const blob = new Blob([buffer])
setTimeout(() => {
const bodyContainer = document.getElementById('bodyContainer')
renderAsync(
blob, // Blob | ArrayBuffer | Uint8Array, JSZip.loadAsync
bodyContainer, // HTMLElement ,
null, // HTMLElement, null使 bodyContainer
self.docxOptions //
).then(res => {
console.log('res---->', res)
})
})
}
}
}
</script>
<style lang="scss" scoped>
</style>

@ -0,0 +1,10 @@
/**
* @description:
* @fileName: eventBuss
* @author: xsz
* @date: 2023/4/13-13:32
* @version: V1.0.0
**/
import Vue from 'vue'
Vue.prototype.$baseEventBus = new Vue()

@ -0,0 +1,20 @@
import Vue from 'vue'
const requireComponents = require.context('./components', true, /\.vue$/)
requireComponents.keys().forEach((fileName) => {
const componentConfig = requireComponents(fileName)
const componentName = componentConfig.default.name
Vue.component(componentName, componentConfig.default || componentConfig)
})
/* const requireZxLayouts = require.context('zx-layouts', true, /\.vue$/)
requireZxLayouts.keys().forEach((fileName) => {
const componentConfig = requireZxLayouts(fileName)
const componentName = componentConfig.default.name
Vue.component(componentName, componentConfig.default || componentConfig)
})*/
/* const requireThemes = require.context('@/styles/themes', true, /\.scss$/)
requireThemes.keys().forEach((fileName) => {
require(`@/styles/themes/${fileName.slice(2)}`)
}) */

@ -0,0 +1,208 @@
<!--
* @description:
* @fileName: index
* @author: xsz
* @date: 2023/4/13-10:15
* @version: V1.0.0
-->
<template>
<div>
<transition name="viewer-fade">
<div ref="el-image-viewer__wrapper" tabindex="-1" class="el-image-viewer__wrapper" :style="{ 'z-index': zIndex,'right': drawer ?'310px': 0 }">
<div class="el-image-viewer__mask" />
<!-- CLOSE -->
<div class="image-nav-top">
<el-tooltip placement="top">
<div slot="content">退出<br>ESC</div>
<span class="image-viewer__btn image-viewer__close" @click="hide">
<i class="el-icon-close" />
</span>
</el-tooltip>
</div>
<!-- ARROW -->
<template v-if="!isSingle">
<span
class="el-image-viewer__btn el-image-viewer__prev"
:class="{ 'is-disabled': !infinite && isFirst }"
@click="prev"
>
<i class="el-icon-arrow-left" />
</span>
<span
class="el-image-viewer__btn el-image-viewer__next"
:class="{ 'is-disabled': !infinite && isLast }"
@click="next"
>
<i class="el-icon-arrow-right" />
</span>
</template>
<!-- ACTIONS -->
<bottom-btn v-if="fileType === 'image'" />
<!-- CANVAS -->
<template>
<component
:is="currenComponent"
:url-list="urlList"
:docx-url="docxUrl"
:index="index"
@prev="prev"
@next="next"
@drawer="drawer = !drawer"
/>
</template>
</div>
</transition>
<right-drawer
v-if="drawer"
@close-drawer="drawer = false"
/>
</div>
</template>
<script>
import './export'
import RightDrawer from '@/components/FileViewer/rightDrawer'
import BottomBtn from '@/components/FileViewer/bottomBtn'
export default {
name: 'FileViewer',
components: { BottomBtn, RightDrawer },
props: {
urlList: {
type: Array,
default: () => []
},
docxUrl: {
},
zIndex: {
type: Number,
default: 2000
},
fileType: {
type: String,
default: 'image'
},
onClose: {
type: Function,
default: () => {
}
},
initialIndex: {
type: Number,
default: 0
}
},
data() {
return {
drawer: false,
infinite: true,
index: this.initialIndex
}
},
computed: {
isSingle() {
return this.urlList.length <= 1
},
isFirst() {
return this.index === 0
},
isLast() {
return this.index === this.urlList.length - 1
},
currenComponent() {
let rander = 'ImageViewer'
switch (this.fileType) {
case 'image':
rander = 'ImageViewer'
break
case 'video':
rander = 'VideoViewer'
break
case 'word':
rander = 'WordViewer'
break
case 'pdf':
rander = 'PdfViewer'
break
case 'txt':
rander = 'TxtViewer'
break
case 'js':
rander = 'TxtViewer'
break
case 'excel':
rander = 'ExcelViewer'
break
}
return rander
}
},
mounted() {
this.$refs['el-image-viewer__wrapper'].focus()
},
methods: {
hide() {
this.onClose()
},
prev() {
if (this.isFirst && !this.infinite) return
const len = this.urlList.length
this.index = (this.index - 1 + len) % len
},
next() {
if (this.isLast && !this.infinite) return
const len = this.urlList.length
this.index = (this.index + 1) % len
}
}
}
</script>
<style lang="scss" scoped>
@mixin image-viewer {
position: absolute;
height: 60px;
width: 100%;
background-repeat: repeat-x;
background-size: auto 100%;
z-index: 1006;
}
@mixin hover {
border-radius: 50%;
opacity: 0.8;
background-color: #606266;
}
.el-image-viewer__wrapper {
background-color: rgba(0,0,0,0.95);
}
.image-viewer__btn {
position: absolute;
z-index: 1;
display: flex;
align-items: center;
justify-content: center;
//cursor: pointer;
box-sizing: border-box;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.image-viewer__btn:hover {
@include hover;
}
.image-nav-top {
@include image-viewer;
top: 0;
left: 0;
background-image: url(https://staticsns.cdn.bcebos.com/amis/2022-6/1656311285406/nav-top-bg.png);
.image-viewer__close {
top: 5px;
right: 40px;
width: 40px;
height: 40px;
font-size: 24px;
color: #fff;
}
}
</style>

@ -0,0 +1,103 @@
<!--
* @description:
* @fileName: rightDrawer
* @author: xsz
* @date: 2023/4/13-10:43
* @version: V1.0.0
-->
<template>
<transition>
<div class="image-viewer-info">
<div class="aside-wrap__title">
详情
</div>
<div class="aside-wrap__icon-close" @click="$emit('close-drawer')" />
<div class="aside-wrap__image-info">
<div class="picture-block__title title-block__top">
文件名
</div>
<div class="title-block__value title-block__top">
QQ截图
</div>
</div>
<div class="aside-wrap__image-info">
<div class="picture-block__title title-block__top">
文件名
</div>
<div class="title-block__value title-block__top">
QQ截图
</div>
</div>
</div>
</transition>
</template>
<script>
export default {
name: 'RightDrawer',
data() {
return {}
}
}
</script>
<style lang="scss" scoped>
.image-viewer-info {
position:fixed;
top:0;
right: 0;
width: 310px;
height: 100vh;
background-color: #191919;
padding: 20px 0 20px 40px;
z-index: 3100;
box-sizing: border-box;
overflow: hidden;
}
.aside-wrap__title {
font-size: 16px;
color: #FFFFFF;
letter-spacing: 0;
font-weight: 600;
min-width: 50px;
}
.aside-wrap__icon-close {
width: 18px;
height: 70px;
background: #D8D8D8;
background: url(https://staticsns.cdn.bcebos.com/amis/2022-6/1656310487139/aside-close.png) no-repeat center;
background-size: 100%;
position: absolute;
left: 0;
margin-top: -35px;
top: 50%;
cursor: pointer;
transition: margin .2s ease-in-out;
}
.aside-wrap__image-info {
margin-top: 30px;
}
.picture-block__title {
font-size: 12px;
color: #FFFFFF;
letter-spacing: 0;
font-weight: 600;
margin-right: 10px;
min-width: 50px;
display: inline-block;
}
.title-block__top {
vertical-align: text-top;
}
.title-block__value {
font-size: 12px;
color: #999999;
letter-spacing: 0;
font-weight: 400;
display: inline-block;
width: 155px;
word-wrap: break-word;
word-break: normal;
}
</style>

@ -0,0 +1,59 @@
/**
* @description:
* @fileName: index
* @author: xsz
* @date: 2023/4/13-10:19
* @version: V1.0.0
**/
import Vue from 'vue'
const isServer = Vue.prototype.$isServer
export const isFirefox = function() {
return !isServer && !!window.navigator.userAgent.match(/firefox/i)
}
export function rafThrottle(fn) {
let locked = false
return function(...args) {
if (locked) return
locked = true
window.requestAnimationFrame(_ => {
fn.apply(this, args)
locked = false
})
}
}
/* istanbul ignore next */
export const on = (function() {
if (!isServer && document.addEventListener) {
return function(element, event, handler) {
if (element && event && handler) {
element.addEventListener(event, handler, false)
}
}
} else {
return function(element, event, handler) {
if (element && event && handler) {
element.attachEvent('on' + event, handler)
}
}
}
})()
/* istanbul ignore next */
export const off = (function() {
if (!isServer && document.removeEventListener) {
return function(element, event, handler) {
if (element && event) {
element.removeEventListener(event, handler, false)
}
}
} else {
return function(element, event, handler) {
if (element && event) {
element.detachEvent('on' + event, handler)
}
}
}
})()

@ -0,0 +1,3 @@
const elementIcons = ['platform-eleme', 'eleme', 'delete-solid', 'delete', 's-tools', 'setting', 'user-solid', 'user', 'phone', 'phone-outline', 'more', 'more-outline', 'star-on', 'star-off', 's-goods', 'goods', 'warning', 'warning-outline', 'question', 'info', 'remove', 'circle-plus', 'success', 'error', 'zoom-in', 'zoom-out', 'remove-outline', 'circle-plus-outline', 'circle-check', 'circle-close', 's-help', 'help', 'minus', 'plus', 'check', 'close', 'picture', 'picture-outline', 'picture-outline-round', 'upload', 'upload2', 'download', 'camera-solid', 'camera', 'video-camera-solid', 'video-camera', 'message-solid', 'bell', 's-cooperation', 's-order', 's-platform', 's-fold', 's-unfold', 's-operation', 's-promotion', 's-home', 's-release', 's-ticket', 's-management', 's-open', 's-shop', 's-marketing', 's-flag', 's-comment', 's-finance', 's-claim', 's-custom', 's-opportunity', 's-data', 's-check', 's-grid', 'menu', 'share', 'd-caret', 'caret-left', 'caret-right', 'caret-bottom', 'caret-top', 'bottom-left', 'bottom-right', 'back', 'right', 'bottom', 'top', 'top-left', 'top-right', 'arrow-left', 'arrow-right', 'arrow-down', 'arrow-up', 'd-arrow-left', 'd-arrow-right', 'video-pause', 'video-play', 'refresh', 'refresh-right', 'refresh-left', 'finished', 'sort', 'sort-up', 'sort-down', 'rank', 'loading', 'view', 'c-scale-to-original', 'date', 'edit', 'edit-outline', 'folder', 'folder-opened', 'folder-add', 'folder-remove', 'folder-delete', 'folder-checked', 'tickets', 'document-remove', 'document-delete', 'document-copy', 'document-checked', 'document', 'document-add', 'printer', 'paperclip', 'takeaway-box', 'search', 'monitor', 'attract', 'mobile', 'scissors', 'umbrella', 'headset', 'brush', 'mouse', 'coordinate', 'magic-stick', 'reading', 'data-line', 'data-board', 'pie-chart', 'data-analysis', 'collection-tag', 'film', 'suitcase', 'suitcase-1', 'receiving', 'collection', 'files', 'notebook-1', 'notebook-2', 'toilet-paper', 'office-building', 'school', 'table-lamp', 'house', 'no-smoking', 'smoking', 'shopping-cart-full', 'shopping-cart-1', 'shopping-cart-2', 'shopping-bag-1', 'shopping-bag-2', 'sold-out', 'sell', 'present', 'box', 'bank-card', 'money', 'coin', 'wallet', 'discount', 'price-tag', 'news', 'guide', 'male', 'female', 'thumb', 'cpu', 'link', 'connection', 'open', 'turn-off', 'set-up', 'chat-round', 'chat-line-round', 'chat-square', 'chat-dot-round', 'chat-dot-square', 'chat-line-square', 'message', 'postcard', 'position', 'turn-off-microphone', 'microphone', 'close-notification', 'bangzhu', 'time', 'odometer', 'crop', 'aim', 'switch-button', 'full-screen', 'copy-document', 'mic', 'stopwatch', 'medal-1', 'medal', 'trophy', 'trophy-1', 'first-aid-kit', 'discover', 'place', 'location', 'location-outline', 'location-information', 'add-location', 'delete-location', 'map-location', 'alarm-clock', 'timer', 'watch-1', 'watch', 'lock', 'unlock', 'key', 'service', 'mobile-phone', 'bicycle', 'truck', 'ship', 'basketball', 'football', 'soccer', 'baseball', 'wind-power', 'light-rain', 'lightning', 'heavy-rain', 'sunrise', 'sunrise-1', 'sunset', 'sunny', 'cloudy', 'partly-cloudy', 'cloudy-and-sunny', 'moon', 'moon-night', 'dish', 'dish-1', 'food', 'chicken', 'fork-spoon', 'knife-fork', 'burger', 'tableware', 'sugar', 'dessert', 'ice-cream', 'hot-water', 'water-cup', 'coffee-cup', 'cold-drink', 'goblet', 'goblet-full', 'goblet-square', 'goblet-square-full', 'refrigerator', 'grape', 'watermelon', 'cherry', 'apple', 'pear', 'orange', 'coffee', 'ice-tea', 'ice-drink', 'milk-tea', 'potato-strips', 'lollipop', 'ice-cream-square', 'ice-cream-round']
export default elementIcons

@ -0,0 +1,80 @@
<template>
<div class="icon-body">
<el-input v-model="name" style="position: relative;" clearable placeholder="请输入图标名称" @clear="filterIcons" @input.native="filterIcons">
<i slot="suffix" class="el-icon-search el-input__icon" />
</el-input>
<div class="icon-list">
<div v-for="(item, index) in iconList" :key="index" style="display: flex" @click="selectedIcon(item)">
<svg-icon :icon-class="item" style="height: 30px;width: 16px;padding-right: 8px" />
<span>{{ item }}</span>
</div>
<div v-for="item in elementList" :key="item" style="display: flex;align-items: baseline;" @click="selectedIcon('el-icon-' + item)">
<i :class="'el-icon-' + item" style="height: 30px;width: 16px;padding-right: 8px" />
<span>el-icon-{{ item }}</span>
</div>
</div>
</div>
</template>
<script>
import icons from './requireIcons'
import elementIcons from './element-icons'
export default {
name: 'IconSelect',
data() {
return {
name: '',
iconList: icons,
elementList: elementIcons
}
},
methods: {
filterIcons() {
this.iconList = icons
this.elementList = elementIcons
if (this.name && this.name.indexOf('el-icon') !== -1) {
const query = this.name.split('el-icon-')
this.iconList = null
this.elementList = this.elementList.filter(item => item.includes(query[1]))
} else {
this.elementList = null
this.iconList = this.iconList.filter(item => item.includes(this.name))
}
},
selectedIcon(name) {
this.$emit('selected', name)
document.body.click()
},
reset() {
this.name = ''
this.iconList = icons
this.elementList = elementIcons
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.icon-body {
width: 100%;
padding: 10px;
.icon-list {
height: 200px;
overflow-y: scroll;
div {
height: 30px;
line-height: 30px;
margin-bottom: -5px;
cursor: pointer;
width: 33%;
float: left;
}
span {
display: inline-block;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
}
}
</style>

@ -0,0 +1,11 @@
const req = require.context('../../icons/svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys()
const re = /\.\/(.*)\.svg/
const icons = requireAll(req).map(i => {
return i.match(re)[1]
})
export default icons

@ -0,0 +1,364 @@
<template>
<transition name="viewer-fade">
<div ref="el-image-viewer__wrapper" tabindex="-1" class="el-image-viewer__wrapper" :style="{ 'z-index': zIndex }">
<div class="el-image-viewer__mask" :class="imgShow ? '' : 'el-pdf-viewer__mask'" />
<!-- CLOSE -->
<span class="el-image-viewer__btn el-image-viewer__close" @click="hide">
<i class="el-icon-circle-close" />
</span>
<!-- ARROW -->
<template v-if="!isSingle">
<span
class="el-image-viewer__btn el-image-viewer__prev"
:class="{ 'is-disabled': !infinite && isFirst }"
@click="prev"
>
<i class="el-icon-arrow-left" />
</span>
<span
class="el-image-viewer__btn el-image-viewer__next"
:class="{ 'is-disabled': !infinite && isLast }"
@click="next"
>
<i class="el-icon-arrow-right" />
</span>
</template>
<!-- ACTIONS -->
<div v-if="imgShow" class="el-image-viewer__btn el-image-viewer__actions">
<div class="el-image-viewer__actions__inner">
<i class="el-icon-zoom-out" @click="handleActions('zoomOut')" />
<i class="el-icon-zoom-in" @click="handleActions('zoomIn')" />
<i class="el-image-viewer__actions__divider" />
<i :class="mode.icon" @click="toggleMode" />
<i class="el-image-viewer__actions__divider" />
<i title="打印" class="el-icon-printer" @click="handlePrinter" />
<i class="el-image-viewer__actions__divider" />
<i class="el-icon-refresh-left" @click="handleActions('anticlocelise')" />
<i class="el-icon-refresh-right" @click="handleActions('clocelise')" />
</div>
</div>
<!-- CANVAS -->
<div v-if="imgShow" class="el-image-viewer__canvas">
<div v-for="(url, i) in urlList" :key="i">
<img
v-if="i === index"
id="img"
ref="img"
:key="i"
class="el-image-viewer__img"
:src="currentImg"
:style="imgStyle"
@load="handleImgLoad"
@error="handleImgError"
@mousedown="handleMouseDown"
>
</div>
</div>
<div v-if="!imgShow" class="el-image-viewer__canvas">
<iframe id="iframeref" :src="currentImg" frameborder="0" width="100%" height="100%" />
</div>
<canvas id="test" />
</div>
</transition>
</template>
<script>
import { on, off } from 'element-ui/src/utils/dom'
import { rafThrottle, isFirefox } from 'element-ui/src/utils/util'
const Mode = {
CONTAIN: {
name: 'contain',
icon: 'el-icon-full-screen'
},
ORIGINAL: {
name: 'original',
icon: 'el-icon-c-scale-to-original'
}
}
const mousewheelEventName = isFirefox() ? 'DOMMouseScroll' : 'mousewheel'
export default {
name: 'ElImageViewer',
components: { },
props: {
urlList: {
type: [Array, String],
default: () => []
},
zIndex: {
type: Number,
default: 3000
},
onSwitch: {
type: Function,
default: () => {}
},
onClose: {
type: Function,
default: () => {}
},
initialIndex: {
type: Number,
default: 0
},
watermark: {
type: String,
default: ''
}
},
data() {
return {
imgUrl: '',
index: this.initialIndex,
isShow: false,
infinite: true,
loading: false,
imgShow: true,
mode: Mode.CONTAIN,
transform: {
scale: 1,
deg: 0,
offsetX: 0,
offsetY: 0,
enableTransition: false
}
}
},
computed: {
isSingle() {
return this.urlList?.length <= 1
},
isFirst() {
return this.index === 0
},
isLast() {
return this.index === this.urlList?.length - 1
},
currentImg() {
const fileUrl = (typeof this.urlList[this.index] === 'object') ? this.urlList[this.index]?.url : this.urlList
return fileUrl
/* if (this.urlList[this.index]?.name.includes('pdf')) {
// return './pdfjs/web/viewer.html?file=' + fileUrl + '&keyword=' + encodeURIComponent(this.watermark)
return '/graduate/api/graduateInfo/showFile?id=' + fileUrl
} else {
return fileUrl
}*/
},
imgStyle() {
const { scale, deg, offsetX, offsetY, enableTransition } = this.transform
const style = {
transform: `scale(${scale}) rotate(${deg}deg)`,
transition: enableTransition ? 'transform .3s' : '',
'margin-left': `${offsetX}px`,
'margin-top': `${offsetY}px`
}
if (this.mode === Mode.CONTAIN) {
style.maxWidth = '100%'
style.maxHeight = '100%'
}
return style
}
},
watch: {
index: {
handler: function(val) {
this.reset()
this.onSwitch(val)
}
},
currentImg: {
handler(val) {
this.imgShow = this.urlList[this.index].indexOf('pdf') === -1
},
immediate: true
}
},
mounted() {
this.deviceSupportInstall()
// add tabindex then wrapper can be focusable via Javascript
// focus wrapper so arrow key can't cause inner scroll behavior underneath
this.$refs['el-image-viewer__wrapper'].focus()
},
methods: {
hide() {
this.deviceSupportUninstall()
this.onClose()
},
deviceSupportInstall() {
this._keyDownHandler = rafThrottle(e => {
const keyCode = e.keyCode
switch (keyCode) {
// ESC
case 27:
this.hide()
break
// SPACE
case 32:
this.toggleMode()
break
// LEFT_ARROW
case 37:
this.prev()
break
// UP_ARROW
case 38:
this.handleActions('zoomIn')
break
// RIGHT_ARROW
case 39:
this.next()
break
// DOWN_ARROW
case 40:
this.handleActions('zoomOut')
break
}
})
this._mouseWheelHandler = rafThrottle(e => {
const delta = e.wheelDelta ? e.wheelDelta : -e.detail
if (delta > 0) {
this.handleActions('zoomIn', {
zoomRate: 0.015,
enableTransition: false
})
} else {
this.handleActions('zoomOut', {
zoomRate: 0.015,
enableTransition: false
})
}
})
on(document, 'keydown', this._keyDownHandler)
on(document, mousewheelEventName, this._mouseWheelHandler)
},
deviceSupportUninstall() {
off(document, 'keydown', this._keyDownHandler)
off(document, mousewheelEventName, this._mouseWheelHandler)
this._keyDownHandler = null
this._mouseWheelHandler = null
},
handleImgLoad(e) {
this.loading = false
},
handleImgError(e) {
this.loading = false
e.target.alt = '加载失败'
},
handleMouseDown(e) {
if (this.loading || e.button !== 0) return
const { offsetX, offsetY } = this.transform
const startX = e.pageX
const startY = e.pageY
this._dragHandler = rafThrottle(ev => {
this.transform.offsetX = offsetX + ev.pageX - startX
this.transform.offsetY = offsetY + ev.pageY - startY
})
on(document, 'mousemove', this._dragHandler)
on(document, 'mouseup', ev => {
off(document, 'mousemove', this._dragHandler)
})
e.preventDefault()
},
reset() {
this.transform = {
scale: 1,
deg: 0,
offsetX: 0,
offsetY: 0,
enableTransition: false
}
},
toggleMode() {
if (this.loading) return
const modeNames = Object.keys(Mode)
const modeValues = Object.values(Mode)
const index = modeValues.indexOf(this.mode)
const nextIndex = (index + 1) % modeNames.length
this.mode = Mode[modeNames[nextIndex]]
this.reset()
},
prev() {
if (this.isFirst && !this.infinite) return
const len = this.urlList.length
this.index = (this.index - 1 + len) % len
},
next() {
if (this.isLast && !this.infinite) return
const len = this.urlList.length
this.index = (this.index + 1) % len
},
handleActions(action, options = {}) {
if (this.loading) return
const { zoomRate, rotateDeg, enableTransition } = {
zoomRate: 0.2,
rotateDeg: 90,
enableTransition: true,
...options
}
const { transform } = this
switch (action) {
case 'zoomOut':
if (transform.scale > 0.2) {
transform.scale = parseFloat((transform.scale - zoomRate).toFixed(3))
}
break
case 'zoomIn':
transform.scale = parseFloat((transform.scale + zoomRate).toFixed(3))
break
case 'clocelise':
transform.deg += rotateDeg
break
case 'anticlocelise':
transform.deg -= rotateDeg
break
}
transform.enableTransition = enableTransition
},
handlePrinter() {
const img = document.getElementById('img')
img.style.maxHeight = 'none'
img.style.maxWidth = 'none'
let imgData = null
const canvas = document.createElement('canvas')
const context = canvas.getContext('2d')
const w = img.width
const h = img.height
canvas.width = w
canvas.height = h
context.drawImage(img, 0, 0)
imgData = context.getImageData(0, 0, w, h)
context.putImageData(imgData, 0, 0)
const newBase64 = canvas.toDataURL('image/png')
//
this.$refs['img-printer'].handlePrinterImg(newBase64)
img.style.maxHeight = '100%'
img.style.maxWidth = '100%'
}
}
}
</script>
<style scoped lang="scss">
.el-image-viewer__actions__inner {
i:hover {
cursor: pointer;
}
}
.el-pdf-viewer__mask {
pointer-events: none;
background-color: unset;
}
#img {
}
</style>

@ -0,0 +1,21 @@
import { Message } from 'element-ui'
let messageInstance = null
const resetMessage = (options) => {
if (messageInstance) {
messageInstance.close()
}
messageInstance = Message(options)
}
['error', 'success', 'info', 'warning'].forEach(type => {
resetMessage[type] = options => {
if (typeof options === 'string') {
options = {
message: options
}
}
options.type = type
return resetMessage(options)
}
})
export default resetMessage

@ -0,0 +1,107 @@
<template>
<div :class="{'hidden':hidden}" class="pagination-container">
<el-pagination
:background="background"
:current-page.sync="currentPage"
:page-size.sync="pageSize"
:layout="layout"
:page-sizes="pageSizes"
:total="total"
v-bind="$attrs"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
>
<span key="1" class="total">总共{{ total }}项数据</span>
</el-pagination>
</div>
</template>
<script>
import { scrollTo } from '@/utils/scroll-to'
export default {
name: 'Pagination',
props: {
total: {
required: true,
type: Number
},
page: {
type: Number,
default: 1
},
limit: {
type: Number,
default: 20
},
pageSizes: {
type: Array,
default() {
return [20, 40, 50, 100, 200]
}
},
layout: {
type: String,
default: 'slot, sizes, prev, pager, next, jumper'
},
background: {
type: Boolean,
default: true
},
autoScroll: {
type: Boolean,
default: true
},
hidden: {
type: Boolean,
default: false
}
},
computed: {
currentPage: {
get() {
return this.page
},
set(val) {
this.$emit('update:page', val)
}
},
pageSize: {
get() {
return this.limit
},
set(val) {
this.$emit('update:limit', val)
}
}
},
methods: {
handleSizeChange(val) {
this.$emit('pagination', { page: this.currentPage, limit: val })
if (this.autoScroll) {
scrollTo(0, 800)
}
},
handleCurrentChange(val) {
this.$emit('pagination', { page: val, limit: this.pageSize })
if (this.autoScroll) {
scrollTo(0, 800)
}
}
}
}
</script>
<style scoped lang="scss">
.pagination-container {
background: #fff;
padding: 0 16px;
.total {
color: $base-color-default;
margin-right: 10px;
}
}
.pagination-container.hidden {
display: none;
}
</style>

@ -0,0 +1,67 @@
<template>
<el-dialog :visible.sync="dialogVisible" width="68%" top="0" height="100%" :before-close="handleClose">
<!-- <object width="100%" height="800px" :data="contractURL" /> -->
<!-- <iframe width="100%" height="800px" :src="contractURL" frameborder="0" /> -->
<el-image width="100%" height="800px" :src="contractURL" />
</el-dialog>
</template>
<script>
export default {
props: {
url: {
type: String,
default: ''
}
},
data() {
return {
dialogVisible: false,
contractURL: ''
}
},
watch: {
URL(val) {
this.contractURL = val
// console.log(val,'val')
}
},
mounted() {
// console.log('this.URL',this.URL)
},
methods: {
handleClose() {
this.dialogVisible = false
this.contractURL = ''
},
openPDF(val) {
this.contractURL = val
// console.log('66', this.contractURL)
this.dialogVisible = true
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog {
background: none;
}
::v-deep .el-dialog__close {
color: #fff;
font-size: 35px;
border: 2px solid #fff;
border-radius: 50%;
position: absolute;
}
::v-deep .el-dialog__body {
border-top:0
}
</style>

@ -0,0 +1,327 @@
<!--
* @description:
* @fileName: Search
* @author: Sun MJ
* @date: 2022/3/15-11:03
* @version: V1.0.0
-->
<!--搜索表单组件 @author Sun MJ-->
<template>
<div ref="screenRef" v-clickoutside="handleClose" class="screen-body">
<div v-if="title" class="title">{{ title }}</div>
<el-form label-width="60px" label-position="left" size="mini">
<el-row :gutter="10" type="flex" style="align-items: stretch">
<el-col :span="direction === 'row' ? 20 : 21">
<el-row :gutter="40">
<template v-for="(item,index) in data">
<transition :key="index" enter-active-class="animated fadeInUp" leave-active-class="animated fadeOutUp">
<el-col v-if="index < 7 ? true : flag" :key="index" :span="item.type === 'daterange' ? 10: span">
<el-form-item :label-width="item.labelWidth">
<span slot="label">
<el-tooltip :content="item.label" placement="left">
<span style="font-size: 12px">{{ item.label }}</span>
</el-tooltip>
</span>
<el-input v-if="item.type==='input'" v-model="SearchformInline[index]" :disabled="item.disabled" clearable :placeholder="'请输入'+item.label" />
<el-input v-if="item.type==='inputFocus'" v-model="SearchformInline[index]" :disabled="item.disabled" clearable :placeholder="'请输入'+item.label" @focus="onInputFocus(item.name,item.model)" />
<el-input-number
v-else-if="item.type==='number'"
v-model="SearchformInline[index]"
:disabled="item.disabled"
style="width: 100%"
controls-position="right"
:placeholder="'请输入'+item.label"
:min="1"
:max="100"
/>
<el-select
v-else-if="item.type==='select'"
v-model="SearchformInline[index]"
filterable
class="size-full"
clearable
:placeholder="'请选择'+item.label"
@change="((val)=>{changeData(index, val)})"
>
<el-option v-for="(option,key) in item.option" :key="key" :label="option.label" :value="option.value" />
</el-select>
<el-cascader
v-else-if="item.type==='cascader'"
v-model="SearchformInline[index]"
:disabled="item.disabled"
class="size-full"
clearable
filterable
:placeholder="'请选择'+item.label"
:props="item.props"
:options="item.option"
/>
<el-select
v-else-if="item.type==='selectMultiple'"
v-model="SearchformInline[index]"
:disabled="item.disabled"
multiple
collapse-tags
filterable
class="size-full"
clearable
:placeholder="'请选择'+item.label"
@change="((val)=>{changeSelect(val, index)})"
>
<!-- <el-checkbox v-model="checked[index]" style="width: 100%;text-align: left;padding-right: 10px" @change="selectAll(index)"></el-checkbox>-->
<el-option v-for="(option,key) in item.option" :key="key" :label="option.label" :value="option.value" />
</el-select>
<el-date-picker
v-else-if="item.type==='date'"
v-model="SearchformInline[index]"
:disabled="item.disabled"
clearable
type="date"
style="width: 100%"
value-format="yyyy-MM-dd"
:placeholder="'请选择'+item.label"
/>
<el-date-picker
v-else-if="item.type==='month'"
v-model="SearchformInline[index]"
:disabled="item.disabled"
clearable
type="month"
style="width: 100%"
value-format="yyyyMM"
format="yyyy-MM"
:placeholder="'请选择'+item.label"
/>
<el-date-picker
v-else-if="item.type==='year'"
v-model="SearchformInline[index]"
:disabled="item.disabled"
clearable
type="year"
style="width: 100%"
value-format="yyyy"
format="yyyy"
:placeholder="'请选择'+item.label"
/>
<el-date-picker
v-else-if="item.type==='daterange'"
v-model="SearchformInline[index]"
:disabled="item.disabled"
clearable
type="daterange"
style="width: 100%"
value-format="yyyy-MM-dd"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
<el-date-picker
v-else-if="item.type==='datetimerange'"
v-model="SearchformInline[index]"
:disabled="item.disabled"
clearable
style="width: 100%"
value-format="yyyy-MM-dd HH:mm"
format="yyyy-MM-dd HH:mm"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
<template v-else-if="item.type==='radio'">
<el-radio v-model="SearchformInline[index]" :label="item.option[0].value">{{ item.option[0].label }}</el-radio>
<el-radio v-model="SearchformInline[index]" :label="item.option[1].value">{{ item.option[1].label }}</el-radio>
</template>
</el-form-item>
</el-col>
</transition>
</template>
</el-row>
</el-col>
<el-col v-if="direction === 'row'" :span="4">
<el-form-item style="text-align: center">
<el-button size="mini" icon="el-icon-refresh" plain @click="clearSearchformInline"></el-button>
<el-button size="mini" type="primary" icon="el-icon-search" @click="onSubmit"></el-button>
</el-form-item>
</el-col>
<el-col v-else :span="3">
<el-form-item style="text-align: center">
<div class="flex-column" style="align-items: center;">
<el-button size="mini" type="primary" icon="el-icon-search" @click="onSubmit"></el-button>
<el-button size="mini" icon="el-icon-refresh" plain style="margin-left: 0;margin-top: 20px" @click="clearSearchformInline"></el-button>
<!-- <el-button v-if="data.length>7" size="mini" type="text" @click="handleFlag">{{ !flag? '':'' }}<i :class="icon" /></el-button>-->
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
// import Clickoutside from 'element-ui/src/utils/clickoutside'
export default {
name: 'Index',
// directives: { Clickoutside },
props: {
span: {
type: Number,
default: 8
},
data: {
type: Array,
default: () => []
},
title: {
type: String,
default: ''
},
//
direction: {
type: String,
default: 'column'
}
},
data() {
return {
showScreen: false,
flag: false,
icon: 'el-icon-caret-bottom',
SearchformInline: [],
Inline: {},
checked: []
}
},
computed: {
btnSpan() {
let spanLength = 0
let data = []
if (this.data.length <= 7 || this.flag) {
data = this.data
} else {
data = this.data.slice(0, 7)
}
data.forEach((item) => {
if (item.type === 'daterange' || item.type === 'datetimerange') {
spanLength = spanLength + 10
} else {
spanLength = spanLength + this.span
}
})
return (spanLength % 24) === 0 ? 24 : 6 // 24 - (spanLength % 24)
}
},
watch: {
data: { //
handler(newV, oldV) {
this.data = newV
this.data.forEach((item, index) => {
if (item.value) {
this.SearchformInline[index] = item.value
}
})
},
deep: true,
immediate: true
},
SearchformInline: {
handler(newV, oldV) {
this.SearchformInline = newV
this.getData()
this.$emit('getData', this.Inline)
},
deep: true,
immediate: true
}
},
methods: {
clearSearchformInline() {
this.SearchformInline = this.$options.data().SearchformInline
/* 异步操作*/
this.$emit('onClean')
},
handleClose(e) {
const tag = e.target.nodeName.toLowerCase()
if (tag !== 'svg' && tag !== 'span' && tag !== 'i' && tag !== 'button') { this.showScreen = false }
},
handleFlag() {
this.flag = !this.flag
if (!this.flag) {
this.icon = 'el-icon-caret-bottom'
} else {
this.icon = 'el-icon-caret-top'
}
},
/* 查询方法*/
onSubmit() {
/* 异步操作*/
// console.log(this.Inline)
this.$emit('onSearch', this.Inline, status => {
if (status) this.showScreen = false
})
},
selectAll(index) {
this.SearchformInline[index] = []
if (this.checked[index]) {
this.data[index].option.forEach((item) => {
this.SearchformInline[index].push(item.value)
})
} else {
this.SearchformInline[index] = []
}
this.getData()
this.$emit('getData', this.Inline)
},
changeSelect(val, index) {
this.checked[index] = val.length === this.data[index].option.length
},
getData() {
this.data.forEach((item, index) => {
this.Inline[item.model] = this.SearchformInline[index]
})
},
changeData(index, val) {
this.SearchformInline[index] = val
this.$set(this.SearchformInline, index, val)
this.getData()
},
onInputFocus(name, model) {
this.$emit(name, model)
}
}
}
</script>
<style scoped lang="scss">
.screen-body {
padding: 10px 20px;
background-color: white;
box-shadow:0 2px 12px 0 rgba(0,0,0,.1);
-webkit-box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
-moz-box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
border-radius: 8px;
.title {
font-weight: bold;
margin-top: 10px;
margin-bottom: 20px;
}
.screen-footer {
justify-content: flex-end;
padding-top: 20px;
.footer-button {
width: 120px;
}
}
}
::v-deep {
.el-form-item__label {
text-align: right !important;
}
}
</style>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save