hookehuyr

🎉 init: 初始化

Showing 99 changed files with 6891 additions and 0 deletions
1 +# port
2 +VITE_PORT = 8308
3 +
4 +# 反向代理服务器地址
5 +VITE_PROXY_TARGET = https://oa.onwall.cn
6 +
7 +# API请求前缀
8 +VITE_PROXY_PREFIX = /srv/
9 +
10 +# 打包输出文件夹名称
11 +VITE_OUTDIR = sku_request
12 +
13 +# 是否开启调试
14 +VITE_CONSOLE = 0
15 +
16 +# appID相关
17 +VITE_APPID=微信appID
1 +# 资源公共路径
2 +VITE_BASE = /
3 +
4 +# 测试open-id
5 +# VITE_OPENID = api-test-openid
6 +# VITE_OPENID = o8BRf1gLDWieH3Y3JvbrI_4IjaME
7 +# VITE_OPENID = oJLZq5t9PIKLW9tm1oSUNAuPwssA
8 +# VITE_OPENID = oJLZq5uT_6GwIh2tQWh1F9IoHZ3U
9 +VITE_OPENID =
10 +
11 +# B端账号
12 +VITE_ID = 13761653761
13 +
14 +# 验证码
15 +VITE_PIN =
16 +
17 +# 反向代理服务器地址
18 +# VITE_PROXY_TARGET = https://oa.anxinchashi.com/
19 +VITE_PROXY_TARGET = http://oa-dev.onwall.cn
20 +# VITE_PROXY_TARGET = https://www.wxgzjs.cn/
21 +
22 +# PC端地址
23 +VITE_MOBILE_URL = http://localhost:5173/
1 +###
2 + # @Date: 2024-07-23 10:29:03
3 + # @LastEditors: hookehuyr hookehuyr@gmail.com
4 + # @LastEditTime: 2024-07-26 18:06:52
5 + # @FilePath: /temple_material_request/.env.production
6 + # @Description: 文件描述
7 +###
8 +# 资源公共路径
9 +VITE_BASE = /f/main/sku_request/
10 +
11 +# 测试open-id
12 +VITE_APP_OPENID =
13 +
14 +# B端账号
15 +VITE_APP_ID =
16 +
17 +# 验证码
18 +VITE_APP_PIN =
19 +
20 +# 反向代理服务器地址
21 +VITE_PROXY_TARGET = http://oa.onwall.cn
22 +
23 +# PC端地址
24 +# VITE_MOBILE_URL = http://oa.onwall.cn/f/guanzong/web/
25 +# VITE_MOBILE_URL = http://guanzong.onwall.cn/f/guanzong/web/
1 +{
2 + "globals": {
3 + "EffectScope": true,
4 + "computed": true,
5 + "createApp": true,
6 + "customRef": true,
7 + "defineAsyncComponent": true,
8 + "defineComponent": true,
9 + "effectScope": true,
10 + "getCurrentInstance": true,
11 + "getCurrentScope": true,
12 + "h": true,
13 + "inject": true,
14 + "isProxy": true,
15 + "isReactive": true,
16 + "isReadonly": true,
17 + "isRef": true,
18 + "markRaw": true,
19 + "nextTick": true,
20 + "onActivated": true,
21 + "onBeforeMount": true,
22 + "onBeforeUnmount": true,
23 + "onBeforeUpdate": true,
24 + "onDeactivated": true,
25 + "onErrorCaptured": true,
26 + "onMounted": true,
27 + "onRenderTracked": true,
28 + "onRenderTriggered": true,
29 + "onScopeDispose": true,
30 + "onServerPrefetch": true,
31 + "onUnmounted": true,
32 + "onUpdated": true,
33 + "provide": true,
34 + "reactive": true,
35 + "readonly": true,
36 + "ref": true,
37 + "resolveComponent": true,
38 + "shallowReactive": true,
39 + "shallowReadonly": true,
40 + "shallowRef": true,
41 + "toRaw": true,
42 + "toRef": true,
43 + "toRefs": true,
44 + "triggerRef": true,
45 + "unref": true,
46 + "useAttrs": true,
47 + "useCssModule": true,
48 + "useCssVars": true,
49 + "useRoute": true,
50 + "useRouter": true,
51 + "useSlots": true,
52 + "watch": true,
53 + "watchEffect": true,
54 + "watchPostEffect": true,
55 + "watchSyncEffect": true
56 + }
57 +}
...\ No newline at end of file ...\ No newline at end of file
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-05-27 08:59:09
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2022-07-08 18:15:20
6 + * @FilePath: /tswj/.eslintrc.js
7 + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8 + */
9 +module.exports = {
10 + // parser: '@typescript-eslint/parser',
11 + parser: 'vue-eslint-parser',
12 + parserOptions: {
13 + parser: 'babel-eslint',
14 + // parser: '@typescript-eslint/parser',
15 + },
16 + extends: [
17 + // add more generic rule sets here, such as:
18 + // 'eslint:recommended',
19 + 'plugin:vue/vue3-recommended',
20 + './.eslintrc-auto-import.json'
21 + // 'plugin:vue/recommended' // Use this if you are using Vue.js 2.x.
22 + ],
23 + rules: {
24 + // override/add rules settings here, such as:
25 + // 'vue/no-unused-vars': 'error'
26 + "vue/max-attributes-per-line": ["error", {
27 + "singleline": {
28 + "max": 20
29 + },
30 + "multiline": {
31 + "max": 10
32 + }
33 + }],
34 + "vue/singleline-html-element-content-newline": 0, // 在单行元素的内容之前和之后需要换行符
35 + "vue/first-attribute-linebreak": 0, // 强制第一个属性需要换行
36 + "vue/multi-word-component-names": 0, // 要求组件名称始终为多字
37 + "vue/html-indent": 0, // 执行一致的缩进
38 + "vue/html-closing-bracket-newline": 0, // 在标签的右括号之前要求或禁止换行
39 + },
40 + overrides: [
41 + {
42 + files: ['*.ts'],
43 + parser: '@typescript-eslint/parser',
44 + plugins: ['@typescript-eslint'],
45 + extends: ['plugin:@typescript-eslint/recommended'],
46 + },
47 + ],
48 +}
1 +node_modules
2 +.DS_Store
3 +dist
4 +dist-ssr
5 +*.local
6 +.history
7 +doc
8 +.vscode
9 +publish.sh
10 +src/views/test/*
11 +src/store/test.js
12 +cypress
13 +src/test/mocha/test.js
14 +cypress.json
15 +src/test
16 +.idea
17 +sku_request
1 +{
2 + "esversion": 11,
3 + "asi": true
4 +}
...\ No newline at end of file ...\ No newline at end of file
1 +export function createProxy(prefix, target) {
2 + const ret = {};
3 + ret[prefix] = {
4 + target,
5 + changeOrigin: true,
6 + ws: true,
7 + // rewrite: (path) => path.replace(/^\/api/, '')
8 + // rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),
9 + }
10 + return ret
11 +}
1 +// generated by unplugin-vue-components
2 +// We suggest you to commit this file into source control
3 +// Read more: https://github.com/vuejs/core/pull/3399
4 +import '@vue/runtime-core'
5 +
6 +export {}
7 +
8 +declare module '@vue/runtime-core' {
9 + export interface GlobalComponents {
10 + AppointmentField: typeof import('./src/components/AppointmentField/index.vue')['default']
11 + AreaPickerField: typeof import('./src/components/AreaPickerField/index.vue')['default']
12 + ButtonField: typeof import('./src/components/ButtonField/index.vue')['default']
13 + CalendarField: typeof import('./src/components/CalendarField/index.vue')['default']
14 + CheckboxField: typeof import('./src/components/CheckboxField/index.vue')['default']
15 + ContactField: typeof import('./src/components/ContactField/index.vue')['default']
16 + CustomField: typeof import('./src/components/CustomField/index.vue')['default']
17 + DatePickerField: typeof import('./src/components/DatePickerField/index.vue')['default']
18 + DateTimePickerField: typeof import('./src/components/DateTimePickerField/index.vue')['default']
19 + DesField: typeof import('./src/components/DesField/index.vue')['default']
20 + DividerField: typeof import('./src/components/DividerField/index.vue')['default']
21 + EmailField: typeof import('./src/components/EmailField/index.vue')['default']
22 + FileUploaderField: typeof import('./src/components/FileUploaderField/index.vue')['default']
23 + GenderField: typeof import('./src/components/GenderField/index.vue')['default']
24 + GroupField: typeof import('./src/components/GroupField/index.vue')['default']
25 + IdentityField: typeof import('./src/components/IdentityField/index.vue')['default']
26 + ImageUploaderField: typeof import('./src/components/ImageUploaderField/index.vue')['default']
27 + LoginBox: typeof import('./src/components/LoginBox/index.vue')['default']
28 + MarqueeField: typeof import('./src/components/MarqueeField/index.vue')['default']
29 + MultiRuleField: typeof import('./src/components/MultiRuleField/index.vue')['default']
30 + MyComponent: typeof import('./src/components/AppointmentField/MyComponent.vue')['default']
31 + NameField: typeof import('./src/components/NameField/index.vue')['default']
32 + NoteField: typeof import('./src/components/NoteField/index.vue')['default']
33 + NumberField: typeof import('./src/components/NumberField/index.vue')['default']
34 + OrgPickerField: typeof import('./src/components/OrgPickerField/index.vue')['default']
35 + PhoneField: typeof import('./src/components/PhoneField/index.vue')['default']
36 + PickerField: typeof import('./src/components/PickerField/index.vue')['default']
37 + RadioField: typeof import('./src/components/RadioField/index.vue')['default']
38 + RatePickerField: typeof import('./src/components/RatePickerField/index.vue')['default']
39 + RouterLink: typeof import('vue-router')['RouterLink']
40 + RouterView: typeof import('vue-router')['RouterView']
41 + RuleField: typeof import('./src/components/RuleField/index.vue')['default']
42 + SignField: typeof import('./src/components/SignField/index.vue')['default']
43 + TableField: typeof import('./src/components/TableField/index.vue')['default']
44 + Test: typeof import('./src/components/LoginBox/test.vue')['default']
45 + TextareaField: typeof import('./src/components/TextareaField/index.vue')['default']
46 + TextField: typeof import('./src/components/TextField/index.vue')['default']
47 + TimePickerField: typeof import('./src/components/TimePickerField/index.vue')['default']
48 + VideoField: typeof import('./src/components/VideoField/index.vue')['default']
49 + VolunteerGroupField: typeof import('./src/components/VolunteerGroupField/index.vue')['default']
50 + }
51 +}
1 +<!--
2 + * @Date: 2023-02-13 14:56:34
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-07-16 16:12:12
5 + * @FilePath: /data-table/index.html
6 + * @Description: 文件描述
7 +-->
8 +<!DOCTYPE html>
9 +<html lang='zh'>
10 +<head>
11 + <meta charset="UTF-8">
12 + <!-- <link rel="icon" type="image/svg+xml" href="http://www.wxgzjs.cn/template/default/static/images/favicon.ico" /> -->
13 + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
14 + <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
15 + <meta http-equiv="Pragma" content="no-cache">
16 + <meta http-equiv="Expires" content="0">
17 + <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
18 + <title></title>
19 + <!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.compat.css" /> -->
20 +</head>
21 +<body>
22 + <div id="app"></div>
23 + <script src="https://cdn.ipadbiz.cn/custom_form/tinymce/tinymce.min.js"></script>
24 + <script type="module" src="/src/main.js"></script>
25 +</body>
26 +</html>
This diff could not be displayed because it is too large.
1 +{
2 + "name": "temple_material_request",
3 + "description": "西园寺物资申请系统",
4 + "version": "1.0.0",
5 + "scripts": {
6 + "dev": "vite",
7 + "start": "vite --host 0.0.0.0",
8 + "build": "vite build",
9 + "build-watch": "vite build --watch",
10 + "build-ts": "vue-tsc --noEmit && vite build",
11 + "serve": "vite preview",
12 + "cypress:open": "cypress open",
13 + "tar": "tar -czvpf dist.tar.gz sku_request",
14 + "build_tar": "npm run build && npm run tar",
15 + "scp-dev": "scp dist.tar.gz ipadbiz-inner:/opt/space-dev/f/main",
16 + "dec-dev": "ssh ipadbiz-inner 'cd /opt/space-dev/f/main && tar -xzvf dist.tar.gz && rm -rf dist.tar.gz'",
17 + "scp-oa": "scp dist.tar.gz ipadbiz-inner:/opt/oa/f/main",
18 + "dec-oa": "ssh ipadbiz-inner 'cd /opt/oa/f/main && tar -xzvf dist.tar.gz && rm -rf dist.tar.gz'",
19 + "scp-mituo": "scp dist.tar.gz itomix@ipadbiz.cn:/opt/mituo/f/main",
20 + "dec-mituo": "ssh itomix@ipadbiz.cn 'cd /opt/mituo/f/main && tar -xzvf dist.tar.gz && rm -rf dist.tar.gz'",
21 + "scp-guanzong": "scp dist.tar.gz itomix@ipadbiz.cn:/opt/guanzong/f/main",
22 + "dec-guanzong": "ssh itomix@ipadbiz.cn 'cd /opt/guanzong/f/main && tar -xzvf dist.tar.gz && rm -rf dist.tar.gz'",
23 + "scp-xys": "scp -P 12101 dist.tar.gz zhsy@oa.jcedu.org:/home/www/f/main",
24 + "dec-xys": "ssh -p 12101 zhsy@oa.jcedu.org 'cd /home/www/f/main && tar -xzvf dist.tar.gz && rm -rf dist.tar.gz'",
25 + "scp-zentea": "scp dist.tar.gz zentea@anxinchashi.com:/data/www/zentea/f/main",
26 + "dec-zentea": "ssh zentea@anxinchashi.com 'cd /data/www/zentea/f/main && tar -xzvf dist.tar.gz && rm -rf dist.tar.gz'",
27 + "remove_tar": "rm -rf dist.tar.gz",
28 + "remove_dist": "rm -rf sku_request",
29 + "dev_upload": "npm run build_tar && npm run scp-dev && npm run dec-dev && npm run remove_tar && npm run remove_dist",
30 + "oa_upload": "npm run build_tar && npm run scp-oa && npm run dec-oa && npm run remove_tar",
31 + "mituo_upload": "npm run build_tar && npm run scp-mituo && npm run dec-mituo && npm run remove_tar",
32 + "guanzong_upload": "npm run build_tar && npm run scp-guanzong && npm run dec-guanzong && npm run remove_tar",
33 + "xys_upload": "npm run build_tar && npm run scp-xys && npm run dec-xys && npm run remove_tar",
34 + "zentea_upload": "npm run build_tar && npm run scp-zentea && npm run dec-zentea && npm run remove_tar",
35 + "all_upload": "npm run dev_upload && npm run oa_upload"
36 + },
37 + "dependencies": {
38 + "@dedisuryadi/json-form-data": "^0.1.1",
39 + "@tinymce/tinymce-vue": "4.0.7",
40 + "@vant/area-data": "^1.3.1",
41 + "@vant/touch-emulator": "^1.4.0",
42 + "@vitejs/plugin-legacy": "^1.8.2",
43 + "@vueuse/core": "^8.5.0",
44 + "@wsfe/vue-tree": "^3.2.0",
45 + "animate.css": "^4.1.1",
46 + "browser-md5-file": "^1.1.1",
47 + "dayjs": "^1.11.3",
48 + "default-passive-events": "^2.0.0",
49 + "element-plus": "^2.8.1",
50 + "global": "^4.4.0",
51 + "html2canvas": "^1.4.1",
52 + "idcard": "^4.2.0",
53 + "jquery": "^3.6.0",
54 + "js-cookie": "^3.0.1",
55 + "js-sha1": "^0.6.0",
56 + "lodash": "^4.17.21",
57 + "moment": "^2.29.3",
58 + "mui-player": "^1.7.0",
59 + "sha1": "^1.1.1",
60 + "tinymce": "5.10.9",
61 + "typescript": "^4.7.3",
62 + "uuid": "^8.3.2",
63 + "vant": "^4.9.1",
64 + "vconsole": "^3.14.6",
65 + "vite-plugin-dynamic-import": "^0.9.6",
66 + "vite-plugin-mp": "^1.6.1",
67 + "vue": "3.2.36",
68 + "weixin-js-sdk": "^1.6.0"
69 + },
70 + "devDependencies": {
71 + "@types/jquery": "^3.5.14",
72 + "@types/lodash": "^4.14.182",
73 + "@types/moment": "^2.13.0",
74 + "@typescript-eslint/parser": "^5.27.1",
75 + "@vitejs/plugin-vue": "^2.3.3",
76 + "axios": "^0.27.2",
77 + "chai": "^4.3.6",
78 + "cypress": "^9.7.0",
79 + "eslint-plugin-vue": "^9.0.1",
80 + "less": "^4.1.2",
81 + "mocha": "^10.0.0",
82 + "pinia": "^2.0.14",
83 + "postcss-px-to-viewport": "^1.1.1",
84 + "qs": "^6.10.3",
85 + "tslint": "^6.1.3",
86 + "unplugin-auto-import": "^0.8.8",
87 + "unplugin-vue-components": "^0.23.0",
88 + "unplugin-vue-define-options": "^0.6.1",
89 + "vite": "^2.9.9",
90 + "vite-plugin-style-import": "1.4.1",
91 + "vue-esign": "^1.1.4",
92 + "vue-router": "^4.0.15"
93 + }
94 +}
1 +module.exports = {
2 + printWidth: 100, // 代码行的宽度,通用建议每行最大长度建议为100/120,但最好不超过这两个数。
3 + tabWidth: 2, // 指定每次缩进的空格数。
4 + semi: true, // 是否在代码语句结尾添加分号。
5 + vueIndentScriptAndStyle: true,
6 + singleQuote: true, // 是否使用单引号,JSX单独设置。
7 + trailingComma: 'all', // 在多行以逗号分割的句法中尽可能补充尾行逗号。
8 + bracketSpacing: true, // 是否在对象属性与大括号之间填充空格。
9 + bracketSameLine: false, // 开始标签的右尖括号是否跟随在最后一行属性末尾。
10 + proseWrap: 'never',
11 + htmlWhitespaceSensitivity: 'strict',
12 + endOfLine: 'auto', // 设置换行风格,避免不同操作系统造成的大量代码diff。
13 + singleAttributePerLine: false // 在Html,Vue,JSX中是否强制每条属性占用一行。
14 +};
1 +#!/usr/bin/env sh
2 +# -----------------------------------------------
3 +# Filename: publish.sh
4 +# Revision: 1.0
5 +# Date: 2022年5月20日
6 +# Author: Hooke
7 +# Description: **** 根据php项目相应特征书写项目发布流程
8 +# -----------------------------------------------
9 +
10 +# 当发生错误时中止脚本
11 +set -e
12 +
13 +# 本地Git服务器目录路径
14 +PHP_PATH=/Users/huyirui/program/itomix/git/isp/f/custom_form
15 +
16 +# 编译输出文件夹
17 +OUTPUT=sku_request
18 +
19 +# 打包
20 +npm run build
21 +
22 +# 移除Git服务器目录下项目文件夹
23 +rm -r $PHP_PATH"/${OUTPUT:?}"
24 +
25 +# 把本地编译输出文件夹添加到服务器目录
26 +mv "${OUTPUT:?}/" $PHP_PATH
27 +
28 +# 提交到Git服务器
29 +cd $PHP_PATH"/${OUTPUT:?}"
30 +git checkout custom_form
31 +git pull
32 +git add -A
33 +git commit -m '自定义表单-前端网页更新'
34 +git push
35 +
36 +git checkout develop;
37 +git pull origin develop;
38 +git merge --no-edit custom_form;
39 +git push origin develop;
40 +
41 +# 更新SSH服务器上文件
42 +ssh -p 22 itomix@ipadbiz.cn '
43 + cd /opt/space-dev/;
44 + git pull origin develop;
45 +'
46 +
47 +git checkout custom_form;
1 +#!/usr/bin/env sh
2 +# -----------------------------------------------
3 +# Filename: publish.sh
4 +# Revision: 1.0
5 +# Date: 2022年5月20日
6 +# Author: Hooke
7 +# Description: **** 根据php项目相应特征书写项目发布流程
8 +# -----------------------------------------------
9 +
10 +# 当发生错误时中止脚本
11 +set -e
12 +
13 +# 记录当前开发的绝对路径
14 +CURR_PATH=$(pwd)
15 +
16 +# 本地Git服务器目录路径
17 +PHP_PATH=/Users/huyirui/program/itomix/git/isp/f/custom_form
18 +
19 +# 编译输出文件夹
20 +output=sku_request
21 +
22 +# 打包
23 +rm -rf sku_request
24 +npm run build
25 +
26 +# 删除 PHP 项目里的编译产物
27 +cd $PHP_PATH
28 +git checkout custom_form
29 +rm -rf $PHP_PATH"/${output:?}"
30 +# 把编译产物复制到 PHP 项目
31 +cd $CURR_PATH
32 +cp -r "${output:?}/" $PHP_PATH"/${output:?}"
33 +
34 +# PHP 项目的编译产物提交到 Git 服务器
35 +cd $PHP_PATH
36 +git pull
37 +git add -A
38 +git commit -m '自定义表单-前端网页更新'
39 +git push
40 +
41 +# 更新其他分支数据
42 +# git checkout master
43 +# git pull origin master
44 +# git merge --no-edit custom_form
45 +# git push origin master
46 +
47 +# git checkout guanzong
48 +# git pull origin guanzong
49 +# git merge --no-edit custom_form
50 +# git push origin guanzong
51 +
52 +git checkout mituo
53 +git pull origin mituo
54 +git merge --no-edit custom_form
55 +git push origin mituo
56 +
57 +# ssh -p 22 itomix@ipadbiz.cn '
58 +# cd /opt/oa;
59 +# git pull origin master;
60 +# cd /opt/guanzong;
61 +# git pull origin guanzong;
62 +# cd /opt/mituo;
63 +# git pull origin mituo;
64 +# '
65 +ssh -p 22 itomix@ipadbiz.cn '
66 + cd /opt/mituo;
67 + git pull origin mituo;
68 +'
69 +
70 +git checkout custom_form;
1 +#!/usr/bin/env sh
2 +# -----------------------------------------------
3 +# Filename: publish.sh
4 +# Revision: 1.0
5 +# Date: 2022年5月20日
6 +# Author: Hooke
7 +# Description: DEV环境已经打包推送后,编译产物存在。
8 +# -----------------------------------------------
9 +
10 +# 当发生错误时中止脚本
11 +set -e
12 +
13 +# 本地Git服务器目录路径
14 +PHP_PATH=/Users/huyirui/program/itomix/git/isp/f/custom_form
15 +
16 +# 更新其他分支数据
17 +cd $PHP_PATH
18 +git checkout master
19 +git pull origin master
20 +git merge --no-edit custom_form
21 +git push origin master
22 +
23 +git checkout guanzong
24 +git pull origin guanzong
25 +git merge --no-edit custom_form
26 +git push origin guanzong
27 +
28 +git checkout mituo
29 +git pull origin mituo
30 +git merge --no-edit custom_form
31 +git push origin mituo
32 +
33 +ssh -p 22 itomix@ipadbiz.cn '
34 + cd /opt/oa;
35 + git pull origin master;
36 + cd /opt/guanzong;
37 + git pull origin guanzong;
38 + cd /opt/mituo;
39 + git pull origin mituo;
40 +'
41 +
42 +git checkout custom_form;
1 +export interface commentListType {
2 + id: string;
3 + avatar: string;
4 + name: string;
5 + kg_name: string;
6 + comment_time: string;
7 + note: string;
8 + c_action: string;
9 + c_name: string;
10 + cover: string;
11 + prod_id: string;
12 + perf_id: string;
13 + book_id: string;
14 + perf_name: string;
15 + book_name: string;
16 + localism_type: string;
17 + is_new: number;
18 +}
1 +<!--
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-05-26 23:52:36
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2024-09-06 17:27:15
6 + * @FilePath: /custom_table/src/App.vue
7 + * @Description:
8 +-->
9 +<template>
10 + <router-view></router-view>
11 +</template>
12 +
13 +<script setup>
14 +import { mainStore, useTitle } from "@/utils/generatePackage";
15 +import { computed, watchEffect, onMounted } from "vue";
16 +import { useRoute, useRouter } from "vue-router";
17 +import { Toast } from "vant";
18 +// 会根据配置判断是否显示调试控件
19 +// eslint-disable-next-line no-unused-vars
20 +import vConsole from "@/utils/vconsole";
21 +// 初始化WX环境
22 +import wx from 'weixin-js-sdk'
23 +import { wxJsAPI } from '@/api/wx/config'
24 +import { apiList } from '@/api/wx/jsApiList.js'
25 +import { wxInfo, getUrlParams, stringifyQuery } from "@/utils/tools";
26 +import { styleColor } from "@/constant.js";
27 +import { getFormSettingAPI } from "@/api/form.js";
28 +import { showDialog, showConfirmDialog } from 'vant';
29 +import fp3 from '@/utils/fp3';
30 +import { Updater } from '@/utils/versionUpdater';
31 +
32 +// 使用 include + pinia 状态管理动态缓存页面
33 +const store = mainStore();
34 +const keepPages = computed(() => store.getKeepPages);
35 +
36 +const $route = useRoute();
37 +// watchEffect(() => useTitle("表单标题"));
38 +// 监听路由变化
39 +// 切换路由页面返回顶部
40 +const $router = useRouter();
41 +
42 +onMounted(async () => {
43 +
44 + // TAG:检查是否更新
45 + if (import.meta.env.PROD) {
46 + const upDater = new Updater({
47 + time: 30000
48 + })
49 + upDater.on('no-update', () => {
50 + // console.log('还没更新')
51 + })
52 + upDater.on('update', () => {
53 + showConfirmDialog({
54 + title: '温馨提示',
55 + message: '检测到新版本,是否刷新页面!',
56 + confirmButtonColor: styleColor.baseColor
57 + }).then(() => {
58 + window.location.reload();
59 + });
60 + })
61 + }
62 +});
63 +</script>
64 +
65 +<style lang="less">
66 +@prefix: ~"@{namespace}-x";
67 +
68 +html,
69 +body {
70 + width: 100%;
71 + // height: 100%;
72 + color: @base-font-color;
73 + // background-color: #f7f8fa;
74 + // background-color: #fff9ef;
75 + padding: 0;
76 + margin: 0;
77 +}
78 +
79 +body {
80 + position: relative;
81 + // display: flex;
82 + // justify-content: center;
83 +
84 + p {
85 + margin: 0;
86 + padding: 0;
87 + }
88 +}
89 +
90 +#app {
91 + min-height: calc(100vh);
92 + // max-width: 800px;
93 + position: relative;
94 +}
95 +
96 +.@{prefix} {
97 + color: red;
98 +}
99 +
100 +.global-center {
101 + position: relative;
102 + top: 50%;
103 + transform: translateY(-50%);
104 +}
105 +
106 +.zIndex {
107 + z-index: 4500 !important;
108 +}
109 +</style>
1 +/*
2 + * @Date: 2022-06-17 14:54:29
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-12-01 16:26:27
5 + * @FilePath: /data-table/src/api/common.js
6 + * @Description: 通用接口
7 + */
8 +import { fn, fetch, uploadFn } from '@/api/fn';
9 +
10 +const Api = {
11 + SMS: '/srv/?a=sms',
12 + TOKEN: '/srv/?a=upload',
13 + SAVE_FILE: '/srv/?a=upload&t=save_file',
14 +}
15 +
16 +/**
17 + * @description: 发送验证码
18 + * @param {*} phone 手机号码
19 + * @returns
20 + */
21 +export const smsAPI = (params) => fn(fetch.post(Api.SMS, params));
22 +
23 +/**
24 + * @description: 获取七牛token
25 + * @returns
26 + */
27 +export const qiniuTokenAPI = (params) => fn(fetch.stringifyPost(Api.TOKEN, params));
28 +
29 +/**
30 + * @description: 上传七牛
31 + * @param {*}
32 + * @returns
33 + */
34 +export const qiniuUploadAPI = (url, data, config) => uploadFn(fetch.basePost(url, data, config));
35 +
36 +/**
37 + * @description: 保存图片
38 + * @param {*} format
39 + * @param {*} hash
40 + * @param {*} height
41 + * @param {*} width
42 + * @param {*} filekey
43 + * @returns
44 + */
45 +export const saveFileAPI = (params) => fn(fetch.stringifyPost(Api.SAVE_FILE, params));
1 +/*
2 + * @Date: 2022-06-17 14:54:29
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-06-05 10:12:06
5 + * @FilePath: /data-table/src/api/component.js
6 + * @Description: 组件接口
7 + */
8 +import { fn, fetch } from '@/api/fn';
9 +
10 +const Api = {
11 + QUERY_COMPONENT: '/srv/?a=query_component',
12 + FLOW_DEPT_LIST: '/srv/?a=flow_setting&t=flow_dept_list',
13 + FLOW_ROLE_LIST: '/srv/?a=flow_setting&t=flow_role_list',
14 + SEARCH_USER_DEPT_ROLE: '/srv/?a=flow_setting&t=search_user_dept_role',
15 +}
16 +
17 +/**
18 + * @description: 查询组件
19 + * @param: group_code 分组标识
20 + * @param: component_code 组件标识
21 + * @param: name 组件名称;条件:模糊查询;
22 + */
23 +export const getComponentAPI = (params) => fn(fetch.get(Api.QUERY_COMPONENT, params));
24 +
25 +/**
26 + * @description: 查询部门列表
27 + * @param: form_code 表单code
28 + */
29 +export const getFlowDeptListAPI = (params) => fn(fetch.get(Api.FLOW_DEPT_LIST, params));
30 +
31 +/**
32 + * @description: 查询角色列表
33 + * @param: form_code 表单code
34 + */
35 +export const getFlowRoleListAPI = (params) => fn(fetch.get(Api.FLOW_ROLE_LIST, params));
36 +
37 +/**
38 + * @description: 查询用户部门角色
39 + * @param: form_code 表单code
40 + * @param: word 搜索内容
41 + */
42 +export const searchUserDeptRoleAPI = (params) => fn(fetch.get(Api.SEARCH_USER_DEPT_ROLE, params));
1 +/*
2 + * @Date: 2022-06-17 14:54:29
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-07-04 17:05:30
5 + * @FilePath: /data-table/src/api/data.js
6 + * @Description: 表单数据接口
7 + */
8 +import { fn, fetch } from '@/api/fn';
9 +
10 +const Api = {
11 + ADD_FORM_DATA: '/srv/?a=add_formdata',
12 + QUERY_FORM_DATA: '/srv/?a=query_formdata',
13 + MODI_FORM_DATA: '/srv/?a=modi_formdata',
14 + FLOW_FORM_DATA: '/srv/?a=flow_formdata',
15 +}
16 +/**
17 + * @description: 添加表单数据
18 + * @param: form_code 表单唯一标识
19 + * @param: data 待添加的数据,json对象结构;键值对记录变更的字段和值;
20 + */
21 +export const addFormDataAPI = (params) => fn(fetch.post(Api.ADD_FORM_DATA, params));
22 +
23 +/**
24 + * @description: 查询表单数据
25 + * @param: form_code 表单唯一标识
26 + * @param: id 数据ID
27 + */
28 +export const queryFormDataAPI = (params) => fn(fetch.get(Api.QUERY_FORM_DATA, params));
29 +
30 +/**
31 + * @description: 修改表单数据
32 + * @param: form_code 表单唯一标识
33 + * @param: id 数据ID
34 + * @param: data 待添加的数据,json对象结构;键值对记录变更的字段和值;
35 + */
36 +export const modiFormDataAPI = (params) => fn(fetch.post(Api.MODI_FORM_DATA, params));
37 +
38 +/**
39 + * @description: 流程表单数据
40 + * @param: form_code 表单唯一标识
41 + * @param: data_id 数据ID
42 + * @param: data 待添加的数据,json对象结构;键值对记录变更的字段和值;
43 + * @param: flow_node_code 流程节点
44 + * @param: flow_node_action_id 用户点击的流程节点按钮ID
45 + * @param: flow_content 流程审批的文本意见
46 + */
47 +export const flowFormDataAPI = (params) => fn(fetch.post(Api.FLOW_FORM_DATA, params));
1 +/*
2 + * @Date: 2022-05-18 22:56:08
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2023-02-10 15:13:01
5 + * @FilePath: /data-table/src/api/fn.js
6 + * @Description: 文件描述
7 + */
8 +import axios from '@/utils/axios';
9 +import qs from 'Qs'
10 +import { showSuccessToast, showFailToast } from 'vant';
11 +
12 +/**
13 + * 网络请求功能函数
14 + * @param {*} api 请求axios接口
15 + * @returns 请求成功后,获取数据
16 + */
17 +export const fn = (api) => {
18 + return api
19 + .then(res => {
20 + if (res.data.code === 1) {
21 + return res.data || true;
22 + } else {
23 + // tslint:disable-next-line: no-console
24 + // if (!res.data.show) return false;
25 + showFailToast(res.data.msg);
26 + return false;
27 + }
28 + })
29 + .catch(err => {
30 + // tslint:disable-next-line: no-console
31 + console.error(err);
32 + return false;
33 + })
34 + .finally(() => { // 最终执行
35 + })
36 +}
37 +
38 +/**
39 + * 七牛返回格式
40 + * @param {*} api
41 + * @returns
42 + */
43 +export const uploadFn = (api) => {
44 + return api
45 + .then(res => {
46 + if (res.status === 200) {
47 + return res.data || true;
48 + } else {
49 + // tslint:disable-next-line: no-console
50 + console.warn(res);
51 + if (!res.data.show) return false;
52 + Toast({
53 + icon: 'close',
54 + message: res.data.msg,
55 + });
56 + return false;
57 + }
58 + })
59 + .catch(err => {
60 + // tslint:disable-next-line: no-console
61 + console.error(err);
62 + return false;
63 + })
64 +}
65 +
66 +/**
67 + * 统一 GET/POST 不同传参形式
68 + */
69 +export const fetch = {
70 + get: function (api, params) {
71 + return axios.get(api, { params })
72 + },
73 + post: function (api, params) {
74 + return axios.post(api, params)
75 + },
76 + stringifyPost: function (api, params) {
77 + return axios.post(api, qs.stringify(params))
78 + },
79 + basePost: function (url, data, config) {
80 + return axios.post(url, data, config)
81 + }
82 +}
1 +/*
2 + * @Date: 2022-06-17 14:54:29
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2023-02-07 13:23:19
5 + * @FilePath: /data-table/src/api/form.js
6 + * @Description: 表单接口
7 + */
8 +import { fn, fetch } from '@/api/fn';
9 +
10 +const Api = {
11 + FORM_ADD: '/srv/?a=add_form',
12 + FORM_QUERY: '/srv/?a=query_form_all_field',
13 + ADD_FORM_FIELD: '/srv/?a=add_form_field',
14 + ADD_FORM_SETTING: '/srv/?a=add_form_setting',
15 + QUERY_FORM_SETTING: '/srv/?a=query_form_setting',
16 + VERIFY_PASSWORD: '/srv/?a=verify_password',
17 +};
18 +
19 +/**
20 + * @description: 新增表单
21 + * @param: client_id 主体客户id
22 + * @param: name 表单名称
23 + * @param: note 表单描述
24 + */
25 +export const addFormAPI = (params) => fn(fetch.post(Api.FORM_ADD, params));
26 +
27 +/**
28 + * @description: 查询表单
29 + * @param: client_id 主体客户id
30 + * @param: form_code 表单唯一标识
31 + * @param: name 表单名称,模糊查询
32 + */
33 +export const queryFormAPI = (params) => fn(fetch.get(Api.FORM_QUERY, params));
34 +
35 +/**
36 + * @description: 添加表单字段
37 + * @param: form_code 表单唯一标识
38 + * @param: component_code 组件标识
39 + */
40 +export const addFormFieldAPI = (params) => fn(fetch.post(Api.ADD_FORM_FIELD, params));
41 +
42 +/**
43 + * @description: 添加或修改表单字段属性设置
44 + * @param: form_code 表单唯一标识
45 + * @param: field_name 表单字段名。如果设置表单级(非字段级)的属性,可为空。
46 + * @param: component_code 组件标识
47 + * @param: property_code 属性标识
48 + * @param: setting_value 待设置的属性值。json数组,内部必须双引号。如果属性值是单值,数组只有一个元素。
49 + */
50 +export const addFormSettingAPI = (params) => fn(fetch.post(Api.ADD_FORM_SETTING, params));
51 +
52 +/**
53 + * @description: 查询表单的设置类组件的属性值
54 + * @param: form_code 表单唯一标识
55 + * @returns: enable 开启/停止表单 0=停止表单,1=开启表单
56 + * @returns: is_time_range 是否设定开启/停止时间 0=不设定,1=设定
57 + * @returns: is_count_down 是否显示停止倒计时 0=不显示,1-显示
58 + * @returns: begin_time 开启时间
59 + * @returns: end_time 停止时间
60 + */
61 +export const getFormSettingAPI = (params) => fn(fetch.get(Api.QUERY_FORM_SETTING, params));
62 +
63 +/**
64 + * @description: 验证便当密码
65 + * @param: form_code 表单唯一标识
66 + * @param: mmtx_password 用户输入的密码
67 + * @returns:
68 + */
69 +export const postVerifyPasswordAPI = (params) => fn(fetch.post(Api.VERIFY_PASSWORD, params));
1 +/*
2 + * @Date: 2022-06-17 14:54:29
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-11-17 13:46:01
5 + * @FilePath: /data-table/src/api/index.js
6 + * @Description: 首页接口
7 + */
8 +import { fn, fetch } from '@/api/fn';
9 +
10 +const Api = {
11 + INDEX: '/srv/?a=home_page',
12 +}
13 +/**
14 + * @description: 首页接口
15 + * @returns HOMEBANNER 轮播区
16 + * @returns HOMEZIXUN 观宗资讯
17 + * @returns HOMEVIDEO 视频展示
18 + * @returns HOMEKAISHI 本源法师开示
19 + * @returns spec_list 专题报告
20 + */
21 +export const indexAPI = (params) => fn(fetch.get(Api.INDEX, params));
1 +/*
2 + * @Date: 2022-06-17 14:54:29
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-07-26 11:34:18
5 + * @FilePath: /temple_material_request/src/api/material.js
6 + * @Description: 物资申请接口
7 + */
8 +import { fn, fetch } from '@/api/fn';
9 +
10 +const Api = {
11 + ACTIVITY_DEPTS: '/srv/?a=activity_depts',
12 + GOOD_USE_LIST: '/srv/?a=good_use_list',
13 + CART_LIST: '/srv/?a=cart_list',
14 + CART_ADD: '/srv/?a=cart_add',
15 + CART_EDIT: '/srv/?a=cart_edit',
16 + CART_DEL: '/srv/?a=cart_del',
17 + MY_DEPTS: '/srv/?a=my_depts',
18 + MY_USER: '/srv/?a=my_user',
19 + USE_ORDER_ADD: '/srv/?a=use_order_add',
20 + SKU_LIST: '/srv/?a=sku_list',
21 + SKU_INFO: '/srv/?a=sku_info',
22 +};
23 +
24 +/**
25 + * @description: 获取活动组别列表
26 + * @param: activity_id 活动ID
27 + * @param: is_previous 是否获取同类型上次活动的部门列表。1=是,0=否
28 + * @param: only_my_dept 是否只获取我所在的部门列表。1=是,0=否
29 + * @returns: dept_id 活动组别ID
30 + * @returns: dept_name 活动组别名称
31 + */
32 +export const getActivityDeptsAPI = (params) => fn(fetch.get(Api.ACTIVITY_DEPTS, params));
33 +
34 +/**
35 + * @description: 获取组别领用的物资列表
36 + * @param: activity_id 活动ID
37 + * @param: dept_id 活动组别ID
38 + * @param: is_previous 是否获取同类型上次活动的部门列表。1=是,0=否
39 + * @param: offset
40 + * @param: limit
41 + */
42 +export const getGoodUseListAPI = (params) => fn(fetch.get(Api.GOOD_USE_LIST, params));
43 +
44 +/**
45 + * @description: 获取购物车列表
46 + * @param: activity_id 活动ID
47 + * @returns: good_id 物资ID
48 + * @returns: product_name 物资名称
49 + * @returns: spec 物资规格
50 + * @returns: apply_number 申请数量
51 + */
52 +export const getCartListAPI = (params) => fn(fetch.get(Api.CART_LIST, params));
53 +
54 +/**
55 + * @description: 加入购物车
56 + * @param: activity_id 活动ID
57 + */
58 +export const addCartAPI = (params) => fn(fetch.post(Api.CART_ADD, params));
59 +
60 +/**
61 + * @description: 编辑购物车
62 + * @param: activity_id 活动ID
63 + * @param: good_list [{good_id,apply_number}]
64 + */
65 +export const editCartAPI = (params) => fn(fetch.post(Api.CART_EDIT, params));
66 +
67 +/**
68 + * @description: 删除购物车
69 + * @param: activity_id 活动ID
70 + * @param: good_ids 物资ID数组
71 + */
72 +export const delCartAPI = (params) => fn(fetch.post(Api.CART_DEL, params));
73 +
74 +/**
75 + * @description: 获取我的组别列表
76 + * @returns: dept_id 活动组别ID
77 + * @returns: dept_name 活动组别名称
78 + */
79 +export const myDeptsAPI = (params) => fn(fetch.get(Api.MY_DEPTS, params));
80 +
81 +/**
82 + * @description: 获取我的用户信息
83 + * @param: contact_name 领用人姓名
84 + * @param: contact_phone 领用人电话
85 + */
86 +export const myUserAPI = (params) => fn(fetch.get(Api.MY_USER, params));
87 +
88 +/**
89 + * @description: 提交物资申领
90 + * @param: activity_id 活动ID
91 + * @param: dept_id 活动的组别ID
92 + * @param: contact_name 领用人姓名
93 + * @param: contact_phone 领用人电话
94 + * @param: use_time 使用时间
95 + * @param: good_list [good_id 物资ID, apply_number 申请数量] 如果为空,就自动查询购物车中的物资
96 + */
97 +export const addUseOrderAPI = (params) => fn(fetch.post(Api.USE_ORDER_ADD, params));
98 +
99 +/**
100 + * @description: 规格物资列表
101 + * @param: k 搜索物资的名称和规格
102 + * @param: exclude_activity_id 活动ID
103 + * @param: offset
104 + * @param: limit
105 + */
106 +export const getSkuListAPI = (params) => fn(fetch.get(Api.SKU_LIST, params));
107 +
108 +/**
109 + * @description: 规格物资详情
110 + * @param: i 规格物资ID
111 + */
112 +export const getSkuInfoAPI = (params) => fn(fetch.get(Api.SKU_INFO, params));
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-06-09 13:32:44
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2023-02-23 18:42:57
6 + * @FilePath: /data-table/src/api/wx/config.js
7 + * @Description:
8 + */
9 +import { fn, fetch } from '@/api/fn';
10 +
11 +const Api = {
12 + WX_JSAPI: '/srv/?a=wx_share',
13 +}
14 +
15 +/**
16 + * @description 获取微信CONFIG配置文件
17 + * @param {*} url
18 + * @returns {*} cfg
19 + */
20 +export const wxJsAPI = (params) => fn(fetch.get(Api.WX_JSAPI, params));
1 +/*
2 + * @Date: 2022-06-13 14:18:57
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-06-13 14:27:21
5 + * @FilePath: /tswj/src/api/wx/jsApiList.js
6 + * @Description: 文件描述
7 + */
8 +export const apiList = [
9 + // "updateAppMessageShareData",
10 + // "updateTimelineShareData",
11 + "onMenuShareTimeline",
12 + "onMenuShareAppMessage",
13 + "onMenuShareQQ",
14 + "onMenuShareWeibo",
15 + "onMenuShareQZone",
16 + "startRecord",
17 + "stopRecord",
18 + "onVoiceRecordEnd",
19 + "playVoice",
20 + "pauseVoice",
21 + "stopVoice",
22 + "onVoicePlayEnd",
23 + "uploadVoice",
24 + "downloadVoice",
25 + "chooseImage",
26 + "previewImage",
27 + "uploadImage",
28 + "downloadImage",
29 + "translateVoice",
30 + "getNetworkType",
31 + "openLocation",
32 + "getLocation",
33 + "hideOptionMenu",
34 + "showOptionMenu",
35 + "hideMenuItems",
36 + "showMenuItems",
37 + "hideAllNonBaseMenuItem",
38 + "showAllNonBaseMenuItem",
39 + "closeWindow",
40 + "scanQRCode",
41 + "chooseWXPay",
42 + "openProductSpecificView",
43 + "addCard",
44 + "chooseCard",
45 + "openCard"
46 +]
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-06-09 13:32:44
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2022-06-09 13:42:06
6 + * @FilePath: /tswj/src/api/wx/config.js
7 + * @Description:
8 + */
9 +import { fn, fetch } from '@/api/fn';
10 +
11 +const Api = {
12 + WX_PAY: 'c/bill_paymentForBill.do',
13 +}
14 +
15 +/**
16 + * @description 微信支付接口
17 + * @param {*}
18 + * @returns {*}
19 + */
20 +export const wxPayAPI = (params) => fn(fetch.get(Api.WX_PAY, params));
1 +
2 +.modify-top {
3 + z-index: 36;
4 + position: absolute;
5 + left: 0;
6 + top: 0;
7 + width: 100%;
8 + height: 10px;
9 + background-image: url('http://gyzs.onwall.cn/top-xian%402x.png');
10 + background-size: contain;
11 +}
12 +.content-bg {
13 + /**
14 + * background-color and background-image 共存,不能使用渐变色
15 + * 图片铺平当时精度提高看看效果
16 + * 直接用渐变色
17 + * 不使用渐变色背景
18 + */
19 + height: 100%;
20 + min-height: 100vh;
21 + // background-image: url('@images/bg-yellow-duan@2x.png');
22 + background-image: url('http://gyzs.onwall.cn/bg-yellow-duan%402x.png');
23 + // background-size: cover;
24 + // background: linear-gradient(360deg, #FDD347 0%, #FFED6D 100%) ;
25 +}
1 +@namespace: 'wxggzs';
2 +
3 +/* ============ 颜色 ============ */
4 +
5 +// 主色调
6 +@base-color: #8F652E;
7 +
8 +// 文字颜色
9 +@base-font-color: #333333;
10 +@sub-font-color: #999999;
11 +
12 +// 定义一个映射
13 +#colors() {
14 + base-color: @base-color;
15 + base-font-color: @base-font-color;
16 +}
17 +
18 +// 混合
19 +.width100 {
20 + width: 100%;
21 +}
22 +
23 +.van-multi-ellipsis--l4 {
24 + display: -webkit-box;
25 + overflow: hidden;
26 + text-overflow: ellipsis;
27 + -webkit-line-clamp: 4;
28 + -webkit-box-orient: vertical;
29 +}
30 +
31 +.van-multi-ellipsis--l5 {
32 + display: -webkit-box;
33 + overflow: hidden;
34 + text-overflow: ellipsis;
35 + -webkit-line-clamp: 5;
36 + -webkit-box-orient: vertical;
37 +}
38 +
39 +.van-multi-ellipsis--l6 {
40 + display: -webkit-box;
41 + overflow: hidden;
42 + text-overflow: ellipsis;
43 + -webkit-line-clamp: 6;
44 + -webkit-box-orient: vertical;
45 +}
46 +
47 +// 自定义图片显示
48 +:deep(.van-image.custom-image) {
49 + img {
50 + border-radius: 5px;
51 + }
52 +}
53 +
54 +.multi-ellipsis--l1 {
55 + display: -webkit-box;
56 + overflow: hidden;
57 + text-overflow: ellipsis;
58 + -webkit-line-clamp: 1;
59 + -webkit-box-orient: vertical;
60 +}
61 +
62 +.multi-ellipsis--l2 {
63 + display: -webkit-box;
64 + overflow: hidden;
65 + text-overflow: ellipsis;
66 + -webkit-line-clamp: 2;
67 + -webkit-box-orient: vertical;
68 +}
69 +
70 +.multi-ellipsis--l3 {
71 + display: -webkit-box;
72 + overflow: hidden;
73 + text-overflow: ellipsis;
74 + -webkit-line-clamp: 3;
75 + -webkit-box-orient: vertical;
76 +}
77 +
78 +.multi-ellipsis--l4 {
79 + display: -webkit-box;
80 + overflow: hidden;
81 + text-overflow: ellipsis;
82 + -webkit-line-clamp: 4;
83 + -webkit-box-orient: vertical;
84 +}
85 +
86 +.multi-ellipsis--l5 {
87 + display: -webkit-box;
88 + overflow: hidden;
89 + text-overflow: ellipsis;
90 + -webkit-line-clamp: 5;
91 + -webkit-box-orient: vertical;
92 +}
93 +
94 +.multi-ellipsis--l6 {
95 + display: -webkit-box;
96 + overflow: hidden;
97 + text-overflow: ellipsis;
98 + -webkit-line-clamp: 6;
99 + -webkit-box-orient: vertical;
100 +}
1 +// Generated by 'unplugin-auto-import'
2 +export {}
3 +declare global {
4 + const EffectScope: typeof import('vue')['EffectScope']
5 + const computed: typeof import('vue')['computed']
6 + const createApp: typeof import('vue')['createApp']
7 + const customRef: typeof import('vue')['customRef']
8 + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
9 + const defineComponent: typeof import('vue')['defineComponent']
10 + const effectScope: typeof import('vue')['effectScope']
11 + const getCurrentInstance: typeof import('vue')['getCurrentInstance']
12 + const getCurrentScope: typeof import('vue')['getCurrentScope']
13 + const h: typeof import('vue')['h']
14 + const inject: typeof import('vue')['inject']
15 + const isProxy: typeof import('vue')['isProxy']
16 + const isReactive: typeof import('vue')['isReactive']
17 + const isReadonly: typeof import('vue')['isReadonly']
18 + const isRef: typeof import('vue')['isRef']
19 + const markRaw: typeof import('vue')['markRaw']
20 + const nextTick: typeof import('vue')['nextTick']
21 + const onActivated: typeof import('vue')['onActivated']
22 + const onBeforeMount: typeof import('vue')['onBeforeMount']
23 + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
24 + const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
25 + const onDeactivated: typeof import('vue')['onDeactivated']
26 + const onErrorCaptured: typeof import('vue')['onErrorCaptured']
27 + const onMounted: typeof import('vue')['onMounted']
28 + const onRenderTracked: typeof import('vue')['onRenderTracked']
29 + const onRenderTriggered: typeof import('vue')['onRenderTriggered']
30 + const onScopeDispose: typeof import('vue')['onScopeDispose']
31 + const onServerPrefetch: typeof import('vue')['onServerPrefetch']
32 + const onUnmounted: typeof import('vue')['onUnmounted']
33 + const onUpdated: typeof import('vue')['onUpdated']
34 + const provide: typeof import('vue')['provide']
35 + const reactive: typeof import('vue')['reactive']
36 + const readonly: typeof import('vue')['readonly']
37 + const ref: typeof import('vue')['ref']
38 + const resolveComponent: typeof import('vue')['resolveComponent']
39 + const shallowReactive: typeof import('vue')['shallowReactive']
40 + const shallowReadonly: typeof import('vue')['shallowReadonly']
41 + const shallowRef: typeof import('vue')['shallowRef']
42 + const toRaw: typeof import('vue')['toRaw']
43 + const toRef: typeof import('vue')['toRef']
44 + const toRefs: typeof import('vue')['toRefs']
45 + const triggerRef: typeof import('vue')['triggerRef']
46 + const unref: typeof import('vue')['unref']
47 + const useAttrs: typeof import('vue')['useAttrs']
48 + const useCssModule: typeof import('vue')['useCssModule']
49 + const useCssVars: typeof import('vue')['useCssVars']
50 + const useRoute: typeof import('vue-router')['useRoute']
51 + const useRouter: typeof import('vue-router')['useRouter']
52 + const useSlots: typeof import('vue')['useSlots']
53 + const watch: typeof import('vue')['watch']
54 + const watchEffect: typeof import('vue')['watchEffect']
55 + const watchPostEffect: typeof import('vue')['watchPostEffect']
56 + const watchSyncEffect: typeof import('vue')['watchSyncEffect']
57 +}
1 +/**
2 + * 判断多行省略文本
3 + * @param {*} id 目标dom标签
4 + * @returns
5 + */
6 +const hasEllipsis = (id) => {
7 + let oDiv = document.getElementById(id);
8 + let flag = false
9 + if (oDiv.scrollHeight > oDiv.clientHeight) {
10 + flag = true
11 + }
12 + return flag
13 +}
14 +
15 +export default {
16 + hasEllipsis
17 +}
...\ No newline at end of file ...\ No newline at end of file
1 +import { ref } from 'vue'
2 +import { useBrowserLocation, useEventListener, useTitle, useUrlSearchParams, useWindowScroll, logicAnd } from '@vueuse/core'
3 +export const fn = () => {
4 + // const location = useBrowserLocation()
5 + // console.warn(location.value);
6 +
7 + // useEventListener(window, 'scroll', (evt) => {
8 + // const { x, y } = useWindowScroll()
9 + // // console.warn(x.value);
10 + // console.warn(y.value);
11 + // })
12 +
13 + // useTitle('New Title')
14 +
15 + const a = ref(true)
16 + const b = ref(true)
17 + const flag = a.value && b.value
18 + console.warn(flag);
19 +
20 +}
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-05-17 12:13:13
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2022-07-19 10:33:36
6 + * @FilePath: /front/src/composables/index.js
7 + * @Description:
8 + */
9 +import { onMounted, onUnmounted } from 'vue'
10 +
11 +/**
12 + * 添加和清除 DOM 事件监听器
13 + * @param {*} target
14 + * @param {*} event
15 + * @param {*} callback
16 + */
17 +export function useEventListener(target, event, callback) {
18 + onMounted(() => target?.addEventListener(event, callback))
19 + onUnmounted(() => target?.removeEventListener(event, callback))
20 +}
1 +/*
2 + * @Date: 2022-06-13 17:42:32
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2023-03-03 17:51:55
5 + * @FilePath: /data-table/src/composables/useShare.js
6 + * @Description: 文件描述
7 + */
8 +import wx from 'weixin-js-sdk';
9 +// import { Toast } from 'vant';
10 +
11 +/**
12 + * @description: 微信分享功能
13 + * @param {*} title 标题
14 + * @param {*} desc 描述
15 + * @param {*} imgUrl 图标
16 + * @return {*}
17 + */
18 +export const sharePage = ({title = '自定义表单', desc = '数据收集', imgUrl = ''}) => {
19 + const shareData = {
20 + title, // 分享标题
21 + desc, // 分享描述
22 + link: location.origin + location.pathname + location.hash, // 分享链接,该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
23 + imgUrl, // 分享图标
24 + success: function () {
25 + console.warn('设置成功');
26 + }
27 + }
28 + // 分享好友(微信好友或qq好友)
29 + // wx.updateAppMessageShareData(shareData);
30 + wx.onMenuShareAppMessage(shareData);
31 + // 分享到朋友圈或qq空间
32 + // wx.updateTimelineShareData(shareData);
33 + wx.onMenuShareTimeline(shareData);
34 + // 分享到腾讯微博
35 + wx.onMenuShareWeibo(shareData);
36 + // // 获取“分享给朋友”按钮点击状态及自定义分享内容接口(即将废弃)
37 + // wx.onMenuShareAppMessage(shareData);
38 + // // 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口(即将废弃)
39 + // wx.onMenuShareTimeline(shareData);
40 + // // 获取“分享到QQ”按钮点击状态及自定义分享内容接口(即将废弃)
41 + // wx.onMenuShareQQ(shareData);
42 +}
1 +/*
2 + * @Date: 2022-07-18 10:22:22
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-08-05 17:17:15
5 + * @FilePath: /front/src/constant.js
6 + * @Description: 文件描述
7 + */
8 +// 颜色变量
9 +export const styleColor = {
10 + baseColor: '#C2915F',
11 + backgroundColor: '#FFF9EF',
12 +}
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-05-14 23:28:39
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2022-06-07 22:49:56
6 + * @FilePath: /tswj/src/env.d.ts
7 + * @Description:
8 + */
9 +interface ImportMetaEnv extends Readonly<Record<string, string>> {
10 + readonly VITE_OPENID: string;
11 + readonly VITE_ID: string;
12 + readonly VITE_PIN: string;
13 + readonly VITE_APPID: string;
14 +}
15 +
16 +interface ImportMeta {
17 + readonly env: ImportMetaEnv
18 +}
1 +/**
2 + * 依赖注入命名集合
3 + */
4 +export const myInjectionKey = Symbol()
5 +export const fooInjectionKey = Symbol()
1 +import _ from 'lodash'
2 +import TableField from '@/components/TableField/index.vue'
3 +import TextField from '@/components/TextField/index.vue'
4 +import TextareaField from '@/components/TextareaField/index.vue'
5 +import RadioField from '@/components/RadioField/index.vue'
6 +import CheckboxField from '@/components/CheckboxField/index.vue'
7 +import PickerField from '@/components/PickerField/index.vue'
8 +import AreaPickerField from '@/components/AreaPickerField/index.vue'
9 +import DatePickerField from '@/components/DatePickerField/index.vue'
10 +import TimePickerField from '@/components/TimePickerField/index.vue'
11 +import DateTimePickerField from '@/components/DateTimePickerField/index.vue'
12 +import ImageUploaderField from '@/components/ImageUploaderField/index.vue'
13 +import FileUploaderField from '@/components/FileUploaderField/index.vue'
14 +import PhoneField from '@/components/PhoneField/index.vue'
15 +import EmailField from '@/components/EmailField/index.vue'
16 +import SignField from '@/components/SignField/index.vue'
17 +import RatePickerField from '@/components/RatePickerField/index.vue'
18 +import CalendarField from '@/components/CalendarField/index.vue'
19 +import IdentityField from '@/components/IdentityField/index.vue'
20 +import NumberField from '@/components/NumberField/index.vue'
21 +import DesField from '@/components/DesField/index.vue'
22 +import DividerField from '@/components/DividerField/index.vue'
23 +import VideoField from '@/components/VideoField/index.vue'
24 +import MarqueeField from '@/components/MarqueeField/index.vue'
25 +import ContactField from '@/components/ContactField/index.vue'
26 +import RuleField from '@/components/RuleField/index.vue'
27 +import MultiRuleField from '@/components/MultiRuleField/index.vue'
28 +import ButtonField from '@/components/ButtonField/index.vue'
29 +import NoteField from '@/components/NoteField/index.vue';
30 +import NameField from '@/components/NameField/index.vue';
31 +import GenderField from '@/components/GenderField/index.vue';
32 +import AppointmentField from '@/components/AppointmentField/index.vue';
33 +import CustomField from '@/components/CustomField/index.vue';
34 +import GroupField from '@/components/GroupField/index.vue';
35 +import OrgPickerField from '@/components/OrgPickerField/index.vue';
36 +import VolunteerGroupField from '@/components/VolunteerGroupField/index.vue';
37 +
38 +/**
39 + * 生成自定义组件类型
40 + * @param {*} data
41 + * @type input 单行文本 TextField
42 + * @type textarea 多行文本 TextareaField
43 + * @type radio 单项选择 RadioField
44 + * @type checkbox 多项选择 CheckboxField
45 + * @type select 单列选择器 PickerField
46 + * @type area_picker 地址选择器 AreaPickerField
47 + * @type date_picker 日期选择器 DatePickerField
48 + * @type time_picker 时间选择器 TimePickerField
49 + * @type datetime_picker 日期时间选择器 DateTimePickerField
50 + * @type image_uploader 图片上传 ImageUploaderField
51 + * @type phone 手机输入框 PhoneField
52 + * @type email 邮箱输入框 EmailField
53 + * @type sign 电子签名输入框 SignField
54 + * @type rate_picker 评分选择器 RatePickerField
55 + * @type calendar 日历选择器 CalendarField
56 + * @type id_code 身份证输入框 IdentityField
57 + * @type desc 文字描述 DesField
58 + * @type divider 分割线 DividerField
59 + * @type video 视频控件 VideoField
60 + * @type marquee 跑马灯控件 MarqueeField
61 + * @type rule 活动规则控件 RuleField
62 + * @type multi_rule 活动规则控件 MultiRuleField
63 + * @type note 富文本控件 NoteField
64 + * @type name 姓名控件 NameField
65 + * @type gender 性别控件 GenderField
66 + * @type appointment 预约控件 AppointmentField
67 + * @type group 组集合输入控件 GroupField
68 + * @type org_picker 树形选择控件 OrgPickerField
69 + * @type volunteer_group 义工组别选择控件 VolunteerGroupField
70 + */
71 +export function createComponentType(data) {
72 + // 判断类型和使用组件
73 + _.each(data, (item, index) => {
74 + // 必填项规则添加
75 + if (item.component_props.required) {
76 + item.rules = [{ required: true, message: item.placeholder ? item.placeholder : '必填项不能为空' }]
77 + }
78 + if (item.component_props.tag === 'input') {
79 + item.type = 'text';
80 + item.name = item.key;
81 + item.component = TextField;
82 + }
83 + if (item.component_props.tag === 'textarea') {
84 + item.type = 'textarea';
85 + item.name = item.key;
86 + // item.rows = 10;
87 + item.autosize = true;
88 + item.component = TextareaField;
89 + }
90 + if (item.component_props.tag === 'number') {
91 + item.name = item.key;
92 + item.component = NumberField;
93 + }
94 + if (item.component_props.tag === 'radio') {
95 + item.component = RadioField;
96 + }
97 + if (item.component_props.tag === 'checkbox') {
98 + item.component = CheckboxField;
99 + }
100 + if (item.component_props.tag === 'select') {
101 + item.component = PickerField;
102 + }
103 + if (item.component_props.tag === 'address') {
104 + item.component = AreaPickerField;
105 + }
106 + if (item.component_props.tag === 'date') {
107 + item.component = DatePickerField;
108 + }
109 + if (item.component_props.tag === 'time') {
110 + item.component = TimePickerField;
111 + }
112 + if (item.component_props.tag === 'datetime') {
113 + item.component = DateTimePickerField;
114 + }
115 + if (item.component_props.tag === 'image_uploader') {
116 + item.component = ImageUploaderField;
117 + }
118 + if (item.component_props.tag === 'file_uploader') {
119 + item.component = FileUploaderField;
120 + }
121 + if (item.component_props.tag === 'phone') {
122 + item.name = item.key;
123 + item.component = PhoneField;
124 + }
125 + if (item.component_props.tag === 'email') {
126 + item.name = item.key;
127 + item.component = EmailField;
128 + }
129 + if (item.component_props.tag === 'sign') {
130 + item.name = item.key;
131 + item.component = SignField;
132 + }
133 + if (item.component_props.tag === 'rate') {
134 + item.name = item.key;
135 + item.component = RatePickerField;
136 + }
137 + if (item.component_props.tag === 'calendar') {
138 + item.name = item.key;
139 + item.component = CalendarField;
140 + }
141 + if (item.component_props.tag === 'id_card') {
142 + item.name = item.key;
143 + item.component = IdentityField;
144 + }
145 + if (item.component_props.tag === 'desc') {
146 + item.name = item.key;
147 + item.component = DesField;
148 + }
149 + if (item.component_props.tag === 'divider') {
150 + item.name = item.key;
151 + item.component = DividerField;
152 + }
153 + if (item.component_props.tag === 'video') {
154 + item.name = item.key;
155 + item.component = VideoField;
156 + }
157 + if (item.component_props.tag === 'marquee') {
158 + item.name = item.key;
159 + item.component = MarqueeField;
160 + }
161 + if (item.component_props.tag === 'contact') {
162 + item.name = item.key;
163 + item.component = ContactField;
164 + }
165 + if (item.component_props.tag === 'rule') {
166 + item.name = item.key;
167 + item.component = RuleField;
168 + }
169 + if (item.component_props.tag === 'button') {
170 + item.name = item.key;
171 + item.component = ButtonField;
172 + }
173 + if (item.component_props.tag === 'multi_rule') {
174 + item.name = item.key;
175 + item.value = [];
176 + item.component = MultiRuleField;
177 + }
178 + if (item.component_props.tag === 'note') {
179 + item.name = item.key;
180 + item.component = NoteField;
181 + }
182 + if (item.component_props.tag === 'name') {
183 + item.name = item.key;
184 + item.component = NameField;
185 + }
186 + if (item.component_props.tag === 'gender') {
187 + item.name = item.key;
188 + item.component = GenderField;
189 + }
190 + if (item.component_props.tag === 'appointment') {
191 + item.name = item.key;
192 + item.component = AppointmentField;
193 + }
194 + if (item.component_props.tag === 'custom') {
195 + item.name = item.key;
196 + item.component = CustomField;
197 + }
198 + if (item.component_props.tag === 'group') {
199 + item.name = item.key;
200 + item.component = GroupField;
201 + }
202 + if (item.component_props.tag === 'org_picker') {
203 + item.name = item.key;
204 + item.component = OrgPickerField;
205 + }
206 + if (item.component_props.tag === 'volunteer_group') {
207 + item.component = VolunteerGroupField;
208 + }
209 + })
210 +}
1 +import { provide, inject } from "vue";
2 +
3 +// const key = Symbol();
4 +
5 +/**
6 + * 创建全局变量
7 + * @param {*} context
8 + * @param {*} key
9 + */
10 +export function createContext(context, key) {
11 + provide(key, context)
12 +}
13 +/**
14 + * 使用全局变量
15 + * @param {*} key
16 + * @returns
17 + */
18 +export function useContext(key) {
19 + return inject(key)
20 +}
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-05-28 22:31:25
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2022-05-30 10:18:09
6 + * @FilePath: /tswj/src/hooks/useDebounce.js
7 + * @Description:
8 + */
9 +import _ from 'lodash';
10 +/**
11 + * 封装lodash防抖
12 + * @param {*} fn 执行函数
13 + * @param {*} timestamp 执行间隔
14 + * @param {*} options 函数配置 - 在延迟开始前调用,在延迟结束后不调用
15 + * @returns 返回新的 debounced(防抖动)函数。
16 + */
17 +export const useDebounce = (fn, timestamp = 500, options = { leading: true, trailing: false }) => {
18 + return _.debounce(fn, timestamp, options);
19 +}
1 +
2 +/**
3 + * @description 封装简化滚动查询列表执行流程
4 + * @param {*} data 接口返回列表数据
5 + * @param {*} list 自定义列表
6 + * @param {*} offset
7 + * @param {*} loading
8 + * @param {*} finished
9 + * @param {*} finishedTextStatus
10 + * @param {*} emptyStatus
11 + */
12 +import _ from 'lodash'
13 +
14 +export const flowFn = (data, list, offset, loading, finished, finishedTextStatus, emptyStatus) => {
15 + list.value = _.concat(list.value, data);
16 + list.value = _.uniqBy(list.value, 'id');
17 + offset.value = list.value.length;
18 + loading.value = false;
19 + // 数据全部加载完成
20 + if (!data.length) {
21 + // 加载状态结束
22 + finished.value = true;
23 + }
24 + // 空数据提示
25 + if (!list.value.length) {
26 + finishedTextStatus.value = false;
27 + }
28 + emptyStatus.value = Object.is(list.value.length, 0);
29 +}
1 +/*
2 + * @Date: 2022-07-21 13:28:05
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-08-22 09:51:52
5 + * @FilePath: /front/src/hooks/useGo.js
6 + * @Description: 文件描述
7 + */
8 +import { useRouter } from 'vue-router';
9 +import { getArticleAPI } from '@/api'
10 +import { Cookies } from '@/utils/generatePackage'
11 +import { parseQueryString } from '@/utils/tools'
12 +
13 +/**
14 + * 封装路由跳转方便行内调用
15 + * @returns
16 + */
17 +export function useGo () {
18 + let router = useRouter()
19 + function go (path, query) {
20 + router.push({
21 + path: path,
22 + query: query
23 + })
24 + }
25 + return go
26 +}
27 +
28 +/**
29 + * 封装跳转文章详情页
30 + * @param id 文章ID
31 + * @param cid 栏目ID
32 + * @param column 栏目名称
33 + * @param section 二级栏目名称
34 + * @param name 子栏目名称
35 + * @returns
36 + */
37 +export function useGoTo () {
38 + let router = useRouter()
39 + // function detail({ id, cid, column, section, name, post_link }) {
40 + function detail(item) {
41 + // 保存点击位置
42 + // Cookies.set('scrollTop', getScrollTop());
43 + // Cookies.set('scrollTopId', id);
44 + // 判断是否跳转URL
45 + // const { code, data } = await getArticleAPI({ f: 'article', i: id, cid });
46 + // if (code) {
47 + // if (data.post_link) { // 优先显示链接文章
48 + // location.href = data.post_link;
49 + // return false;
50 + // }
51 + // router.push({
52 + // path: '/detail',
53 + // query: { cid, id, column, section, name }
54 + // });
55 + // }
56 + if (item) {
57 + if (item.post_link) {
58 + if (item.post_link.indexOf('f/guanzong/web')) {
59 + item.post_link = item.post_link.replace('web', 'front');
60 + }
61 + if (item.post_link.indexOf('f/guanzong/web/#/list') > 0 || item.post_link.indexOf('f/guanzong/front/#/list') > 0) {
62 + router.push({
63 + path: '/list',
64 + query: parseQueryString(item.post_link)
65 + });
66 + return false;
67 + } else if (item.post_link) { // 优先显示链接文章
68 + location.href = item.post_link;
69 + return false;
70 + }
71 + } else {
72 + router.push({
73 + path: '/detail',
74 + query: { cid: item.item, id: item.id, column: item.column, section: item.section, name: item.name }
75 + });
76 + }
77 + }
78 + }
79 + return detail
80 +}
81 +
82 +export function useReplace () {
83 + let router = useRouter()
84 + function replace (path, query) {
85 + router.replace({
86 + path: path,
87 + query: query
88 + })
89 + }
90 + return replace
91 +}
92 +
93 +export function getScrollTop () {
94 + var scroll_top = 0;
95 + if (document.documentElement && document.documentElement.scrollTop) {
96 + scroll_top = document.documentElement.scrollTop;
97 + }
98 + else if (document.body) {
99 + scroll_top = document.body.scrollTop;
100 + }
101 + return scroll_top;
102 +}
1 +import { mainStore } from '@/utils/generatePackage.js'
2 +
3 +// 删除 keep-alive 缓存
4 +export const store = mainStore();
5 +
6 +export const killPages = () => {
7 + store.changeKeepPages();
8 +}
9 +
10 +export const addPages = () => {
11 + store.keepThisPage();
12 +}
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-05-31 12:06:19
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2024-09-06 17:39:52
6 + * @FilePath: /custom_table/src/main.js
7 + * @Description:
8 + */
9 +import { createApp } from 'vue';
10 +import router from './router';
11 +import ElementPlus from 'element-plus'
12 +import 'element-plus/dist/index.css'
13 +import App from './App.vue';
14 +// import axios from './utils/axios';
15 +import axios from '@/utils/axios';
16 +// import 'default-passive-events'; // 解决Chrome控制台non-passive event listener输出问题
17 +import { createPinia } from 'pinia';
18 +
19 +const pinia = createPinia();
20 +const app = createApp(App);
21 +
22 +// 屏蔽警告信息
23 +app.config.warnHandler = () => null;
24 +
25 +app.config.globalProperties.$http = axios; // 关键语句
26 +
27 +app.use(pinia).use(router).use(ElementPlus)
28 +app.mount('#app');
1 +/*
2 + * @Date: 2022-07-21 13:52:14
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-07-21 13:57:23
5 + * @FilePath: /front/src/mock/detail.js
6 + * @Description: 文件描述
7 + */
8 +const data = `
9 +<div class="met_editor met_module1">
10 + <p><span style="font-family: 宋体;">无锡观宗讲寺将于</span>2021<span style="font-family: 宋体;">年</span>7<span style="font-family: 宋体;">月</span>24<span style="font-family: 宋体;">日—</span>7<span style="font-family: 宋体;">月</span>30<span style="font-family: 宋体;">日举办第六届短期出家戒会。期间,学员将全程食宿在寺院,与寺院内的出家师父一起听经闻法、出坡劳作,在晨钟暮鼓中体验知足少欲的生活,在曲径通幽中陶冶性情、熏染习性。</span></p><p>&nbsp;</p><p style="text-align: center;"><img src="" title="1625062693111834.jpg" alt="2.jpg"></p><p><br></p><p><span style="font-family: 宋体;">你想不想知道出家人一天的生活是怎样的?</span></p><p><span style="font-family: 宋体;">佛教出家人一天的生活是紧张而繁忙的,不同的是普通人忙着讨生活,而出家人的生活则是忙着修行佛法。</span></p><p>&nbsp;</p><p style="text-align: center;"><img src="" title="1625062714917216.jpg" alt="7.jpg"></p><p>&nbsp;</p><p><span style="font-family: 宋体;">本次短期出家还设置讲座、现场答疑、传灯祈福、止观、师生交流等环节,以帮助学员们更深入地了解博大深邃的佛教文化,感受清和简静的心境,此外,传授三皈、五戒、八关斋戒,机缘殊胜、龙天欢喜,希望大众辗转相告。</span></p><p><br></p><p style="text-align: center;"><img src="http://www.wxgzjs.cn/static/upload/image/20210630/1625062747128574.jpg" title="1625062747128574.jpg" alt="3.jpg"></p><p><span style="font-family: 宋体;"><br></span></p><p><span style="font-family: 宋体;">人在年轻时易做后悔事,思想上过于散漫,过于松懈,总认为自己年轻有活力,总认为自己青春有资本,总是在徘徊中虚度光阴,总是在彷徨时迷失自我,甚至是自暴自弃!有的人对自己光阴虚度浪费青春内疚伤感,可是明明知道是错的却还要去做。其实,人生这个时候的猛然回头是多么的重要啊!</span></p><p><br></p><p><br></p><p><img src="" title="1625062812152387.jpg" alt="4.jpg"></p><p><span style="font-family: 宋体;"><br></span></p><p><span style="font-family: 宋体;">余生很贵,请不要用来悔恨。有多少人因为吃不了苦而选择安逸轻松的过了一辈子,可是当他们凝眸回望,却发现,最遗憾的不是没有机会,而是没有去努力。寺院清净的生活,能帮助我们沉淀内心、放下烦恼,理性思考、积聚能量。青灯古佛,晨钟暮鼓,短期修行,感受内心。</span></p><p><span style="font-family: 宋体;"><br></span></p><p><br></p><p style="text-align: center;"><img src="http://www.wxgzjs.cn/static/upload/image/20210630/1625062843204089.jpg" title="1625062843204089.jpg" alt="5.jpg"></p><p><span style="font-family: 宋体;"><br></span></p><p><span style="font-family: 宋体;">注:女众不剃度受持清净的八关斋戒,体验出家生活</span></p><p>&nbsp; &nbsp; &nbsp; &nbsp;<span style="font-family: 宋体;">男众也可不剃度,全程随喜参加</span></p><p>&nbsp;</p><p style="text-align: center;"><img src="" title="1625062884150298.jpg" alt="6.jpg"></p><p><br></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体;"><br></span></strong></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体;">【活动费用】</span></strong><br></p><p style="margin-bottom: 0px;"><span style="font-family: 宋体;">全程学费食宿免费(大众可随喜)</span></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体;">【活动地点】</span></strong></p><p style="margin-bottom: 0px;"><span style="font-family: 宋体;">江苏省无锡市惠山区玉祁街道五牧村观宗讲寺</span></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体;">【报名资格】</span></strong></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体; font-weight: normal;">一、</span></strong><strong><span style="font-weight: normal;">18</span></strong><strong><span style="font-family: 宋体; font-weight: normal;">以上,好乐佛法,恭敬三宝</span></strong></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体; font-weight: normal;">二、男众剃度班年龄要求</span></strong><strong><span style="font-weight: normal;">60</span></strong><strong><span style="font-family: 宋体; font-weight: normal;">周岁内</span></strong></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体; font-weight: normal;">三、身心健康,无任何传染病、重大疾病、精神疾病</span></strong></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体; font-weight: normal;">四、无违法乱纪在逃行为,无社会恶习及不良嗜好</span></strong></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体;">【报名日期】</span></strong></p><p style="margin-bottom: 0px;"><span style="font-family: 宋体;">自即日起至</span>2021<span style="font-family: 宋体;">年</span>7<span style="font-family: 宋体;">月</span>23<span style="font-family: 宋体;">日</span>&nbsp;<span style="font-family: 宋体;">止</span>&nbsp;<span style="font-family: 宋体;">可提前两日到寺</span></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体;">【报名方式】</span></strong></p><p style="margin-bottom: 0px;"><span style="font-family: 宋体;">一、本寺欢喜地直接填表报名</span></p><p style="margin-bottom: 0px;"><span style="font-family: 宋体;">二、电话报名:</span><strong><span style="text-decoration-line: underline;">199 5223 2072</span></strong><strong><span style="text-decoration-line: underline;"><span style="font-family: 宋体;">(觉执居士)</span></span></strong></p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体;">【报到地点】</span></strong></p><p style="margin-bottom: 0px;"><span style="font-family: 宋体;">观宗讲寺欢喜地客堂</span></p><p>&nbsp;</p><p style="margin-bottom: 0px;"><strong><span style="font-family: 宋体;">【疫情期间来寺须知】</span></strong></p><p>1、<span style="font-family: 宋体;">如您来自国内外疫情中高风险区,请勿来寺;</span></p><p>2、<span style="font-family: 宋体;">需提供近</span>14<span style="font-family: 宋体;">天行程,行程需显示未到过中高风险区;</span></p><p>3<span style="font-family: 宋体;">、持有健康码,体温正常,无发烧、头痛、咳嗽或其他呼吸道症状;</span></p><p>4<span style="font-family: 宋体;">、做好自我防护,佩戴口罩、勤洗手。</span></p><p>5<span style="font-family: 宋体;">、疫情防控,安全第一,不能隐瞒以上信息,后果自负</span></p><p>&nbsp;</p><p><strong><span style="font-family: 宋体;">【报到须知】</span></strong></p><p><span style="font-family: 宋体;">一、报到时间:接到通知的同修可提前</span>2<span style="font-family: 宋体;">日到寺院报到,恕不接待未报名的到访者。如须提前到寺,请联系:</span>133 7360 3791<span style="font-family: 宋体;">(客堂)</span></p><p><span style="font-family: 宋体;">二、个人资料:身份证及复印件、一寸近照</span>3<span style="font-family: 宋体;">张</span></p><p><span style="font-family: 宋体;">三、所需物品:男众僧服、僧鞋寺院免费提供(活动结束后需归还);统一着居士服、居士鞋、海青、缦衣,寺院可请购服装(居士服、居士鞋、海清、受五戒需缦衣</span>) &nbsp;<span style="font-family: 宋体;">;自带个人换洗衣物、盥洗用品(牙膏、牙刷、毛巾、肥皂)、所需药品、洗衣粉等生活日用品。</span></p><p><span style="font-family: 宋体;">四、注意事项:香烟、烟草、雪茄、药用或非药用等含酒精制品、荤食、无关书刊读物、贵重饰品与珠宝、刀及武器等危险物品切莫带入清净道场!!!</span></p><p><span style="font-family: 宋体;">五、女学员发型:</span></p><p>&nbsp;&nbsp;<img src="" title="1625062916122090.jpg" alt="1.jpg"></p><p>&nbsp;</p><p><strong><span style="font-family: 宋体;">【温馨提示】</span></strong></p><p><span style="font-family: 宋体;">人身难得,佛法难闻。名额有限,请已通过审核的学员珍惜机会,及早安排好个人请假事宜,以免临时有事不能前来参加,浪费额度。</span></p><p><strong><span style="font-family: 宋体;">【责任声明】</span></strong></p><p><span style="font-family: 宋体;">有意参加本次短期出家戒会者,必须爱国爱教。在此次戒会过程中,严格遵守国家法律法规,不得谈论政治,不得进行与本次戒会不相关的任何活动。本次短期出家戒会是纯属佛教活动不是商业团队,本活动为非盈利性质的佛教活动,在寺院及出外参访中,要服从管理,参加者要有一定的自理和处理事物的能力,须对自己的安全负责。活动中发生意外事故,组织者有义务组织救援或改变行程,但不承担任何法律和经济责任,特此声明。活动开始后,本声明将自动生效并表明你接受本声明,否则,请在活动开始前退出。此次活动组织者,有最终解释权!报名参加者须细看本声明,参加者则是视为接受本声明公告的相关事宜。</span></p><p>&nbsp;</p><p>&nbsp;</p><p><strong><span style="font-family: 宋体;">【交通信息】</span></strong></p><p><span style="font-family: 宋体;">一、飞机</span></p><p>1<span style="font-family: 宋体;">、坐飞机到无锡苏南硕放机场</span></p><p>2<span style="font-family: 宋体;">、如没有直飞无锡机场的航班,可飞以下无锡附近机场</span></p><p><span style="font-family: 宋体;">(</span>1<span style="font-family: 宋体;">)坐飞机到上海浦东机场、虹桥机场(飞上海再转高铁</span>1<span style="font-family: 宋体;">小时到惠山站)</span></p><p><span style="font-family: 宋体;">(</span>2<span style="font-family: 宋体;">)坐飞机到常州奔牛机场(飞常州再转动车</span>20<span style="font-family: 宋体;">分钟到惠山站)</span></p><p><span style="font-family: 宋体;">(</span>3<span style="font-family: 宋体;">)坐飞机到南京禄口机场(飞南京再转动车</span>1<span style="font-family: 宋体;">小时到惠山站)</span></p><p><span style="font-family: 宋体;">到达惠山站后直接打车</span>12<span style="font-family: 宋体;">分钟即可到观宗讲寺</span></p><p><span style="font-family: 宋体;">二、火车</span></p><p>1<span style="font-family: 宋体;">、坐火车到惠山站</span></p><p>2<span style="font-family: 宋体;">、如没有直达惠山站车次,可到无锡站转乘</span></p><p><span style="font-family: 宋体;">三、汽车</span></p><p><span style="font-family: 宋体;">可乘汽车到达惠山区玉祁客运站、惠山区洛社客运站、无锡汽车客运西(惠山)站、世新客运站。</span></p><p><span style="font-family: 宋体;">四、自驾</span></p><p><span style="font-family: 宋体;">地址:江苏省无锡市惠山区玉祁镇五牧村观宗讲寺。</span></p><p>&nbsp;</p><p><span style="font-family: 宋体;">注:交通路线可以电话咨询:</span>133 7360 3791<span style="font-family: 宋体;">(客堂)</span></p><p><span style="font-family: 宋体;"><br></span></p><p style="text-align: center;"><img src="" title="1625062939178756.jpg" alt="2.jpg"></p><p><br></p>
11 + <div class="clear"></div>
12 +</div>
13 +`
14 +
15 +export default data;
1 +/*
2 + * @Date: 2022-07-18 12:57:31
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-07-21 17:03:02
5 + * @FilePath: /front/src/mock/nav.js
6 + * @Description: 文件描述
7 + */
8 +const data = [{
9 + title: '首页',
10 + link: '/',
11 + sub: []
12 +}, {
13 + title: '走进寺院',
14 + link: '/temple',
15 + sub: []
16 +}, {
17 + title: '寺院新闻',
18 + link: '',
19 + sub: [{
20 + id: 'xxx',
21 + title: '公告',
22 + link: '/column'
23 + }, {
24 + title: '招聘',
25 + link: ''
26 + }, {
27 + title: '新闻',
28 + link: ''
29 + }]
30 +}, {
31 + title: '智慧课堂',
32 + link: '',
33 + sub: [{
34 + title: '活动与咨询',
35 + link: ''
36 + }, {
37 + title: '福田功德',
38 + link: ''
39 + }, {
40 + title: '广结善缘',
41 + link: ''
42 + }]
43 +}, {
44 + title: '弘法利生',
45 + link: '',
46 + sub: [{
47 + title: '法务活动',
48 + link: ''
49 + }, {
50 + title: '本源法师开示',
51 + link: ''
52 + }, {
53 + title: '短期出家',
54 + link: ''
55 + }, {
56 + title: '闻思修慧',
57 + link: ''
58 + }, {
59 + title: '素食护生',
60 + link: ''
61 + }, {
62 + title: '妙智学堂',
63 + link: ''
64 + }]
65 +}, {
66 + title: '义工之家',
67 + link: '',
68 + sub: [{
69 + title: '义工之家',
70 + link: ''
71 + }]
72 +}, {
73 + title: '普明慈善基金会',
74 + link: '/foundation',
75 + sub: []
76 +}, {
77 + title: '生命关怀',
78 + link: '',
79 + sub: [{
80 + title: '生命关怀',
81 + link: ''
82 + }]
83 +}]
84 +
85 +export default data
1 +const routes = [{
2 + path: '/image',
3 + redirect: '',
4 + name: 'html转图片',
5 + component: 'html2canvas',
6 + keepAlive: '',
7 + meta: {
8 + title: 'html转图片',
9 + name: ''
10 + },
11 + children: [{
12 + path: 'children',
13 + redirect: '',
14 + name: 'html转图片',
15 + component: 'children-test',
16 + keepAlive: '',
17 + meta: {
18 + title: 'html转图片',
19 + name: ''
20 + }
21 + }]
22 +}]
23 +// const routes = []
24 +
25 +export default routes
1 +/*
2 + * @Date: 2022-07-18 15:05:39
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-07-22 14:34:25
5 + * @FilePath: /front/src/mock/swipe.js
6 + * @Description: 文件描述
7 + */
8 +const data = [{
9 + id: '1',
10 + src: 'https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg',
11 + title: '文章1',
12 + link: '/detail'
13 +}, {
14 + id: '2',
15 + src: 'https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg',
16 + title: '文章2',
17 + link: '/detail'
18 +}, {
19 + id: '3',
20 + src: 'https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg',
21 + title: '文章3',
22 + link: '/detail'
23 +}]
24 +export default data
1 +const data = [
2 + {
3 + "case_id": "424589807164071936",
4 + "code": "N06",
5 + "title": "复旦管理学奖励基金会",
6 + "detail": "我国自古就有优秀的管理思想和实践,但中国现代管理科学则是在改革开放之后才逐步发展起来的。为进一步推动我国现代管理科学发展,原中共中央政治局常委、国务院副总理李岚清同志于2005年发起成立了复旦管理学奖励基金会,这也是中国人自己设立的管理学界第一个奖励基金会。\r\n“要真正解决好中国的管理问题,最终还是要依靠中国人自己。”这句话道出了“管理”必须根植于一个国家的社会组织和民族文化。管理科学,是兴国之道,也是一个国家软实力的重要组成部分。\r\n十六年来,基金会各项管理逐步完善,2020年首次参加社会组织等级评估即被授予“5A级社会组织”荣誉称号;FTI透明指数排名连获最优等级。基金会的评奖工作,及其开展的一系列公益项目,获得了来自各界人士的一致认可;同时借助媒体之力,不断拓宽公众对中国管理学的认识边界,受益人数不断增加。如今,基金会已逐渐发展成为中国管理学界最具影响力、最具公信力的基金会。\r\n作为一个“奖励性”的基金会,我们希望打造中国管理学界的“诺贝尔奖”。基金会目前设立了“复旦管理学杰出贡献奖”“复旦管理学终身成就奖”“复旦企业管理杰出贡献奖”三大奖项,已成为我国管理学界享有崇高声誉、具有广泛影响力的重要奖项。截至2020年,已评选出57位获奖人,他们中不乏成思危、苏东水等矢志推动中国特色的管理学及其研究走向世界的杰出专家学者,亦有张瑞敏、任正非等对中国管理学不断实践、探索的优秀民族企业家。\r\n评奖之外,基金会还积极开展了丰富多样的公益活动。自2013年起,面向我国高等学府,面向青年师生,面向中西部地区举办了“校园公益”系列讲座活动,辐射师生5000余人。\r\n联合我国管理学一级学会,举办了一系列具有国际影响力的管理学学术盛会。其中,“中国管理学年会”是中国管理学领域规模最大、层次最高的综合性学术会议。另外,基金会通过支持“中国管理学青年论坛”,为有潜力的优秀青年架起了跨学科、跨层次的学习交流平台,旨在培养中国管理学的中青年力量。\r\n为加强学术界和实业界的合作,基金会充分发挥“桥梁·引领·赋能”作用,做到将“管理学带出去”,“管理领进来”,邀请获奖人、专家学者与企业家共话“管理”。\r\n基金会还与复旦大学东方管理研究院、第一财经合作开展了“中国杰出企业家管理思想访谈录”项目,已通过42集电视专题片、6部《改变世界》、14本研究丛书等形式对外发布,另有10多个优秀案例走进了高校课堂,收益人数达10亿多人。\r\n基金会积极响应习近平总书记“把论文写在祖国大地上”的号召,与《管理学报》合作,举办专题学术研讨会,开辟“中国企业家管理思想”专栏;与知名企业合作开展“海尔生态雨林计划”等专项研究。\r\n2020年新冠疫情的突发,对全国各地的公共卫生治理都是前所未有的考验。为总结出应对疫情的科学、高效的经验,提供疫情应对经验给相关部门,基金会资助了“新冠疫情防控防治的中国特色管理理论与方法”系列专著及案例研究。于基金会而言,这件事意义非常。\r\n作为一个扎根于中国管理学领域发展的公益组织,基金会在各级领导的亲切关怀下不断发展。获奖人所提出管理思想、管理理论和实践的创新、各项公益活动等,对于上海乃至全国各地的社会治理、公共管理与企业管理都发挥了重要的作用。在每年的颁奖典礼上,历任上海市领导均受邀出席并致辞。当今世界正面临百年未有的大变局,发展中国特色的管理学、并让中国特色管理学发挥更大的影响力,这比任何时候都更加迫切。在未来的公益发展事业中,基金会将继续助力中国特色管理学的探索和创新,为增强上海自主创新能力,提高城市国际竞争力,做出新的重大的贡献!",
7 + "cover": {
8 + "name": "N06.jpg",
9 + "url": "http://gyzs.onwall.cn/2021gyzs/N06.jpg",
10 + "uid": 1564543218846,
11 + "status": "success"
12 + },
13 + "video": {
14 + "name": "N06.mp4",
15 + "url": "http://gyzs.onwall.cn/2021gyzs/N06.mp4",
16 + "uid": 1564543218846,
17 + "status": "success"
18 + },
19 + "status": "ENABLE",
20 + "public_vote": 3406,
21 + "score": 0,
22 + "award": null,
23 + "optr_date": "2021-12-31T15:50:00.547Z",
24 + "corp": {
25 + "name": "复旦管理学奖励基金会"
26 + },
27 + "voted": false,
28 + "liked": false
29 + },
30 + {
31 + "case_id": "419178326515888128",
32 + "code": "N14",
33 + "title": "上海市普陀区长寿社会组织联合会",
34 + "detail": "近年来,各类社区社会组织数量增长,规模扩大,社会组织日趋成为服务社区发展,提升社区治理水平的重要力量。所以以服务中心传统的点对点形式来去服务社会组织,已经不符合形势的发展,亟待搭建新的平台。在这种情势下,2016年长寿社会组织联合会孕育而生。长寿社会组织联合会是全市首家街道层面社会组织联合会。联合会以党建为引领,创新构建社区、社会组织、社会组织联合会的联动机制,这种全新模式不仅为社区与社会组织之间搭建了交流对接平台,也为促进社会组织自律自治、资源共享、健康发展创造了良好的条件。\n联合会运行以来,正式会员近百家。目前,长寿社会组织联合会成员中已有区党代表、区人大代表、区政协委员,充分激发社会组织领军人物的参与度,发挥社会组织自我管理、自我服务的能效。\n创新党建引领社会组织参与社区治理是我们的工作特色之一。2016年我们同步成立联合会党总支,党总支通过“价值引领、服务凝聚、同心共治”凝聚党员力量,提升基层组织活力。目前,党总支下设20个党组织、6个联合支部,14个独立支部。联合会自成立以来开展了一系列凝聚力建设活动,包括开展情景党课、建立学习教育体验站等等,我们还努力将公益理念引入党建活动,例如开展垃圾分类主题党日活动。通过这些活动和服务,不仅会员们的凝聚力日益增强,更是聚拢到了一批原先游离在边缘的社会组织。\n搭建公益服务平台也是我们最大的工作特色。我们通过公益秀、公益项目菜单、公益集市等形式将社会服务和项目精准化地投放到我们两新组织、楼宇和居民区,政府购买社会组织服务项目的数量及社区参与面都有了一个较大幅度的提升。\n在新媒体时代,为了更加方便项目对接,社联会依托微信公众号平台,于18年9月正式上线了长寿公e家网站。公e家的推出填补了20万以下政府采购服务对接渠道的空白。居民区科室可以进行社区需求发布,社会组织发布服务内容,这样以来加快了信息传递速率,实现了项目精准对接。例如,我们会在学生的暑假开展暑期班公益项目,让公益项目走进社区、走进百姓生活中。项目结项后,我们会举办成果展,把项目的成果进行公示,并在公E家上给承接方打分,能够让购买方一目了然地了解社会组织的服务能力。通过这样一个平台,我们让长寿的社会组织能真正了解到社区的需求,因地制宜地研发适合长寿、服务长寿的公益项目。尤其在疫情的冲击下,公E家的优势更加得到了肯定。2016年以来我们通过线上线下的渠道共举办了115个公益项目、300余场活动,有效实现社会组织与居民需求的“无缝对接”。\n我们在实践中摸索,完善中创新。展望未来,长寿社会组织联合会也将不断探索,下一步的计划是“请进来、走出去”,长寿社会组织联合会将联合其他街镇乃至其他区县的社会组织共同协作,打破社会组织属地化壁垒,提升他们视野和竞争力,因地制宜的研发出服务社区的公益项目,让公益的力量势如破竹,为打造精彩长寿、善美普陀和公益上海添砖加瓦。",
35 + "cover": {
36 + "name": "N14.jpg",
37 + "url": "http://gyzs.onwall.cn/2021gyzs/N14.jpg",
38 + "uid": 1564543218846,
39 + "status": "success"
40 + },
41 + "video": {
42 + "name": "N14.mp4",
43 + "url": "http://gyzs.onwall.cn/2021gyzs/N14.mp4",
44 + "uid": 1564543218846,
45 + "status": "success"
46 + },
47 + "status": "APPLY",
48 + "public_vote": 3346,
49 + "score": 0,
50 + "award": null,
51 + "optr_date": "2021-12-31T15:50:00.547Z",
52 + "corp": {
53 + "name": "上海市普陀区长寿社会组织联合会"
54 + },
55 + "voted": false
56 + },
57 + {
58 + "case_id": "419527762110595072",
59 + "code": "N04",
60 + "title": "上海震旦教育发展基金会",
61 + "detail": "上海震旦教育发展基金会成立于2015年,秉持弘扬公益精神,积极回报社会的办会宗旨,努力汇集各方力量、传递正能量。\r\n基金会主要以四项特色工作为主:\r\n(一)携手各方力量,关爱特殊人群\r\n震旦教育基金会已成功主办、协办多项全国性、市级助残公益活动。关爱自闭症特殊群体活动,主题鲜明、内容丰富、参与者众、受益面广。\r\n(二)共襄慈善良业,回报社区民众\r\n震旦教育基金会为社区建设作贡献。为黄浦社区加装电梯工程中做配套绿化改建项目,为居民提供了优美的绿化环境。\r\n基金会每年中国传统节日前向街道、镇、村老人、残疾人送去温暖与爱心。\r\n2020年疫情期间,震旦教育基金会为黄浦区各大医院、派出所等总共58家单位,送去价值28万余元的哈根达斯蛋糕,向日夜坚守在疫情防控第一线的工作人员送去慰问与祝福,为抗击疫情助力加油!\r\n(三)引领环保时尚,共倡整洁家园\r\n震旦教育基金会联合公益机构举办了多场大型环保艺术展,在浦东科技馆的“艺起减塑”历时90天,共接待观众逾13万人次,使参与者对环保、减塑、有了感性的认识,也认识到环保是我们全人类的职责与使命。\r\n(四)共同奉献爱心,基金奖励优秀\r\n震旦师生积极为抗疫捐款,把参与慈善公益事业作为每个人的社会责任与使命。在疫情之中,基金会表彰震旦职业学院17名驰援武汉的毕业生,给予每人2万元的奖励,鼓励和表彰他们无私无畏,挺身而出把人民生命安全放在首位的大无畏精神。\r\n震旦教育基金会近年来开展了50多项公益项目活动,受益人数16万余人次。震旦教育基金会将不忘初心,凝心聚力,坚毅前行,吸纳更多热心于慈善事业的有识之士参与,做更多造福于社会的公益活动。",
62 + "cover": {
63 + "name": "N04.jpg",
64 + "url": "http://gyzs.onwall.cn/2021gyzs/N04.jpg",
65 + "uid": 1564543218846,
66 + "status": "success"
67 + },
68 + "video": {
69 + "name": "N04.mp4",
70 + "url": "http://gyzs.onwall.cn/2021gyzs/N04.mp4",
71 + "uid": 1564543218846,
72 + "status": "success"
73 + },
74 + "status": "REFUSE",
75 + "public_vote": 4125,
76 + "score": 0,
77 + "award": null,
78 + "optr_date": "2021-12-31T15:50:00.547Z",
79 + "corp": {
80 + "name": "上海震旦教育发展基金会"
81 + },
82 + "voted": false
83 + },
84 + {
85 + "case_id": "420369007372419072",
86 + "code": "N18",
87 + "title": "上海青创社会服务中心",
88 + "detail": "上海青创社会服务中心,AAAA级社会组织,是一家从事社会创新治理、公共空间营造与运维、公益活动策划以及媒体宣传于一体的枢纽型社会组织。机构在党建引领下茁壮成长,在上海城市更新、社会治理工作中发挥着积极重要的作用。\n党建引领社会组织发展\n上海青创坚持“党建引领促发展”的理念,目前团队规模超过70人,服务在上海创新治理的前沿,年服务人次超过30万。机构党支部拥有中共党员15名,这些党员既是业务骨干,也是治理先锋。在建党百年之际,上海青创成立了普陀区首家建在社会组织上的党群服务站。党建引领树立了青创人正确的价值观,为社会组织的发展保驾护航。机构理事长也先后荣获上海市五四青年奖章个人、上海市青年社区治理达人、普陀区优秀共产党员等荣誉。\n党建引领公益志愿服务\n通过“党建”带动“公益”的模式,青创公益在党支部的带领下,组建了多个青年志愿团队,参与到各项公益志愿服务当中。定期举办五福生日会为老系列服务;作为区文明单位,在创城行动中参与美化楼宇环境;积极响应“人民城市人民建,人民城市为人民”的理念,成立了苏州河护河队,助力苏州河环境治理工作;疫情期间组织员工在一线抗疫、慰问、捐款捐物,今年以来机构组织了一批又一批的员工和志愿者,参与疫苗接种的宣传和动员工作中;在党建引领之下,每年都有青年员工志愿加入民兵队伍,成为祖国国防力量的后备军。\n党建引领社会创新治理\n通过项目孵化团队,通过社区挖掘骨干,上海青创每年为超过100个社区提供赋能,培育社区项目负责人,强化自治共治,更好地推动社区治理体系和能力的现代化。通过空间培育志愿队伍,在机构参与运营的多个公共空间上面,不仅对驻点服务人员进行赋能提升,还把居民也动员起来,成为空间的小主人,进一步服务百姓,提升空间活力。机构理事长作为一名区政协委员,每年都会对上海社会治理工作积极地建言资政,为社会组织的发展而发声。\n坚持党建引领,才能促进社会组织健康有序的发展。在庆祝中国共产党成立100周年大会上,习近平总书记强调“新时代的中国青年,要以实现中华民族伟大复兴为己任,增强做中国人的志气、骨气、底气”。上海青创社会服务中心通过公益之申这个平台,以青年社会组织的身份表态:将不忘公益初心,在党建引领下,为上海创新社会治理工作添一份力。",
89 + "cover": {
90 + "name": "N18.jpg",
91 + "url": "http://gyzs.onwall.cn/2021gyzs/N18.jpg",
92 + "uid": 1564543218846,
93 + "status": "success"
94 + },
95 + "video": {
96 + "name": "N18.mp4",
97 + "url": "http://gyzs.onwall.cn/2021gyzs/N18.mp4",
98 + "uid": 1564543218846,
99 + "status": "success"
100 + },
101 + "status": "ENABLE",
102 + "public_vote": 5079,
103 + "score": 0,
104 + "award": null,
105 + "optr_date": "2021-12-31T15:50:00.547Z",
106 + "corp": {
107 + "name": "上海青创社会服务中心"
108 + },
109 + "voted": false
110 + },
111 + {
112 + "case_id": "420305782152998912",
113 + "code": "N02",
114 + "title": "上海静安区心灵导航心理咨询服务中心",
115 + "detail": "上海静安区心灵导航心理咨询服务中心成立于2011年8月,作为一家开展专业心理服务的非营利性社会组织,始终以“热衷公益、不求回报,把爱心奉献社会,把专业与关怀传递给更多、更广的社会大众”作为服务宗旨,共同的公益理念聚集了200余名心理咨询师志愿者,在心灵导航党支部的带领下,关注社区心理健康,提供专业心理服务。\n二、专业服务关注社区心理健康\n走进社区、学校,楼宇,通过心理咨询、上门走访、心理辅导活动等形式在社区普及心理学知识,增强人们心理健康意识。设计并实施了“星星港”失独家庭心理疏导、“贫困青少年心理健康项目”、“安徽贫困青少年心理暑期夏令营”、“信访人员心理疏导”、“特殊人员心理疏导”等心理服务工作。服务人群涵盖了老人、青少年、白领、困境等群体,累计开展项目82个,服务58000人次。\n三、热心公益回馈社会\n疫情伊始,心灵导航第一时间以党支部为核心,党员心理咨询师为骨干力量,组建“心理服务志愿团队”,创建热线和微信通道,向社会免费开通,录制《新冠疫情心理微课程》,通过各种渠道宣传播放,为市民和一线防疫工作者提供及时必要的心理援助。热线服务除涵盖上海地区之外,还处理了来自武汉金银潭医院医护人员的热线求助,同时为新疆喀什地区和驻疆武警部队提供远程心理指导。热线累计服务156人次,目前热线已作为一项常态化工作。\n四、文化援疆心理援疆\n心灵导航积极参与“心理援疆”,大力支援边疆的心理健康体系建设,自2018年起已连续三年为新疆巴楚县和驻疆武警部队开展心理健康建设服务,成立了“心灵导航巴楚工作站”以及“驻疆部队心理援建服务中心”,运用远程线上授课、专家团队赴疆现场教学、组织心理骨干赴沪深造等形式,为新疆巴楚教育系统、公安系统、社区一线工作人员、驻疆武警部队培养了大量的心理服务骨干,并通过线上形式为当地有心理困扰的家庭和武警战士提供心理咨询服务,防止了严重事故的发生,受助者来电、来信表示感谢,武警三支队连续三年零事故。心理援疆服务取得良好成效,累计服务9000人次,得到驻疆武警部队和巴楚县委的高度评价和肯定。\n五、媒体报道报道\n1、中央电视台曾对心灵导航为失独家庭开展的心理服务进行过专题报道。\n2、学习强国平台和静安报对心灵导航疫情期间的工作进行了宣传报道。\n3、人民网、上海电视台对心理援疆进行了连续报导。\n六、获得荣誉\n于2020年被评为上海市文明单位,复评为4A级社会组织。",
116 + "cover": {
117 + "name": "N02.jpg",
118 + "url": "http://gyzs.onwall.cn/2021gyzs/N02.jpg",
119 + "uid": 1564543218846,
120 + "status": "success"
121 + },
122 + "video": {
123 + "name": "N02.mp4",
124 + "url": "http://gyzs.onwall.cn/2021gyzs/N02.mp4",
125 + "uid": 1564543218846,
126 + "status": "success"
127 + },
128 + "status": "ENABLE",
129 + "public_vote": 4446,
130 + "score": 0,
131 + "award": null,
132 + "optr_date": "2021-12-31T15:50:00.547Z",
133 + "corp": {
134 + "name": "上海静安区心灵导航心理咨询服务中心"
135 + },
136 + "voted": false
137 + },
138 + {
139 + "case_id": "419897909908398080",
140 + "code": "N13",
141 + "title": "上海市奉贤区民营经济协会",
142 + "detail": "我们奉贤区民营经济协会的前身是奉贤县(区)个体劳动者协会和私营企业协会,成立于上世纪八十年代末。今年1月,为顺应形势发展需要,区民营经济协会的业务主管单位由奉贤区市场监督管理局变更为奉贤区工商联(总商会),开创了全市先河。多年来,协会认真贯彻落实习近平总书记关于加强社会组织建设的一系列重要指示精神,紧紧围绕推进“两个健康”(民营经济健康发展和民营经济人士健康成长),强化“三个服务”(服务会员、服务经济、服务社会)坚持“建设四会”(政治建会、团结立会、服务兴会、改革强会)这一工作理念和职责任务,扎实开展各项工作,促进社会组织高质量发展。目前,协会会员达到6000多名,其中理事会员150余人。协会先后二次获得全国个私协会系统先进单位和5A级社团组织、上海市个私协会系统三八红旗集体、奉贤区十佳公益机构、“热心慈善无私奉献”先进单位等称号;还收获服务单位赠送的三十多面锦旗和几十封感谢信。\n在引领广大会员参与公益事业方面我们的主要做法是:\n---充分发挥党员先锋模范引领作用。积极组织党员、会员开展访贫问暖活动;组织并推动会员开展公益服务项目,积极参加青海、务川、精准扶贫、关心下一代等项目对接捐助等公益活动,共有500余人次弱势群体受益。立足会员需求,我会成立了志愿者协调小组、法律顾问小组,发挥老同志、法律工作者协调优势,帮助协调解决近百家会员企业在生产经营投资中面临的困难问题,维护其合法权益,有效发挥我会的“稳定器”作用。\n---充分发挥民营经济人士主体作用。我们于2015年7月在会员中积极组建“爱心”、“小皮匠”、“善之乐”、“医疗志愿”等四支百人志愿服务队,采用分散服务和相对集中服务模式,积极组织开展3.5学雷锋、4•15爱心活动、志愿者嘉年华、公益伙伴日和“三下乡大篷车”等活动,“益”起行动,传递爱的正能量。“4•15”爱心行动日活动是全市个私协会系统影响深远的一项“品牌”活动,已经持续开展了20多年。“小皮匠”志愿服务队从2010年成立时的几个人发展到目前的40多人,志愿服务群众达40万余人次,近五年累计志愿服务时长15120个小时,人均服务时长400小时。服务项目有理发、磨剪刀、修鞋、修表、配钥匙、义诊和各种咨询服务,深得社会各界的好评。\n---引导民营企业积极履行社会责任。去年年初,面对突如其来的新冠疫情,协会第一时间向会员企业发出《倡议书》,动员各会员企业积极响应党和政府号召,自觉履行社会责任,以捐款捐物的方式共同参与抗击疫情,据不完全统计,共有68家会员企业捐款捐物总计863万元;组织企业家参与“携手慈善,与爱同行”、“弘扬公益贤风共建美丽贤城”奉贤区9.5中华慈善日系列活动,捐赠善款达上千万元。\n积极引导和组织民营经济人士参与公益事业、履行社会责任是我们社会组织的重要职责。“新时代呼唤新作为,新征程谱写新篇章”。我们将坚定理想信念、永葆初心使命,以更强大的内生动力和昂扬的精神状态,在营造共建共治共享的社会治理格局中发挥更大的作用,为“温暖这座城”做出新的更大的贡献!",
143 + "cover": {
144 + "name": "N13.jpg",
145 + "url": "http://gyzs.onwall.cn/2021gyzs/N13.jpg",
146 + "uid": 1564543218846,
147 + "status": "success"
148 + },
149 + "video": {
150 + "name": "N13.mp4",
151 + "url": "http://gyzs.onwall.cn/2021gyzs/N13.mp4",
152 + "uid": 1564543218846,
153 + "status": "success"
154 + },
155 + "status": "ENABLE",
156 + "public_vote": 343,
157 + "score": 0,
158 + "award": null,
159 + "optr_date": "2021-12-31T15:50:00.547Z",
160 + "corp": {
161 + "name": "上海市奉贤区民营经济协会"
162 + },
163 + "voted": false
164 + },
165 + {
166 + "case_id": "429021582644748288",
167 + "code": "N03",
168 + "title": "上海大慈公益基金会",
169 + "detail": "上海大慈公益基金会是由上海龙华古寺发起,于2015年1月18日成立的佛教界第一家非公募基金会。基金会以“大慈念一切,慧光照十方”为基本理念;以慈善回报社会,以慈爱构建和谐社会为使命。六年来共募集善款9220.9万元,使用善款5132.1万元,受益群体277118人。受助的对象有老人和儿童、本地困境家庭、国家级贫困地区、革命老区、少数民族地区,以及上海对口援助地区。\r\n基金会在文化传承等方面也有新的亮点,16个慈善项目不断升级,逐步形成大慈品牌,被中国社会组织评为4A级社会组织、并获上海市科普公益贡献奖、中国红十字会奉献奖、2020年度公益之申“十佳公益项目”等。理事长照诚法师多次获得“上海慈善之星”的称号。\r\n一、“明旸法师助学帮困基金”,通过连续十年总计1000万元的捐赠用于帮助上海在校的孤儿、身患重大疾病等困难家庭学生完成学业。五年来投入资金500万元、受助学生2700人。经第三方评估满意度为100%。\r\n此项目同时也带动了其他爱心企业的积极参与,光明乳业在我们资助的困境学生中每人每年再增加1000元的牛奶卡直到项目结束为止。2019年有一家爱心组织捐赠100万元来认领此项目,我们很高兴的看到基金会爱的种子在持续的发芽。\r\n二、“生命护航——儿童意外伤害”项目,秉承“救孩子,救家庭”的理念,切实有效的帮助遭受意外伤害的患儿家庭,应对突如其来的变故。截止到2020年共救助患儿195人,使用资金278.7万元。2018年我们将项目前移,把宣传教育与救治相结合。举办“儿童无伤害日”,切实守护儿童健康的梦想。\r\n三、2017年大慈基金会与上海市慈善基金会合作举办了“蓝天下的至爱--点亮心愿”慈善义拍。三年来共拍得善款2246.5万元,用于“先心病”手术等医疗项目。\r\n四、为了让革命老区上海对口支援地区的青少年享受到优质科学资源参与科普体验,建立“大慈流动科技馆”项目,四年来共投入资金178万元,共有13000多名孩子受益。\r\n五、利用大数据的优势,推动远程支教项目。对云南泸西县小学推送,让孩子们“走进”上海课堂感受优质教育。\r\n六、“大慈儿童普惠”项目,改善身处困境的儿童生活,该项目执行以来共有5424名孩子受助。\r\n七、2017年开始分别为河南固始等革命老区、云南对口支援地区培训优秀中青教师、校长共183名。\r\n八、“老教授健康关爱”专项基金项目,五年来共资助资金100万元。\r\n九、2018年、2019年在月饼的推广会上共募得资金245万元,全部用于本市残疾儿童等学校。\r\n十、新冠肺炎抗疫期间,捐赠物资1788.04万元,捐赠现金543万元。理事长照诚法师手书“福”字共计1892幅,同时又为1649名上海援鄂医务人员特别发行个性化邮票并定制了“抗疫英雄卡”。\r\n十一、基金会每季度都会开展“一路有你”微慈善项目。\r\n多年来,基金会在项目的运行中突出了三性,广泛性、多样性、特色性,并向专业、规范、制度化迈进。\r\n基金会将继续要以“为政府分忧,为百姓解难”为根本,做好政府想做百姓所需的项目,在人道救助领域倾力奉献。",
170 + "cover": {
171 + "name": "N03.jpg",
172 + "url": "http://gyzs.onwall.cn/2021gyzs/N03.jpg",
173 + "uid": 1564543218846,
174 + "status": "success"
175 + },
176 + "video": {
177 + "name": "N03.mp4",
178 + "url": "http://gyzs.onwall.cn/2021gyzs/N03.mp4",
179 + "uid": 1564543218846,
180 + "status": "success"
181 + },
182 + "status": "ENABLE",
183 + "public_vote": 3981,
184 + "score": 0,
185 + "award": null,
186 + "optr_date": "2021-12-31T15:50:00.547Z",
187 + "corp": {
188 + "name": "上海大慈公益基金会"
189 + },
190 + "voted": false
191 + },
192 + {
193 + "case_id": "424325105943162880",
194 + "code": "N15",
195 + "title": "上海喜雅爱心社区服务中心",
196 + "detail": "喜雅爱心成立于12年,是5A级社会组织,曾获上海市先进社会组织等殊荣。中心共有48名员工,100多名志愿者,有独立的党支部,7名党员。在党建引领下我们积极开展各类公益活动,为服务社区居民贡献自己的力量。\n\n在我们的身边,有这样一群特殊的邻居——“阳光宝宝”,因为智力发育不完善,永远成为了我们关注的阳光宝宝,她们需要被照顾。当我第一次走进长宁区新泾镇“阳光之家”的时候,被这25名在校全日制“阳光宝宝”深深感动,他们乖巧可爱,懂礼貌知感恩,渴望朋友,渴望走出家庭,走出教室,走向社会。他们的年龄在26-47岁之间,他们的父母50-80岁,有的父母早已无力照顾自己的孩子。提升“阳光宝宝”独立生活的能力,让他们学着融入社会,这一生存问题刻不容缓。\n\n在上海市慈善基金会第二届“蓝天至爱计划”的资助下,“阳光宝宝成长计划”应运而生!我们得到了新泾镇人民政府的大力支持。作为项目总设计师,我发挥亲子艺术教育的专业特长,组织团队为“阳光宝宝”量身定制创作课程,结合非遗艺术传承,用宝宝们自己的作品开发“阳光宝宝”文创产品。通过就业指导,培养他们成为新泾镇慈善超市的收银员、公益集市的导购员。正如大家一开篇看到的宣传片,阳光宝宝们正在自信自强地成长!\n\n“垃圾分一分·环境美十分”喜雅爱心积极参与社区治理,助力长宁做好垃圾分类特长生。2018年我们领先全市提出了“垃圾分类达人秀”活动,推荐长宁区垃圾分类形象大使,进单位进学校进社区进商圈,喜雅爱心开展垃圾分类宣讲活动逾2000场。我们开创垃圾分类美学,设计垃圾分类视觉体系,创作垃圾分类普法宣传片,亲身演绎“环保时装秀”,创建长宁区特色工作“八大首创”,设计互动游戏“魔方转转转”,至今为止我们在课堂上累计创作了8000只创意分类垃圾桶。让垃圾分类变得简单有趣,让环保活跃在长宁的大街小巷。我们的足迹从长宁走向上海,为建设美丽上海添上有力的一笔!\n\n更多的,喜雅爱心积极拓展对外服务项目,其中政府购买服务项目涉及长宁区民政局、区绿化市容局、区妇联等8个区政府单位,服务范围覆盖全长宁。为老助餐、上门维修等服务内容20余种,爱心暑托班、春雨润心田等服务项目共计百余个。服务对象从老至幼覆盖全年龄段,从普通家庭到弱势群体,服务十万余人次。把与社区居民有关的事,都当做自己的“头等大事”。",
197 + "cover": {
198 + "name": "N15.jpg",
199 + "url": "http://gyzs.onwall.cn/2021gyzs/N15.jpg",
200 + "uid": 1564543218846,
201 + "status": "success"
202 + },
203 + "video": {
204 + "name": "N15.mp4",
205 + "url": "http://gyzs.onwall.cn/2021gyzs/N15.mp4",
206 + "uid": 1564543218846,
207 + "status": "success"
208 + },
209 + "status": "ENABLE",
210 + "public_vote": 3563,
211 + "score": 0,
212 + "award": null,
213 + "optr_date": "2021-12-31T15:50:00.547Z",
214 + "corp": {
215 + "name": "上海喜雅爱心社区服务中心"
216 + },
217 + "voted": false
218 + },
219 + {
220 + "case_id": "419533650678550528",
221 + "code": "N16",
222 + "title": "上海市宁波商会",
223 + "detail": "上海市宁波商会不是公益基金会,而是代表了商会组织,代表了民营企业的力量。下面从三个方面来阐述:\n第一、党建引领,锻造甬商红色品牌。中共上海市宁波商会委员会成立于2019年,是上海首家异地地市级商会党委,杨浦区首家“两新”组织党委,以“商会会员企业、楼宇企业、党建联席单位”为工作载体,党建联席单位31家,指导联系会员企业近1000家,覆盖4000余名党员,先后开展两新组织党建论坛、践行红色之旅、红五月滨江跑、优秀党建案例分享等具有甬商特色的品牌活动47场,形成了以党建促会建,以党建促会员企业发展的党建工作模式,是新形势下社团组织基层党建工作的创新与实践。\n第二、甬抗疫情,彰显责任与担当。面对突如其来的疫情,商会第一时间做出响应,发布《致全体会员抗击疫情倡议书》和《致全体党员抗击疫情倡议书》,商会会员企业及个人积极响应号召,以实际行动为抗击疫情捐资捐物,投身各项疫情防控工作。据不完全统计,商会企业累计捐助善款及物资近6000万元,商会党委及委员企业累计捐助善款及物资550余万元。期间,我们为瑞金医院援鄂医疗队送去了冲锋衣,为宁波家乡一线工作人员送去了防护服,为华山医院医护人员送去了暖心礼包,杉杉华清医院、大众出行服务、小汤山医院改扩建工程、雷神山医院信息化工程、分众电梯公益广告等等,甬商积极参与各项抗击疫情前线建设和后勤保障工作事例不胜枚举,全体甬商上下一心共同为打赢此次疫情阻击战贡献了力量。\n第三、脱贫攻坚,助力社会事业发展。\n商会始终将家国情怀与企业发展紧密结合,号召全体会员企业践行社会责任。我们致力公益的脚步从未停歇,我们捐赠宁波恩美儿童福利院,关爱折翼天使,我们捐赠上海交通大学医学院附属新华医院,营造儿童公益空间,我们捐赠上海甬协公益基金会,助力贫困优秀大学生读书,我们支持上海公益伙伴日,引领公益之光。商会企业中有代表性的比如分众传媒美丽中国乡村支教、龙元慈善基金会、全筑关爱脑瘫儿童、一兆韦德“老兵回家”等等公益项目,据不完全统计,商会会员企业每年捐助公益项目金额近亿元。\n同时,商会企业在助力脱贫攻坚的道路上,留下了深刻的足迹。例如致达集团,2016年起联合6家企业共同向云南省彝良县捐赠4500万元,修建道路、农民新村和希望小学,目前已经让4000户居民喜迁新居、数百名小学生有了崭新明亮的课堂,使村民逐步摆脱贫困,迈向幸福生活。例如宁波银行上海分行作为第三届进博会“消费扶贫生活馆”的唯一金融支持单位参与其中,为扶贫攻坚和公共卫生安全贡献自己的力量。\n家国有需要,甬商有担当!上海甬商始终坚守初心,爱国敬业,在奉献社会中创造价值,在高质量发展浪潮中勇于担当。",
224 + "cover": {
225 + "name": "N16.jpg",
226 + "url": "http://gyzs.onwall.cn/2021gyzs/N16.jpg",
227 + "uid": 1564543218846,
228 + "status": "success"
229 + },
230 + "video": {
231 + "name": "N16.mp4",
232 + "url": "http://gyzs.onwall.cn/2021gyzs/N16.mp4",
233 + "uid": 1564543218846,
234 + "status": "success"
235 + },
236 + "status": "ENABLE",
237 + "public_vote": 342,
238 + "score": 0,
239 + "award": null,
240 + "optr_date": "2021-12-31T15:50:00.547Z",
241 + "corp": {
242 + "name": "上海市宁波商会"
243 + },
244 + "voted": false
245 + },
246 + {
247 + "case_id": "419561056730619904",
248 + "code": "N20",
249 + "title": "上海乐爱社工师事务所",
250 + "detail": "2012年乐爱在上海市民政局注册成立,多年来致力于提供助残社会工作、社区工作等专业服务,是一家5A级社会组织。业务重点服务浦东新区,杨浦区、徐汇区、宝山区,辐射上海市16个区以及无锡惠山区,总计服务60余个街镇,累计服务人次超过61万人次。多年来获得多项市级、区级奖项。\r\n阳光家园服务\r\n乐爱社工运用“助人自助”的理念为残障学员提供康复服务。包括生活自理、劳动技能、教育培训、康复训练以及社会参与等,提升学员个人能力,为其家庭提供支持,促进亲子关系融洽缓解家庭照护压力。搭建其参与融入社会的平台。2012年至今乐爱累计服务“三阳机构”学员共计17余万人次,为多个“阳光家园”获得了荣誉。如金杨街道“阳光心园”被市残联誉为“上海市残疾人之家”,徐家汇、殷行街道的“阳光心园”获得了“上海市示范型阳光心园”等。\r\n多年助残经验的基础上,形成专业助残服务模式并制定浦东新区阳光之家星级评定标准,在区级助残服务方面,2017年乐爱受浦东新区残联委托对浦东36家“阳光之家”进行培训和督导。\r\n研发行业标准\r\n2019年乐爱与上海市残联合作共同研发制定了《上海市“阳光之家”星级评定标准》,为16个区开展星级评定指标解读的培训,为整个上海市“阳光之家”的服务管理能级提升做出了贡献。\r\n\r\n社区精神障碍服务\r\n社区精神障碍患者由于病情造成生活技能减退,个人及其家庭承受了长期的照护和精神压力。社区对精障人士的排斥及偏见使他们难以融入社会。自2014年开始,乐爱运用“社区康复模式”在殷行街道、徐家汇街道、杨浦区精神卫生中心开展了社区精障患者服务管理平台项目,打造了“康复离院、回归家庭、适应社区、融入社会”完整服务模式。2021年,乐爱开展的社区精神障碍康复工作获得了市民政局的认可,作为第一批试点单位在杨浦区开展试点工作。\r\n该项目在2015年获得《杨浦区十佳优秀案例》,2018年作为社区治理经典案例,收录在上海政法委出版的《综治研究》一书中,2020年,机构也通过此项目被评为“上海市平安示范单位”。\r\n社区治理项目\r\n乐爱发挥专业优势运用“社区工作模式”不断探索社区治理途径,2018年开始承接宝山区区级层面的“活力楼组”建设项目,以“增能赋权”专业理念,探索社区问题解决的新途径。\r\n截止到2021年,乐爱在宝山区12个街镇2个园区,打造了4000余个“活力楼组”。项目获得了中共上海市委组织部、中共上海市委政法委、中共上海市社会工作委员会颁发的“中国(上海)社会治理创新实践优秀案例奖”。",
251 + "cover": {
252 + "name": "N20.jpg",
253 + "url": "http://gyzs.onwall.cn/2021gyzs/N20.jpg",
254 + "uid": 1564543218846,
255 + "status": "success"
256 + },
257 + "video": {
258 + "name": "N20.mp4",
259 + "url": "http://gyzs.onwall.cn/2021gyzs/N20.mp4",
260 + "uid": 1564543218846,
261 + "status": "success"
262 + },
263 + "status": "ENABLE",
264 + "public_vote": 762,
265 + "score": 0,
266 + "award": null,
267 + "optr_date": "2021-12-31T15:50:00.547Z",
268 + "corp": {
269 + "name": "上海乐爱社工师事务所"
270 + },
271 + "voted": false
272 + },
273 + {
274 + "case_id": "421773466363342848",
275 + "code": "N12",
276 + "title": "上海市白玉兰开心家园家庭服务社",
277 + "detail": "“白玉兰”自2013年成立以来,在市妇联悉心培育指导下,在全国三八红旗手赵红娣社长带领下,弘扬公益精神,创新公益实践,用爱心铸就公益服务品牌。\n“白玉兰”坚持将发展公益作为立业之基。在服务对象上,以公益为民的情怀,聚焦困境中的妇女、儿童和家庭,持续深化调解、心理辅导及危机干预等服务;在团队建设上,以公益精神滋养培育了一支200人的志愿服务总队;在公益实践中,以人文关怀精耕细作项目;“白玉兰”在上海这片公益沃土中蓬勃生长。先后获全国维权先进集体、市三八红旗集体、优秀女性社会组织,巾帼文明岗等荣誉称号,获评上海市规范化建设五A社会组织。白玉兰志愿者团队公益服务事迹三次受到上海电视台新闻坊专访和宣传。多次在中国社会组织、上海社会组织等杂志刊登服务事迹。\n为提升服务妇女儿童身心健康专业水平,白玉兰志愿服务总队分设“心理疏导、危机干预、讲师团辅、督导培训、项目执行”五支团队,实行精细化服务。2018--2019连续二年在全市开展“幸福从心出发”百场公益讲座;与市妇联携手打造“12338”心理咨询热线,线上线下同步开展心理援助和危机干预服务,年平均服务3万多人次。为了打造“开心家园”品牌,在做强本部旗舰的基础上,深入各区指导因地制宜建立开心家园心理咨询工作站、社区心理服务点,并在部分区成立“6+1”开心家园示范点,将信访接待、法律援助、人民调解、心理疏导“四位一体”功能落实到基层妇女之家,形成同城效应。\n为了更广惠及民生,积极申报开展各类公益项目,受益人群涵盖失独家庭、妇科癌症患者、单亲困难母亲、困境儿童等,服务范围遍及市内11个区,受益人群达5万多人次。通过心理疏导、团体辅导和主题活动等多种关护形式,引领舒展心胸,直面困境,塑造健康人生。\n“白玉兰”着力打造“知心妈妈”服务品牌。五轮近10年,每年承接政府疑难信访件100多起,面对坚冰,发挥第三方优势,爱心陪伴、认知引导,在政府和上访者之间架起沟通的桥梁,化解率达50%以上,挽救了众多深陷泥潭的家庭。不少对象送来了感谢信、锦旗等,以示感谢。提炼创立的“五步法”,成为化解信访矛盾的行动指南。市信访办和市妇联两次授予“白玉兰知心妈妈项目服务贡献奖”。\n白玉兰主动承担社会责任。2015年元旦外滩踩踏事件,2019年3.25江苏响水化工厂爆炸事件,5.16长宁区建筑工地倒塌等重大灾害事故,白玉兰总会在第一时间请缨并参与救援,使身心遭受重创的家属及时得到抚慰和帮助。为助力抗疫,开设了15场公益微课,8个微信群,为包括社区群众、居委干部、居家学生、消防官兵、城管队员等提供心理调适,更义无反顾与医护人员一起,奔赴长宁区临空留验点开展专业疏导,让700多个回沪人员在第一时间感受到祖国的温暖和伟大。\n白玉兰以专业与爱,让生命如花绽放!",
278 + "cover": {
279 + "name": "N12.jpg",
280 + "url": "http://gyzs.onwall.cn/2021gyzs/N12.jpg",
281 + "uid": 1564543218846,
282 + "status": "success"
283 + },
284 + "video": {
285 + "name": "N12.mp4",
286 + "url": "http://gyzs.onwall.cn/2021gyzs/N12.mp4",
287 + "uid": 1564543218846,
288 + "status": "success"
289 + },
290 + "status": "ENABLE",
291 + "public_vote": 3685,
292 + "score": 0,
293 + "award": null,
294 + "optr_date": "2021-12-31T15:50:00.547Z",
295 + "corp": {
296 + "name": "上海市白玉兰开心家园家庭服务社"
297 + },
298 + "voted": false
299 + },
300 + {
301 + "case_id": "423887740208525312",
302 + "code": "N10",
303 + "title": "上海仁德基金会",
304 + "detail": "上海仁德基金会是2011年12月9日在上海市民政局注册成立的公募基金会。2016年11月,仁德成为上海市首批获得“慈善组织登记证书”和“慈善组织公开募捐资格证书”的五家公募基金会之一。2017年12月通过5A级社会组织评审,成为5A级公募基金会。2019年,上海仁德基金会成立了联合党支部,在党建的引领下,仁德团队立足上海、辐射全国,开展公益活动。\n一、高效透明坚守公益初心\n仁德基金会自成立以来募得善款总计3.64亿,支出善款总计约3.04亿。2017年到2020年每年投入的公益项目资金分别是6248万、8035万、5091万和7992万。仁德高效透明的工作,让一些品牌项目获得政府、社会和企业等相关部门的认可和肯定;得到了新闻媒体的积极宣传和捐赠人的大力支持,项目影响力大、辐射范围广。如“亲亲禾苗,营养一餐”项目持续开展困难学生帮扶工作,自2015年8月实施以来,累计筹款3000多万,已为4.7万名偏远贫困地区的中小学生和特殊学校学生送去营养餐,项目入选国务院扶贫办“2019年全国社会组织扶贫50佳案例”;“春柳-留守女童关爱项目”自2017年实施以来,关注留守女童生理和心理健康,荣获中国慈善项目大赛百强项目荣誉。仁德也连续6年在中国基金会透明指数FTI的(FoundationTransparencyIndex)评比中获得满分100分。在事业不断发展的过程中,仁德也非常注重自身的规范化建设,通过完善内部治理结构、开展建章立制工作、实施员工绩效考核,学习和掌握相关法律法规等活动,在思想上提高员工的意识,在实践中提高员工的技能,在考核中约束员工的行为,从而保障仁德的公益事业公开、透明,符合法律法规的要求,帮扶到真正有需要的人。\n二、高效对接,积极抗疫防疫\n在2020年抗疫工作中仁德团队行动迅速,从1月29日至3月10日的42天内,为了将爱心捐款及时转换成抗疫前线急缺的物资,团队成员们24小时连轴转,通过全国的合作伙伴网络采购物资、联系物流,确保在最短的时间内将物资送到医院和医护人员手中。同时,每一笔抗疫善款的支出都在第二天通过微信公众号向捐赠人和社会公众公示。仁德在抗疫工作中奖励和慰问了1200名上海援鄂医护人员和上海公卫中心医护人员;为上海东方医院等15家医院和5家武汉的医院捐赠了抗疫物资;为疫情期间奋战在养老一线的养老院、养老助餐点和养老护理员捐赠了防疫物资和关爱津贴。仁德还是第一家完成海外捐赠物资免税手续的基金会。\n三、响应政策,助力脱贫攻坚\n2019年-2020年期间仁德员工们不怕苦不怕累,克服高原反应,深入到“三州三区”、云南、贵州的对口支援地区实地调研,充分了解当地老百姓的需求。在此基础上,仁德在“三州三区”、云南和贵州的对口支援地区开展了59个项目,捐赠扶贫资金达1030.8万元,受益人数达9万人次。这些项目以关怀对口支援地区的弱势群体和有需要的群体为己任,积极开展帮扶老、弱、病、残、孤等群体的公益活动。\n四、踊跃参与,增色社区服务仁德从2018年开始与杨浦区12家基金会牵手,支持和辅导社区基金会开展互联网筹款;为全市15家社区基金会参与99公益日筹款提供专业的技术支持和周到的服务。今后,仁德将结合十四五规划和2035年远景纲要的要求,结合上海市公益事业的规划,继续做好品牌项目,让仁爱之心和贤德之举的种子结出更加丰硕的果实。",
305 + "cover": {
306 + "name": "N10.jpg",
307 + "url": "http://gyzs.onwall.cn/2021gyzs/N10.jpg",
308 + "uid": 1564543218846,
309 + "status": "success"
310 + },
311 + "video": {
312 + "name": "N10.mp4",
313 + "url": "http://gyzs.onwall.cn/2021gyzs/N10.mp4",
314 + "uid": 1564543218846,
315 + "status": "success"
316 + },
317 + "status": "ENABLE",
318 + "public_vote": 2607,
319 + "score": 0,
320 + "award": null,
321 + "optr_date": "2021-12-31T15:50:00.547Z",
322 + "corp": {
323 + "name": "上海仁德基金会"
324 + },
325 + "voted": false
326 + },
327 + {
328 + "case_id": "425393918906314752",
329 + "code": "N09",
330 + "title": "上海财经大学教育发展基金会",
331 + "detail": "上海财经大学教育发展基金会是2008年在上海市民政局登记注册的慈善组织,我们以围绕公益、服务上财、服务社会为核心,助力学校建设成具有鲜明财经特色的世界一流大学,在吸引更多的社会力量参与高等财经教育发展的同时,支持抗疫、乡村振兴、长三角发展等工作,践行服务国家战略实施和社会公益发展。\r\n十三年来,上财基金会资产的总规模和公益性支出不段攀升,通过“理念协同、机制协同、项目协同、队伍协同”深化多元化筹资机制,发挥上财专业优势,投资收益表现亮眼。截至2021年6月,基金会净资产为2.62亿元,年均实施项目约为150项,受益人数2万余人。基金会遵守公开透明、专业规范的原则,2017年获评5A级社会组织,并成为上海首家高校公益基地;中基透明指数持续5年保持满分,2020年获上海唯一满分高校基金会。持续打造公益品牌,传播公益文化,连续三年分别以“公益校庆”、“咖啡绿植”、“元阳帮扶”获评公益之申十佳公益校园和公益项目。\r\n1、红色经典,强化党建内涵\r\n在建党100周年之际,基金会携手校友企业设立党建育人基金,通过引入《永不消逝的电波》等一批上海创作的红色经典艺术剧作,打造沉浸式党课,引导党员、师生在感悟经典中赓续红色基因、厚植爱国情怀、汲取精神力量;鼓励支持教职工开展党建课题研究,把党建当学问做,推进党史教育入脑入心。\r\n2、立德树人,关爱学子成长\r\n围绕学校育人的根本任务,基金会累计设立100余项丰富的奖助学金,如山佳奖学金奖励进步最大的学生,让获奖的同学感受到努力被认可的喜悦;设立首个民族专项—石榴籽基金,筑牢中华民族共同意识,贴近、关心和助力民族学生成长成才;设立“心动力”基金,加强学生心理健康教育的内涵建设。\r\n3、千村调查,助力乡村振兴\r\n中国农村是大学生熟悉社会、了解国情的最好课堂,基金会助力打造持续13年的实践项目“千村调查”,支持学生走千村、访万户、读中国、传递爱,将青春写在祖国的大地上,通过田野调查获取数据资料、形成决策咨询报告,为国家相关部门决策提供参考。\r\n基金会设立元阳帮扶基金,携手广大师生、校友、企业和基金会投入和引进400余万资金,从教育、党建入手,助力云南元阳县精准脱贫。我们也将持续为推进乡村振兴贡献上财力量。\r\n4、文化传承,发挥公益育人\r\n基金会聚焦公益育人,指导成立学生公益社团—思源社,启动“六个一”公益传播计划,以“一站公益基地、一堂公益课、一本公益护照、一个公益项目、一次志愿服务、一起做公益”为抓手,“走出去、请进来”携手沪上优秀公益机构,向师生播撒公益种子。\r\n百年芳华,初心如磐。鉴往知来,砥砺前行!上财基金会将持续打造一流,期待更多人和我们一起用公益点亮希望,让城市和社会更温暖。",
332 + "cover": {
333 + "name": "N09.jpg",
334 + "url": "http://gyzs.onwall.cn/2021gyzs/N09.jpg",
335 + "uid": 1564543218846,
336 + "status": "success"
337 + },
338 + "video": {
339 + "name": "N09.mp4",
340 + "url": "http://gyzs.onwall.cn/2021gyzs/N09.mp4",
341 + "uid": 1564543218846,
342 + "status": "success"
343 + },
344 + "status": "ENABLE",
345 + "public_vote": 1564,
346 + "score": 0,
347 + "award": null,
348 + "optr_date": "2021-12-31T15:50:00.547Z",
349 + "corp": {
350 + "name": "上海财经大学教育发展基金会"
351 + },
352 + "voted": false
353 + },
354 + {
355 + "case_id": "425366695058976768",
356 + "code": "N19",
357 + "title": "上海复星公益基金会",
358 + "detail": "复星自成立以来,秉承“修身、齐家、立业、助天下”的理念,深入践行企业社会责任,坚持服务社会、人民和国家。上海复星公益基金会成立于2012年11月,是以复星为主要捐赠人的公益行为体。\n上海复星公益基金会为“中国社会组织评估等级·5A级社会组织”,主要业务包括:健康福祉、教育、文化艺术及青年创业、就业等。每年捐助公益项目30余个,辐射全球多个国家和地区。\n\n抗疫:2020年1月24日除夕当晚,复星紧急成立“全球抗疫指挥部”,启动全球调配医疗物资的抗疫行动,复星基金会设立抗疫专项基金积极投身抗疫。\n此后,复星逐步建立了覆盖日本、印度、英国、德国、巴西、以色列、韩国、波兰等23个国家的物资调配网络,筹措了近300万件各类医疗物资,驰援了包括湖北武汉在内的国内28个省市区抗疫一线。\n2020年3月,在国内疫情持续好转,国外疫情却又呈现爆发态势的情况下,复星又立即启动全球人道主义驰援计划,向全球40多个国家开展捐赠行动。\n复星基金会始终在抗疫前线。自2021年4月底启动驰援印度人道主义行动,五一假期期间,复星印度区域抗疫指挥部休假不休兵,在总指挥部、制氧机生产厂、机场及物流中心、印度前线,复星在每一个环节安排专人把关,争分夺秒加紧生产运输,将印度紧缺的制氧机、呼吸机、口罩等防护设备以最快速度运往当地。\n\n乡村医生:2017年12月,在国家卫生健康委扶贫办的指导下,复星瞄准精准扶贫的薄弱环节——贫困人口的基本医疗保障需求,联合中国光彩事业基金会、中国人口福利基金会等,发起“健康暖心——乡村医生健康扶贫”项目(以下简称“乡村医生项目”)。三年来,复星调动全球资源助力基层医疗体系建立,项目覆盖全国15个省、市、自治区的70个国家级贫困县(包括13个“三区三州”深度贫困县),共帮扶12545个行政村卫生室,守护22192名乡村医生,惠及300万户基层家庭。\n乡村医生健康扶贫项目以帮扶乡村医生为切入口,围绕守护、赋能与激励村医三个核心内容,推进以“五个一”工程为抓手的全方位立体式帮扶计划,派出员工志愿者驻点接力扶贫,帮助贫困地区培养并留住合格的乡村医生,有效提升基层医疗卫生服务水平,最终助力国家脱贫攻坚任务圆满完成。\n2021是中国乡村振兴的元年,在《中共中央国务院关于全面推进乡村振兴加快农业农村现代化的意见》的指引下,复星将继续深化帮扶内容,巩固脱贫成果,以实现基层农村的健康振兴。乡村医生项目将进一步拓展帮扶区域和内容,提升村医的技术能力和工作环境,从而为广大村民提供更好、更可持续的医疗服务,助力“健康中国梦”早日实现。\n\n其他项目:\n-太极抗帕:经过六年多的坚持,至2021年3月,复星基金会“太极抗帕”公益项目已惠及近400位帕金森患者,这项公益还将持续进行。\n-青少年:2013年5月30日,伴随着复星与保德信在中国建立合资公司——复星保德信人寿,上海复星公益基金会与保德信金融集团联手将拥有18年历史的保德信青少年社区志愿奖引入中国,以推动中国青少年公益与国际接轨。青社奖来到中国已经走过了八个年头,至今已有超过4500名中学生申请。在过去的六届里,共表彰了数百位12-18岁在志愿服务或公益活动中做出杰出贡献的中学生志愿者。",
359 + "cover": {
360 + "name": "N19.jpg",
361 + "url": "http://gyzs.onwall.cn/2021gyzs/N19.jpg",
362 + "uid": 1564543218846,
363 + "status": "success"
364 + },
365 + "video": {
366 + "name": "N19.mp4",
367 + "url": "http://gyzs.onwall.cn/2021gyzs/N19.mp4",
368 + "uid": 1564543218846,
369 + "status": "success"
370 + },
371 + "status": "ENABLE",
372 + "public_vote": 1235,
373 + "score": 0,
374 + "award": null,
375 + "optr_date": "2021-12-31T15:50:00.547Z",
376 + "corp": {
377 + "name": "上海复星公益基金会"
378 + },
379 + "voted": false
380 + },
381 + {
382 + "case_id": "427919603789049856",
383 + "code": "N07",
384 + "title": "上海市慈善教育培训中心",
385 + "detail": "上海市慈善教育培训中心成立于1995年,现有员工15人,是一家5A级社会组织。中心成立26年来,始终坚持“知识扶贫、技能助强、促进发展”的宗旨,努力为各类社会群体开展公益慈善教育服务。近5年来,中心每年开展的公益慈善项目超过30个,年投入项目资金近1000万元,每年直接惠及人数超过5万人,从多方面体现了上海对弱势群体的人间大爱和城市温暖,起到公益示范引领作用。先后被评为上海市第七届“慈善之星”和静安区“文明单位”。\r\n1、“大众创业、万众创新”特色明显。中心连续16年在全市90余所高校、中职校举办了免费创业教育培训班,举办上海市青年创业夏令营,累计投入资金540余万元,共惠及大中专学生13000余人,其中有9人获得全国创业大赛一等奖和全球创业精神大奖。有数百名学生实施了自主创业,成为活跃在上海和帮助家乡脱贫的成功创业者。\r\n2、“共享阳光、助力脱贫”。中心从2015年起连续实施“共享阳光”公益行动,累计投入资金1500余万元,帮助1000多名外来务工者获得大、中专学历证书,有1500多人通过参加免费职业技能培训提升了职业能力,在上海稳定就业,助力脱贫,提高了生活水平。\r\n3、“金融普惠教育,推进社会和谐”。中心从2016年起对社区老年人、外来务工者、在校大学生、社区青少年等人群免费开展了金融知识和防范金融风险教育及少儿财商教育,累计投入资金690.9万元,惠及人员近10万人。\r\n4、“创意艺术教育,助力青少年发展”。中心从2013年开始启动“牵手艺术彩虹·献给未来地球”青少年创意艺术教育培训项目,8年来投入资金1400余万元,吸引了12万人次的青少年参加,探索了自闭症青少年通过创意教育提升工业设计能力的途径和方法,建立了教育、产业、商业和媒体深度融合的新模式,一些优秀设计作品被应用于文具等产品,一批自闭症青少年提高了社会交往能力,有的建立了个人工作室,有的实现就业。\r\n5、“科普教育,提升素质”。中心从2017年开始对青少年免费开展无人机科普教育,并组织开展了有200万人次青少年参加的全国航空·无人机科普培训和大赛,将青少年科普教育与国防教育、公益教育相结合,开创了特殊青少年科普教育的新途径。\r\n6、“抗疫情、送温暖”。新冠疫情期间,中心积极做好防疫、抗疫物资捐赠工作。组织艺术家以各种艺术表演形式进行抗疫宣传,举办“共克时艰抗疫情,线上义演赞英雄”慈善专场演出,用抖音、美篇等方法合成一个个微视频作品,其网上展播量超过80万人次,鼓舞了全国人民抗疫必胜的斗志。为湖北“共享阳光”学员及时送上一份慰问金,表达了对英雄的武汉和湖北人民为战胜新冠疫情作出重大贡献的感谢。\r\n7、“示范引领,体现责任”。中心注重公益慈善的诚信建设,26年中没有发生诚信和质量问题,近五年来,带动3万人次志愿者参与公益项目,有100多家企业和机构合作开展公益项目。中心还为本市和外地社会组织开展能力建设培训,仅中心原副主任徐本亮一人就为全国4000多家社会组织开展了培训和咨询。",
386 + "cover": {
387 + "name": "N07.jpg",
388 + "url": "http://gyzs.onwall.cn/2021gyzs/N07.jpg",
389 + "uid": 1564543218846,
390 + "status": "success"
391 + },
392 + "video": {
393 + "name": "N07.mp4",
394 + "url": "http://gyzs.onwall.cn/2021gyzs/N07.mp4",
395 + "uid": 1564543218846,
396 + "status": "success"
397 + },
398 + "status": "ENABLE",
399 + "public_vote": 1076,
400 + "score": 0,
401 + "award": null,
402 + "optr_date": "2021-12-31T15:50:00.547Z",
403 + "corp": {
404 + "name": "上海市慈善教育培训中心"
405 + },
406 + "voted": false
407 + },
408 + {
409 + "case_id": "429036392128294912",
410 + "code": "N17",
411 + "title": "上海秋海堂文化艺术中心",
412 + "detail": "秋海堂文化艺术中心(以下简称秋海堂)创办于2014年,缘起并蒙恩于海上艺术大家——书画泰斗陈佩秋、著名书法家刘小晴先生。创办者是两位书画大家的共同入室弟子徐宏斌。\r\n2018年3月31日,陈佩秋先生曾亲自为秋海堂陈佩秋大师工作室揭牌。2018年12月8日刘小晴书法工作室在秋海堂正式揭牌;2017年起著名画家陈翔(现上海中国画院院长)在秋海堂开设陈翔中国画公益讲堂。\r\n依托名家大师工作室,秋海堂致力于书画艺术的传承、传播。守正创新,紧贴时代,举办高水平的艺术活动;推动书法文化进校园,注重美育、德育相结合;发起秋海堂刘小晴艺术基金,坚持投身公益和扶贫事业,持续帮扶徐汇区对口支持的云南省红河州,为脱贫攻坚事业作出突出贡献。正因为连续几年文化扶贫的行为和贡献,秋海堂文化艺术中心创办人,徐宏斌老师,于2021年2月份被评为全国脱贫攻坚先进个人的荣誉。而且在全国三千多先进个人当中,他也是唯一的书法工作者。这也是对秋海堂多年来文化扶贫的最大肯定。\r\n秋海堂文化艺术中心是在徐汇区民政局注册、接受徐汇区文旅局指导的优秀公益组织,先后被评为或授予:徐汇区美术馆美育共同体成员单位(徐汇区文旅局),徐汇区市民修身基地(徐汇区文明办),徐汇区新的阶层人士工作示范点(徐汇区委统战部)、徐汇区特殊对象未成年子女教育关爱基地(徐汇区司法局)、徐汇区政协书画院创作基地(徐汇区政协)。2021年入选上海百佳社会组织排行榜。\r\n秋海堂植根徐汇,已先后设立虹梅街道、天平街道、凌云街道等大师工作室社区基地,并先后与高安路第一小学、上海市中国中学,世界外国语中学等合作共建。开展“百场公益讲座”活动,先后走进多家学校和社区,两年时间已经进行了70多场书法公益讲座,影响到数千名青少年。秋海堂曾被《人民日报》作为上海艺术馆品牌典型进行专题报道。",
413 + "cover": {
414 + "name": "N17.jpg",
415 + "url": "http://gyzs.onwall.cn/2021gyzs/N17.jpg",
416 + "uid": 1564543218846,
417 + "status": "success"
418 + },
419 + "video": {
420 + "name": "N17.mp4",
421 + "url": "http://gyzs.onwall.cn/2021gyzs/N17.mp4",
422 + "uid": 1564543218846,
423 + "status": "success"
424 + },
425 + "status": "ENABLE",
426 + "public_vote": 3179,
427 + "score": 0,
428 + "award": null,
429 + "optr_date": "2021-12-31T15:50:00.547Z",
430 + "corp": {
431 + "name": "上海秋海堂文化艺术中心"
432 + },
433 + "voted": false
434 + },
435 + {
436 + "case_id": "426455554140151808",
437 + "code": "N08",
438 + "title": "上海市基金同业公会",
439 + "detail": "上海市基金同业公会成立于2010年11月18日,是由上海基金行业相关业务单位发起并自愿组成的行业性的非营利性社会团体法人,是中国第一家基金行业自律组织。目前,公会共有会员单位181家,包括上海地区66家公募基金机构,37家资产管理机构,24家私募基金机构,32家基金销售机构,22家异地基金管理公司在沪分支机构。其中,公募基金会员管理资产规模8.67万亿元,占全国37.84%。\n公会成立以来,始终以公益为立会之本,坚持以服务为基础、自律为核心,充分发挥公会的桥梁纽带作用,在投资者教育、自律管理、会员服务、国际交流、社会责任上成功打响了中国基金业第一家同业公会的品牌,为建设上海国际金融中心和国际资管中心作出积极的贡献。\n\n-探索公益投教新模式,强化投资者保护工作\n公会自成立以来,累计举办投资者保护教育宣传活动百余场,向投资者发放实物投教产品达40万件;首创网上基金学院、公募基金集体接待日,通过网络打破了地域界限,让全国各地投资者与上海基金公司实现零距离互动交流;策划筹建上海地区首个由自律组织和地方政府共建的投资者教育基地:上海基金业—陆家嘴金融城投资者教育基地,提供投资者看得见、摸得到的多元公益投教;与第一财经携手打造业内首个投资者教育电视栏目《基金时间》,每周三晚在第一财经电视、抖音等平台播出,帮助投资者更好地认识基金,树立科学的投资理念,受到业内业外高度认可和广泛赞誉,成为上海基金业的投教新名片。\n\n-发挥行业核心优势、服务国家发展战略,进一步推进金融行业对外开放\n2020年4月1日起,我国正式取消对证券公司、公募基金管理公司的外资持股比例限制。在此背景下,3月31日,在我国正式取消对证券公司、公募基金管理公司的外资持股比例限制的前夕,由公会牵头编写的《海外资管机构赴上海投资指南》中英文双版正式发布,收到海外资管的高度评价,这是国内同类行业协会为服务海外资管机构推出指南性文件的首次尝试,同时也开创了城市编写指南吸引海外资管投资的先河。\n\n-行业强大合力应对疫情,彰显社会组织公益属性\n2020年1月,湖北武汉爆发新冠疫情,公会第一时间向行业发出《致敬白衣天使项目倡议书》,设立全国首个由行业自律组织发起的专项基金:上海基金业致敬白衣天使专项基金。专项基金共筹集了4748.1736万元,直接拨付抗疫医务工作者2676万元,受益医务人员及家属共计4349名;支持市卫健委“防控新冠疫情纪念铜章”、市基层卫生抗疫表彰活动、《逆行者》—上海援鄂医务人员群像雕塑等公益项目;致力推动上海市医疗卫生系统人才培育,支持上海市“杰出青年医学人才”以及“十佳家庭医生”项目。专项基金荣获上海慈善最高奖项第十一届“中华慈善奖上海市提名奖”。此外,上海基金业捐款捐物超过一亿,在全市社团组织中位居前列,充分展现上海基金业责任与担当。",
440 + "cover": {
441 + "name": "N08.jpg",
442 + "url": "http://gyzs.onwall.cn/2021gyzs/N08.jpg",
443 + "uid": 1564543218846,
444 + "status": "success"
445 + },
446 + "video": {
447 + "name": "N08.mp4",
448 + "url": "http://gyzs.onwall.cn/2021gyzs/N08.mp4",
449 + "uid": 1564543218846,
450 + "status": "success"
451 + },
452 + "status": "ENABLE",
453 + "public_vote": 2273,
454 + "score": 0,
455 + "award": null,
456 + "optr_date": "2021-12-31T15:50:00.547Z",
457 + "corp": {
458 + "name": "上海市基金同业公会"
459 + },
460 + "voted": false
461 + },
462 + {
463 + "case_id": "422875798316593152",
464 + "code": "N05",
465 + "title": "上海市浦东新区旅游业协会",
466 + "detail": "上海市浦东新区旅游协会成立于1995年,是浦东新区旅游行业企事业单位自愿组成的跨部门、跨所有制的非营利行业性社会团体。\n协会成立至今,先后获得市级、区级各项荣誉称号,2016年,被上海市社团管理局评为“5A级社会组织”。现有会员单位超过350余家,下设宾馆、旅行社、景点、旅游投资发展4个专业委员会,行业覆盖率90%以上。\n在新区民政局与新区文体旅游局指导与支持下,协会以探索公益创新模式为目的,积极践行公益事业之路。今天,我将从三个方面着手,为各位评委老师讲述我们的公益事业:\n一、紧握服务企业根本,打造特色公益品牌\n多年来,协会紧紧围绕以公益促发展,以服务促提升,不断迭代升级特色公益品牌,结合浦东旅游实际情况,积极开展各类公益活动,为推动上海建设“公益之城”添砖加瓦。\n协会以服务会员为工作核心,以极力支持社会公益活动为根本,秉持着“为会员排忧解难、为行业保驾护航”的服务理念,始终按照“服务、代表、协调、自律”为工作宗旨,不断积极探索公益模式,先后树立了5·19中国旅游日浦东新区主题活动、对口援建、新区旅游业纠纷调解公益平台、浦东旅游志愿者队伍等协会特色公益品牌项目。\n二、发挥行业资源优势,践行公益旅游之路\n为深入贯彻落实习近平总书记关于对口支援工作一系列重要指示精神,根据翁祖亮书记关于浦东与莎车、大理2020年度扶贫协作工作指示,协会先后组织开展新区旅游企业赴新疆莎车县、云南大理市进行旅游援建工作,就客源输送、文旅融合发展、旅游产品定制、旅游资源整合、运营效率提升、人才培养、民宿产业探索等多方面给予扶持,以实际旅游产业提升与经济效益拉动来促进沪疆、沪滇之间文化旅游援助行动。\n同时,协会积极围绕打造浦东公益旅游新项目,在5•19中国旅游日策划开展浦东新区主题公益活动,活动通过旅游企业集体宣传浦东旅游资源,讲好浦东旅游故事,同时串联滨江“世界会客厅”及网红打卡点,将7色丝带化身爱和正能量进行传播与分享,营造多样化沉浸式旅游休闲体验,体现“彩色让世界更美好”精神。\n另外依托强大的会员体系及组织优势,协会积极探索建立以浦东新区旅游企业为志愿者的旅游志愿服务队伍。进一步引导新区旅游从业人员做文明旅游的倡导者、推动者、实践者,推动规范长效的旅游志愿服务机制,提升浦东新区旅游质量满意度。\n三、助力企业复工复产,拓展延伸公益新思路\n随着疫情防控进入常态化,国内游在不断恢复中,内循环成为旅游复苏的主战场。协会抓牢重点工作,整合内需,创新打造了“惠游浦东”品牌,推出了“惠游浦东”旅游联票和“惠游浦东”文旅巡展等活动,进一步刺激文旅消费潜力,助力畅通新区文旅企业后疫情时代内循环通路。\n今后,协会在各项公益活动、志愿服务活动中将拿出120分的热情和150分的努力,以非营利性作为基础,积极探索公益新模式,为推动公益之城建设垒土筑基。",
467 + "cover": {
468 + "name": "N05.jpg",
469 + "url": "http://gyzs.onwall.cn/2021gyzs/N05.jpg",
470 + "uid": 1564543218846,
471 + "status": "success"
472 + },
473 + "video": {
474 + "name": "N05.mp4",
475 + "url": "http://gyzs.onwall.cn/2021gyzs/N05.mp4",
476 + "uid": 1564543218846,
477 + "status": "success"
478 + },
479 + "status": "ENABLE",
480 + "public_vote": 2276,
481 + "score": 0,
482 + "award": null,
483 + "optr_date": "2021-12-31T15:50:00.547Z",
484 + "corp": {
485 + "name": "上海市浦东新区旅游业协会"
486 + },
487 + "voted": false
488 + },
489 + {
490 + "case_id": "426458849424449536",
491 + "code": "N01",
492 + "title": "上海霞满云间公益发展中心",
493 + "detail": "简介:\r\n上海霞满云间公益发展中心是一家专注机构养老、社区养老、居家养老、智慧养老业务的社区服务综合体。\r\n愿景——做上海最专业的上门居家养老服务机构\r\n使命——使用科学技术和爱的力量,为改善提升服务对象的生活生命质量而不懈努力\r\n理念——以生命服务生命以生命影响生命\r\n价值观——守法、尊重、安全、专业、快乐\r\n运营能力:\r\n霞满云间以专业为基础,将机构养老、社区养老和居家养老深入融合。机构自2012年成立以来,人员团队不断壮大,人员流失率1%,政府采购项目承接规模逐年递增,年度收入增长率约41.17%。霞满云间下辖机构养老四家,社区综合为老&日间养老6家,居家养老涉及松江7个街镇,实施分区域分层次阶梯式管理,为老年朋友提供标准化、专业化、人性化养老护理服务。\r\n公益理念:\r\n饮水思源、回报社会,是企业应尽的社会责任,霞满云间自2012年成立至今,主动承担社会责任,上海霞满云间公益发展中心是上海市民政局5382号公益基地,下辖5家公益基地,由专人负责管理,定期在“公益上海”平台发布公益消息,募集社会各方力量,倡导传播公益精神,救助弱势群体,努力营造社会和谐共享氛围。霞满云间积极开展公益项目,有认知症友好社区建设、失能老人助浴、爱心护理床、老伙伴互助等等,截至2020年底,机构共计承接公益项目100多个,服务老人达10万余,受益人次100万余人次,为提高社区老人生活生命质量做出了应有贡献。\r\n公信力、影响力:\r\n机构与日本、台湾、马来西亚等专业服务机构常年合作,与上海智障志愿者团队结成合作伙伴关系;经常接受市、区民政、区残联、街镇相关部门的指导和培训。\r\n并于2015年荣获上海市4A级社会组织;\r\n2015年、2018年和2019年荣获上海市肢残人协会颁发的优秀集体奖;\r\n2016年荣获优秀社会组织;\r\n2017年荣获慈善基金会颁发的慈善社会组织荣誉证书;\r\n2018年被评为2016-2017年度先进慈善义工集体;\r\n2019年荣获方松街道颁发的方松最美团队荣誉证书;\r\n“为长期卧床老人上门助浴”案例在2019年松江区养老服务行业评选表彰活动中荣获“十佳养老服务案例”称号;\r\n2020年度上海市承接政府购买服务社会组织,荣获《聚焦热点》栏目品牌机构展播(播出平台:上海电视台纪实人文频道),同年荣获慈善基金会颁发的“慈善捐赠爱满云间”奖杯。服务中频频收到服务对象送来的感谢信、锦旗等。\r\n2021年承接机构养老方松街道敬老院20年度上海市养老机构服务质量监测排名区排名第二,市排名前五。\r\n可持续发展:\r\n上海霞满云间公益发展中心以公益为纽带,促进“企社”、“社社”的合作。以慈善为导向,将社会各方面的人士共同联合起来,更进一步去激发社会的爱心,把我们的养老事业、养老服务做得更好。\r\n养老事业是非常富有意义的,我们将不遗余力地按照我们党“人民城市人民建,人民城市为人民”这个理念,共同去贴近养老事业的发展,让我们老年人的感受度、满意度、温暖度获得一个很大的提升。",
494 + "cover": {
495 + "name": "N01.jpg",
496 + "url": "http://gyzs.onwall.cn/2021gyzs/N01.jpg",
497 + "uid": 1564543218846,
498 + "status": "success"
499 + },
500 + "video": {
501 + "name": "N01.mp4",
502 + "url": "http://gyzs.onwall.cn/2021gyzs/N01.mp4",
503 + "uid": 1564543218846,
504 + "status": "success"
505 + },
506 + "status": "ENABLE",
507 + "public_vote": 4352,
508 + "score": 0,
509 + "award": null,
510 + "optr_date": "2021-12-31T15:50:00.547Z",
511 + "corp": {
512 + "name": "上海霞满云间公益发展中心"
513 + },
514 + "voted": false
515 + },
516 + {
517 + "case_id": "422530524956082176",
518 + "code": "N11",
519 + "title": "上海市阳光社区青少年事务中心",
520 + "detail": "上海市阳光社区青少年事务中心成立于2004年2月,是一家致力于青少年成长发展的社会服务机构。主要承接政府委托的6-25周岁社区青少年教育、管理和服务事务,400余名专职青少年事务社会工作者分布在13个区167个街镇,运用专业方法开展就业创业、社区融入、亲职教育、生命健康、助困增能、志愿服务、外展服务、未成年人司法等八大类服务。\n一、秉持专业理念,践行助人自助宗旨\n(一)关爱困境青少年,陪伴健康成长\n主要对城区困境青少年、金山(准)孤儿、崇明区留守儿童提供服务,建立“一人一档”,以个案辅导、家长沙龙、自护课堂、志愿服务等形式开展专业服务,引导困境青少年群体“爱自己、爱家庭、爱社区”,以全方位、多维度的陪伴式服务提升青少年的自我认同感和社会融入感。\n(二)关注未就业就学青少年,引导回归社会\n面对16至25周岁的未就业就学青少年群体,从优势视角出发,以就业促业、学历技能提升为抓手,协助与家庭、社区建立联结。2004年至今协助近五万名青少年成功就业。\n(三)聚焦特定青少年,促进社会融入\n一是面向刑事案件中需要帮扶、救助的未成年人开展教育引导和正向激励,累计服务、帮教违法涉罪未成年人1万余名;二是已介入近千个涉未成年人家事案件,提供庭前调解、心理疏导、家事调查、回访观护、担任探望监督人等服务,维护未成年人合法权益。\n二、构建保护体系,探索社会治理模式\n(一)参与地方标准建设,推动行业发展\n机构作为主要起草单位参与研制全国首个聚焦未成年人司法领域的《未成年人司法社会工作服务规范》这一上海地方标准。该标准的建立促进了全国未成年人司法社会工作的专业发展。\n(二)建立合作应急平台,集合专业力量\n机构建立“跨专业多部门合作应急平台”,联合高校、精卫中心、青少年热线、基金会、律师、媒体等力量形成青少年保护合作联盟,共同为青少年搭建权益保护“港湾”。\n(三)设立阳光研究院,加强分析预判\n每年面向高校发布青少年重点、热点问题的研究项目指南,联同市阳光中心的资深青少年事务社会工作者开展协同式研究。定期将现状、问题及针对性的对策建议形成调研报告、专报,助力相关职能部门对青少年问题的研判。\n成立十七年来,上海市阳光中心坚持以职业化、专业化为导向,加强社工队伍建设,汇聚了一批具有社会工作专业知识、勇于创新、敢于开拓、无私奉献的社工人才,在保护青少年权益的道路上不断前行!",
521 + "cover": {
522 + "name": "N11.jpg",
523 + "url": "http://gyzs.onwall.cn/2021gyzs/N11.jpg",
524 + "uid": 1564543218846,
525 + "status": "success"
526 + },
527 + "video": {
528 + "name": "N11.mp4",
529 + "url": "http://gyzs.onwall.cn/2021gyzs/N11.mp4",
530 + "uid": 1564543218846,
531 + "status": "success"
532 + },
533 + "status": "ENABLE",
534 + "public_vote": 923,
535 + "score": 0,
536 + "award": null,
537 + "optr_date": "2021-12-31T15:50:00.547Z",
538 + "corp": {
539 + "name": "上海市阳光社区青少年事务中心"
540 + },
541 + "voted": false
542 + }
543 + ]
544 +
545 +export default data
...\ No newline at end of file ...\ No newline at end of file
1 +const data = [
2 + {
3 + "case_id": "4245898071640719361",
4 + "code": "N06",
5 + "title": "复旦管理学奖励基金会",
6 + "detail": "我国自古就有优秀的管理思想和实践,但中国现代管理科学则是在改革开放之后才逐步发展起来的。为进一步推动我国现代管理科学发展,原中共中央政治局常委、国务院副总理李岚清同志于2005年发起成立了复旦管理学奖励基金会,这也是中国人自己设立的管理学界第一个奖励基金会。\r\n“要真正解决好中国的管理问题,最终还是要依靠中国人自己。”这句话道出了“管理”必须根植于一个国家的社会组织和民族文化。管理科学,是兴国之道,也是一个国家软实力的重要组成部分。\r\n十六年来,基金会各项管理逐步完善,2020年首次参加社会组织等级评估即被授予“5A级社会组织”荣誉称号;FTI透明指数排名连获最优等级。基金会的评奖工作,及其开展的一系列公益项目,获得了来自各界人士的一致认可;同时借助媒体之力,不断拓宽公众对中国管理学的认识边界,受益人数不断增加。如今,基金会已逐渐发展成为中国管理学界最具影响力、最具公信力的基金会。\r\n作为一个“奖励性”的基金会,我们希望打造中国管理学界的“诺贝尔奖”。基金会目前设立了“复旦管理学杰出贡献奖”“复旦管理学终身成就奖”“复旦企业管理杰出贡献奖”三大奖项,已成为我国管理学界享有崇高声誉、具有广泛影响力的重要奖项。截至2020年,已评选出57位获奖人,他们中不乏成思危、苏东水等矢志推动中国特色的管理学及其研究走向世界的杰出专家学者,亦有张瑞敏、任正非等对中国管理学不断实践、探索的优秀民族企业家。\r\n评奖之外,基金会还积极开展了丰富多样的公益活动。自2013年起,面向我国高等学府,面向青年师生,面向中西部地区举办了“校园公益”系列讲座活动,辐射师生5000余人。\r\n联合我国管理学一级学会,举办了一系列具有国际影响力的管理学学术盛会。其中,“中国管理学年会”是中国管理学领域规模最大、层次最高的综合性学术会议。另外,基金会通过支持“中国管理学青年论坛”,为有潜力的优秀青年架起了跨学科、跨层次的学习交流平台,旨在培养中国管理学的中青年力量。\r\n为加强学术界和实业界的合作,基金会充分发挥“桥梁·引领·赋能”作用,做到将“管理学带出去”,“管理领进来”,邀请获奖人、专家学者与企业家共话“管理”。\r\n基金会还与复旦大学东方管理研究院、第一财经合作开展了“中国杰出企业家管理思想访谈录”项目,已通过42集电视专题片、6部《改变世界》、14本研究丛书等形式对外发布,另有10多个优秀案例走进了高校课堂,收益人数达10亿多人。\r\n基金会积极响应习近平总书记“把论文写在祖国大地上”的号召,与《管理学报》合作,举办专题学术研讨会,开辟“中国企业家管理思想”专栏;与知名企业合作开展“海尔生态雨林计划”等专项研究。\r\n2020年新冠疫情的突发,对全国各地的公共卫生治理都是前所未有的考验。为总结出应对疫情的科学、高效的经验,提供疫情应对经验给相关部门,基金会资助了“新冠疫情防控防治的中国特色管理理论与方法”系列专著及案例研究。于基金会而言,这件事意义非常。\r\n作为一个扎根于中国管理学领域发展的公益组织,基金会在各级领导的亲切关怀下不断发展。获奖人所提出管理思想、管理理论和实践的创新、各项公益活动等,对于上海乃至全国各地的社会治理、公共管理与企业管理都发挥了重要的作用。在每年的颁奖典礼上,历任上海市领导均受邀出席并致辞。当今世界正面临百年未有的大变局,发展中国特色的管理学、并让中国特色管理学发挥更大的影响力,这比任何时候都更加迫切。在未来的公益发展事业中,基金会将继续助力中国特色管理学的探索和创新,为增强上海自主创新能力,提高城市国际竞争力,做出新的重大的贡献!",
7 + "cover": {
8 + "name": "N06.jpg",
9 + "url": "http://gyzs.onwall.cn/2021gyzs/N06.jpg",
10 + "uid": 1564543218846,
11 + "status": "success"
12 + },
13 + "video": {
14 + "name": "N06.mp4",
15 + "url": "http://gyzs.onwall.cn/2021gyzs/N06.mp4",
16 + "uid": 1564543218846,
17 + "status": "success"
18 + },
19 + "status": "ENABLE",
20 + "public_vote": 3406,
21 + "score": 0,
22 + "award": null,
23 + "optr_date": "2021-12-31T15:50:00.547Z",
24 + "corp": {
25 + "name": "复旦管理学奖励基金会"
26 + },
27 + "voted": false,
28 + "liked": false
29 + },
30 + {
31 + "case_id": "419178326515888128",
32 + "code": "N14",
33 + "title": "上海市普陀区长寿社会组织联合会",
34 + "detail": "近年来,各类社区社会组织数量增长,规模扩大,社会组织日趋成为服务社区发展,提升社区治理水平的重要力量。所以以服务中心传统的点对点形式来去服务社会组织,已经不符合形势的发展,亟待搭建新的平台。在这种情势下,2016年长寿社会组织联合会孕育而生。长寿社会组织联合会是全市首家街道层面社会组织联合会。联合会以党建为引领,创新构建社区、社会组织、社会组织联合会的联动机制,这种全新模式不仅为社区与社会组织之间搭建了交流对接平台,也为促进社会组织自律自治、资源共享、健康发展创造了良好的条件。\n联合会运行以来,正式会员近百家。目前,长寿社会组织联合会成员中已有区党代表、区人大代表、区政协委员,充分激发社会组织领军人物的参与度,发挥社会组织自我管理、自我服务的能效。\n创新党建引领社会组织参与社区治理是我们的工作特色之一。2016年我们同步成立联合会党总支,党总支通过“价值引领、服务凝聚、同心共治”凝聚党员力量,提升基层组织活力。目前,党总支下设20个党组织、6个联合支部,14个独立支部。联合会自成立以来开展了一系列凝聚力建设活动,包括开展情景党课、建立学习教育体验站等等,我们还努力将公益理念引入党建活动,例如开展垃圾分类主题党日活动。通过这些活动和服务,不仅会员们的凝聚力日益增强,更是聚拢到了一批原先游离在边缘的社会组织。\n搭建公益服务平台也是我们最大的工作特色。我们通过公益秀、公益项目菜单、公益集市等形式将社会服务和项目精准化地投放到我们两新组织、楼宇和居民区,政府购买社会组织服务项目的数量及社区参与面都有了一个较大幅度的提升。\n在新媒体时代,为了更加方便项目对接,社联会依托微信公众号平台,于18年9月正式上线了长寿公e家网站。公e家的推出填补了20万以下政府采购服务对接渠道的空白。居民区科室可以进行社区需求发布,社会组织发布服务内容,这样以来加快了信息传递速率,实现了项目精准对接。例如,我们会在学生的暑假开展暑期班公益项目,让公益项目走进社区、走进百姓生活中。项目结项后,我们会举办成果展,把项目的成果进行公示,并在公E家上给承接方打分,能够让购买方一目了然地了解社会组织的服务能力。通过这样一个平台,我们让长寿的社会组织能真正了解到社区的需求,因地制宜地研发适合长寿、服务长寿的公益项目。尤其在疫情的冲击下,公E家的优势更加得到了肯定。2016年以来我们通过线上线下的渠道共举办了115个公益项目、300余场活动,有效实现社会组织与居民需求的“无缝对接”。\n我们在实践中摸索,完善中创新。展望未来,长寿社会组织联合会也将不断探索,下一步的计划是“请进来、走出去”,长寿社会组织联合会将联合其他街镇乃至其他区县的社会组织共同协作,打破社会组织属地化壁垒,提升他们视野和竞争力,因地制宜的研发出服务社区的公益项目,让公益的力量势如破竹,为打造精彩长寿、善美普陀和公益上海添砖加瓦。",
35 + "cover": {
36 + "name": "N14.jpg",
37 + "url": "http://gyzs.onwall.cn/2021gyzs/N14.jpg",
38 + "uid": 1564543218846,
39 + "status": "success"
40 + },
41 + "video": {
42 + "name": "N14.mp4",
43 + "url": "http://gyzs.onwall.cn/2021gyzs/N14.mp4",
44 + "uid": 1564543218846,
45 + "status": "success"
46 + },
47 + "status": "APPLY",
48 + "public_vote": 3346,
49 + "score": 0,
50 + "award": null,
51 + "optr_date": "2021-12-31T15:50:00.547Z",
52 + "corp": {
53 + "name": "上海市普陀区长寿社会组织联合会"
54 + },
55 + "voted": false
56 + },
57 + {
58 + "case_id": "419527762110595072",
59 + "code": "N04",
60 + "title": "上海震旦教育发展基金会",
61 + "detail": "上海震旦教育发展基金会成立于2015年,秉持弘扬公益精神,积极回报社会的办会宗旨,努力汇集各方力量、传递正能量。\r\n基金会主要以四项特色工作为主:\r\n(一)携手各方力量,关爱特殊人群\r\n震旦教育基金会已成功主办、协办多项全国性、市级助残公益活动。关爱自闭症特殊群体活动,主题鲜明、内容丰富、参与者众、受益面广。\r\n(二)共襄慈善良业,回报社区民众\r\n震旦教育基金会为社区建设作贡献。为黄浦社区加装电梯工程中做配套绿化改建项目,为居民提供了优美的绿化环境。\r\n基金会每年中国传统节日前向街道、镇、村老人、残疾人送去温暖与爱心。\r\n2020年疫情期间,震旦教育基金会为黄浦区各大医院、派出所等总共58家单位,送去价值28万余元的哈根达斯蛋糕,向日夜坚守在疫情防控第一线的工作人员送去慰问与祝福,为抗击疫情助力加油!\r\n(三)引领环保时尚,共倡整洁家园\r\n震旦教育基金会联合公益机构举办了多场大型环保艺术展,在浦东科技馆的“艺起减塑”历时90天,共接待观众逾13万人次,使参与者对环保、减塑、有了感性的认识,也认识到环保是我们全人类的职责与使命。\r\n(四)共同奉献爱心,基金奖励优秀\r\n震旦师生积极为抗疫捐款,把参与慈善公益事业作为每个人的社会责任与使命。在疫情之中,基金会表彰震旦职业学院17名驰援武汉的毕业生,给予每人2万元的奖励,鼓励和表彰他们无私无畏,挺身而出把人民生命安全放在首位的大无畏精神。\r\n震旦教育基金会近年来开展了50多项公益项目活动,受益人数16万余人次。震旦教育基金会将不忘初心,凝心聚力,坚毅前行,吸纳更多热心于慈善事业的有识之士参与,做更多造福于社会的公益活动。",
62 + "cover": {
63 + "name": "N04.jpg",
64 + "url": "http://gyzs.onwall.cn/2021gyzs/N04.jpg",
65 + "uid": 1564543218846,
66 + "status": "success"
67 + },
68 + "video": {
69 + "name": "N04.mp4",
70 + "url": "http://gyzs.onwall.cn/2021gyzs/N04.mp4",
71 + "uid": 1564543218846,
72 + "status": "success"
73 + },
74 + "status": "REFUSE",
75 + "public_vote": 4125,
76 + "score": 0,
77 + "award": null,
78 + "optr_date": "2021-12-31T15:50:00.547Z",
79 + "corp": {
80 + "name": "上海震旦教育发展基金会"
81 + },
82 + "voted": false
83 + },
84 + ]
85 +
86 +export default data
...\ No newline at end of file ...\ No newline at end of file
1 +<template>
2 + <router-view></router-view>
3 +</template>
4 +
5 +<script>
6 +export default {
7 + data () {
8 + return {
9 +
10 + }
11 + },
12 + mounted () {
13 +
14 + },
15 + methods: {
16 +
17 + }
18 +}
19 +</script>
1 +<!DOCTYPE html>
2 +<html lang="en">
3 + <head>
4 + <meta charset="UTF-8" />
5 + <link rel="icon" href="/favicon.ico" />
6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7 + <title>Vite App1</title>
8 + </head>
9 + <body>
10 + <div id="app"></div>
11 + <script type="module" src="./main.js"></script>
12 + </body>
13 +</html>
1 +import { createApp } from 'vue';
2 +import App from './App.vue';
3 +// import store, { key } from './store/index';
4 +import router from './router';
5 +
6 +createApp(App).use(router).mount('#app');
1 +import { createRouter, createWebHashHistory } from 'vue-router';
2 +
3 +const router = createRouter({
4 + history: createWebHashHistory('/index.html'),
5 + routes: [
6 + {
7 + path: '/',
8 + name: 'mono2',
9 + component: () => import('./views/index.vue'),
10 + },
11 + ],
12 +});
13 +
14 +export default router;
1 +<template>
2 + <div class="">456</div>
3 +</template>
4 +
5 +<script>
6 +export default {
7 + data () {
8 + return {
9 +
10 + }
11 + },
12 + mounted () {
13 +
14 + },
15 + methods: {
16 +
17 + }
18 +}
19 +</script>
20 +
21 +<style lang="less" scoped>
22 +
23 +</style>
1 +<template>
2 + <router-view></router-view>
3 +</template>
4 +
5 +<script>
6 +export default {
7 + data () {
8 + return {
9 +
10 + }
11 + },
12 + mounted () {
13 +
14 + },
15 + methods: {
16 +
17 + }
18 +}
19 +</script>
1 +<!DOCTYPE html>
2 +<html lang="en">
3 + <head>
4 + <meta charset="UTF-8" />
5 + <link rel="icon" href="/favicon.ico" />
6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7 + <title>Vite App1</title>
8 + </head>
9 + <body>
10 + <div id="app"></div>
11 + <script type="module" src="./main.js"></script>
12 + </body>
13 +</html>
1 +import { createApp } from 'vue';
2 +import App from './App.vue';
3 +// import store, { key } from './store/index';
4 +import router from './router';
5 +
6 +createApp(App).use(router).mount('#app');
1 +import { createRouter, createWebHashHistory } from 'vue-router';
2 +
3 +const router = createRouter({
4 + history: createWebHashHistory('/index.html'),
5 + routes: [
6 + {
7 + path: '/',
8 + name: 'mono2',
9 + component: () => import('./views/index.vue'),
10 + },
11 + ],
12 +});
13 +
14 +export default router;
1 +<template>
2 + <div class="">123</div>
3 +</template>
4 +
5 +<script>
6 +export default {
7 + data () {
8 + return {
9 +
10 + }
11 + },
12 + mounted () {
13 +
14 + },
15 + methods: {
16 +
17 + }
18 +}
19 +</script>
20 +
21 +<style lang="less" scoped>
22 +
23 +</style>
1 +/*
2 + * @Date: 2023-09-01 10:29:30
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-09-06 17:26:37
5 + * @FilePath: /custom_table/src/route.js
6 + * @Description: 文件描述
7 + */
8 +export default [{
9 + path: '/',
10 + component: () => import('@/views/index.vue'),
11 + meta: {
12 + title: '首页',
13 + }
14 +}, {
15 + path: '/success',
16 + component: () => import('@/views/success.vue'),
17 + meta: {
18 + title: '申领成功',
19 + }
20 +}, {
21 + path: '/auth',
22 + component: () => import('@/views/auth.vue'),
23 + meta: {
24 + title: '授权页面',
25 + }
26 +}];
1 +/*
2 + * @Date: 2022-05-26 13:57:28
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-06-29 21:36:59
5 + * @FilePath: /tswj/src/router.js
6 + * @Description: 文件描述
7 + */
8 +import { createRouter, createWebHashHistory } from 'vue-router';
9 +import RootRoute from './route.js';
10 +import asyncRoutesArr from "./mock/routes"
11 +import generateRoutes from './utils/generateRoute'
12 +
13 +// TAG: 路由配置表
14 +/**
15 + * 把项目独有的路由配置到相应的路径,默认路由文件只放公用部分
16 + * 但是 vue 文件内容还是要事先准备好
17 + */
18 +const modules = import.meta.globEager('@/router/routes/modules/**/*.js'); // Vite 支持使用特殊的 import.meta.glob 函数从文件系统导入多个模块
19 +const routeModuleList = [];
20 +
21 +Object.keys(modules).forEach((key) => {
22 + const mod = modules[key].default || {};
23 + const modList = Array.isArray(mod) ? [...mod] : [mod];
24 + routeModuleList.push(...modList);
25 +});
26 +
27 +// 创建路由实例并传递 `routes` 配置
28 +const router = createRouter({
29 + history: createWebHashHistory('/index.html'),
30 + routes: [...RootRoute, ...routeModuleList]
31 +});
32 +
33 +// TAG: 动态生成路由
34 +/**
35 + * generateRoute 负责把后台返回数据拼接成项目需要的路由结构,动态添加到路由表里面
36 + */
37 +router.beforeEach((to, from, next) => {
38 + // 使用404为中转页面,避免动态路由没有渲染出来,控制台报警告问题
39 + if (to.path == '/404' && to.redirectedFrom != undefined) {
40 + // 模拟异步操作
41 + setTimeout(() => {
42 + if (!asyncRoutesArr.length) return; // 没有动态路由避免报错
43 + const arr = generateRoutes(asyncRoutesArr); // 在路由守卫处生成,避免有子路由时刷新白屏问题。
44 + arr.forEach(item => {
45 + router.addRoute(item) // 新增路由
46 + })
47 + // 重写被404覆盖路由信息
48 + next({ ...to.redirectedFrom, replace: true });
49 + }, 1000);
50 + } else {
51 + next()
52 + }
53 +})
54 +
55 +router.afterEach(() => {
56 + // console.warn(to);
57 + // console.warn(wx);
58 + // share(to)
59 +})
60 +
61 +export default router;
1 +const index = [{
2 + path: '/auth',
3 + name: '授权跳转页',
4 + component: () => import('@/views/auth.vue'),
5 + meta: {
6 + title: '微信授权'
7 + },
8 + children: []
9 +}]
10 +
11 +export default index;
1 +/*
2 + * @Date: 2022-06-15 17:09:03
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-07-18 10:54:32
5 + * @FilePath: /front/src/router/routes/modules/common/index.js
6 + * @Description: 文件描述
7 + */
8 +const index = [{ // 配置404为动态路由中转页面
9 + path: '/:pathMatch(.*)*',
10 + redirect: '/404'
11 +}, {
12 + path: '/404',
13 + name: '404',
14 + component: () => import('@/views/404.vue'),
15 + meta: {
16 + icon: '',
17 + title: '404',
18 + },
19 + children: [],
20 +}];
21 +
22 +export default index;
1 +export default {
2 + defaultPageSize: 10,
3 +}
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-05-26 10:08:06
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2022-06-02 22:50:53
6 + * @FilePath: /tswj/src/settings/designSetting.js
7 + * @Description:
8 + */
9 +import { ref } from 'vue';
10 +import { styleColor } from '@/constant.js';
11 +
12 +export const styleObject1 = ref({
13 + backgroundColor: styleColor.baseFontColor,
14 + color: styleColor.baseColor,
15 + borderColor: styleColor.baseColor
16 +})
17 +
18 +export const styleObject2 = ref({
19 + backgroundColor: styleColor.baseColor,
20 + color: styleColor.baseFontColor,
21 + borderColor: styleColor.baseColor
22 +})
23 +
24 +export const styleObject3 = ref({
25 + // backgroundColor: '#6D97D2',
26 + backgroundColor: '#F4675A',
27 + color: styleColor.baseFontColor,
28 + // borderColor: '#6D97D2'
29 + borderColor: '#F4675A'
30 +})
31 +
32 +export const styleObject4 = ref({
33 + backgroundColor: styleColor.baseFontColor,
34 + color: '#713610',
35 + borderColor: '#713610'
36 +})
37 +
38 +export const styleObject5 = ref({
39 + backgroundColor: styleColor.baseFontColor,
40 + color: '#FDD347',
41 + borderColor: '#FDD347'
42 +})
43 +
44 +export const styleObject6 = ref({
45 + backgroundColor: styleColor.baseFontColor,
46 + color: '#777777',
47 + borderColor: '#777777'
48 +})
49 +
50 +export const styleObject7 = ref({
51 + backgroundColor: styleColor.baseFontColor,
52 + color: '#0B3A72',
53 + borderColor: '#0B3A72'
54 +})
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-06-07 22:46:46
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2022-06-08 05:34:56
6 + * @FilePath: /tswj/src/shims-vue.d.ts
7 + * @Description:
8 + */
9 +declare module '*.vue' {
10 + import type { DefineComponent } from 'vue';
11 + const component: DefineComponent;
12 + export default component;
13 +}
1 +/*
2 + * @Date: 2022-04-18 15:59:42
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2023-03-03 10:10:27
5 + * @FilePath: /data-table/src/store/index.js
6 + * @Description: 文件描述
7 + */
8 +import { defineStore } from 'pinia';
9 +// import { testStore } from './test'; // 另一个store
10 +import _ from 'lodash';
11 +import { useRouter } from 'vue-router'
12 +
13 +export const mainStore = defineStore('main', {
14 + state: () => {
15 + return {
16 + msg: 'Hello world',
17 + count: 0,
18 + auth: false,
19 + comment_num: 0,
20 + video_detail: {},
21 + scrollTop: 0,
22 + scrollTopCollection: 0,
23 + scrollTopLike: 0,
24 + scrollTopPerson: 0,
25 + keepPages: ['default'], // 很坑爹,空值全部都缓存
26 + fieldName: '',
27 + formInfo: {}, // 表单字段信息
28 + formSetting: {}, // 表单数据收集设置
29 + successInfo: {}, // 表单提交返回值
30 + };
31 + },
32 + getters: {
33 + getKeepPages () {
34 + return this.keepPages
35 + },
36 + // getTestStoreList () {
37 + // return testStore().list // 返回另一个store的值
38 + // }
39 + },
40 + actions: {
41 + changeState (state) {
42 + this.auth = state;
43 + },
44 + changeCommentNum (num) {
45 + this.comment_num = num;
46 + },
47 + changeVideoDetail (v) {
48 + this.video_detail = v;
49 + },
50 + changeScrollTop (v) {
51 + this.scrollTop = v;
52 + },
53 + changeScrollTopCollection (v) {
54 + this.scrollTopCollection = v;
55 + },
56 + changeScrollTopLike (v) {
57 + this.scrollTopLike = v;
58 + },
59 + changeScrollTopPerson (v) {
60 + this.scrollTopPerson = v;
61 + },
62 + changeKeepPages () { // 清空所有缓存,用一个不存在的值覆盖
63 + this.keepPages = ['default'];
64 + },
65 + keepThisPage () { // 新增缓存页
66 + const $router = useRouter();
67 + const page = $router.currentRoute.value.meta.name;
68 + this.keepPages.push(page);
69 + },
70 + removeThisPage () { // 删除缓存页
71 + const $router = useRouter();
72 + const page = $router.currentRoute.value.meta.name;
73 + _.remove(this.keepPages, item => item === page)
74 + },
75 + changeFieldName (v) {
76 + this.fieldName = v;
77 + },
78 + changeFormInfo (v) {
79 + this.formInfo = v;
80 + },
81 + changeFormSetting (v) {
82 + this.formSetting = v;
83 + },
84 + changeSuccessInfo (v) {
85 + this.successInfo = v;
86 + },
87 + },
88 +});
1 +/*
2 + * @Date: 2022-07-18 10:22:22
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-07-18 10:42:46
5 + * @FilePath: /front/src/theme-vars.js
6 + * @Description: 文件描述
7 + */
1 +/*
2 + * @Date: 2022-06-20 01:22:50
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-06-20 01:23:18
5 + * @FilePath: /tswj/src/composables/useMonitorKeyboard.js
6 + * @Description: 文件描述
7 + */
8 +/**
9 + * @class 监听虚拟键盘
10 + * @classdesc 监听虚拟键盘弹出隐藏
11 + * @public onEnd 结束监听虚拟键盘
12 + * @public onShow 传递一个回调 监听虚拟键盘弹出
13 + * @public onHidden 传递一个回调 监听虚拟键盘隐藏
14 + */
15 +class MonitorKeyboard {
16 + constructor() {
17 + this.type = this.IsIA();
18 + this.originalHeight = window.innerHeight;
19 + }
20 +
21 + /**
22 + * @function IsIA 获取设备类型
23 + * @param 1 Android 2 iOS
24 + */
25 + IsIA = () => {
26 + const userAgent = typeof window === 'object' ? window.navigator.userAgent : '';
27 + if (/android/i.test(userAgent)) {
28 + return 1;
29 + } else if (/iPhone|iPod|iPad/i.test(userAgent)) {
30 + return 2;
31 + }
32 + }
33 +
34 + // Android系统
35 + onResize = () => {
36 + //键盘弹起与隐藏都会引起窗口的高度发生变化
37 + const resizeHeight = window.innerHeight;
38 +
39 + if (this.originalHeight - resizeHeight > 50) {
40 + this.show('Android系统: 软键盘弹出');
41 + } else {
42 + this.hidden('Android系统: 软键盘收起');
43 + }
44 + }
45 +
46 + // iOS获取焦点
47 + onFocusin = () => {
48 + this.show('iOS系统:软键盘弹出');
49 + }
50 +
51 + // iOS失去焦点
52 + onFocusout = () => {
53 + this.hidden('iOS系统:软键盘收起');
54 + }
55 +
56 + /**
57 + * @function onStart 开始监听虚拟键盘
58 + */
59 + onStart = () => {
60 + if (this.type == 1) {
61 + // 获取窗口的高度
62 + window.addEventListener('resize', this.onResize);
63 + }
64 + if (this.type == 2) {
65 + // iOS系统
66 + window.addEventListener('focusin', this.onFocusin);
67 + window.addEventListener('focusout', this.onFocusout);
68 + }
69 + }
70 +
71 + /**
72 + * @function onEnd 结束监听虚拟键盘
73 + */
74 + onEnd = () => {
75 + if (this.type == 1) {
76 + //获取窗口的高度
77 + window.removeEventListener('resize', this.onResize);
78 + }
79 + if (this.type == 2) {
80 + window.removeEventListener('focusin', this.onFocusin);
81 + window.removeEventListener('focusout', this.onFocusout);
82 + }
83 + }
84 +
85 + /**
86 + * @function onShow 传递一个回调函数
87 + * @param 虚拟键盘弹出时触发
88 + */
89 + onShow = (fn) => {
90 + this.show = fn;
91 + }
92 +
93 + /**
94 + * @function onHidden 传递一个回调函数
95 + * @param 虚拟键盘隐藏时触发
96 + */
97 + onHidden = (fn) => {
98 + this.hidden = fn;
99 + }
100 +}
101 +
102 +export default MonitorKeyboard
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-05-28 10:17:40
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2024-07-25 09:46:46
6 + * @FilePath: /temple_material_request/src/utils/axios.js
7 + * @Description:
8 + */
9 +import axios from 'axios';
10 +import router from '@/router';
11 +import qs from 'Qs'
12 +import { strExist } from '@/utils/tools'
13 +// import { parseQueryString } from '@/utils/tools'
14 +
15 +axios.defaults.params = {
16 + f: 'good',
17 +};
18 +
19 +/**
20 + * @description 请求拦截器
21 + */
22 +axios.interceptors.request.use(
23 + config => {
24 + // const url_params = parseQueryString(location.href);
25 + // GET请求默认打上时间戳,避免从缓存中拿数据。
26 + const timestamp = config.method === 'get' ? (new Date()).valueOf() : '';
27 + /**
28 + * POST PHP需要修改数据格式
29 + * 序列化POST请求时需要屏蔽上传相关接口,上传相关接口序列化后报错
30 + */
31 + // config.data = config.method === 'post' && !strExist(['a=upload', 'upload.qiniup.com'], config.url) ? qs.stringify(config.data) : config.data;
32 + // 绑定默认请求头
33 + config.params = { ...config.params, timestamp }
34 + return config;
35 + },
36 + error => {
37 + // 请求错误处理
38 + return Promise.reject(error);
39 + });
40 +
41 +/**
42 + * @description 响应拦截器
43 + */
44 +axios.interceptors.response.use(
45 + response => {
46 + return response;
47 + },
48 + error => {
49 + return Promise.reject(error);
50 + });
51 +
52 +export default axios;
1 +/**
2 + * FingerprintJS v3.4.0 - Copyright (c) FingerprintJS, Inc, 2023 (https://fingerprint.com)
3 + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
4 + *
5 + * This software contains code from open-source projects:
6 + * MurmurHash3 by Karan Lyons (https://github.com/karanlyons/murmurHash3.js)
7 + */
8 +var e = function () {
9 + return (
10 + (e =
11 + Object.assign ||
12 + function (e) {
13 + for (var n, t = 1, r = arguments.length; t < r; t++)
14 + for (var o in (n = arguments[t]))
15 + Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);
16 + return e;
17 + }),
18 + e.apply(this, arguments)
19 + );
20 +};
21 +function n(e, n, t, r) {
22 + return new (t || (t = Promise))(function (o, a) {
23 + function i(e) {
24 + try {
25 + u(r.next(e));
26 + } catch (n) {
27 + a(n);
28 + }
29 + }
30 + function c(e) {
31 + try {
32 + u(r.throw(e));
33 + } catch (n) {
34 + a(n);
35 + }
36 + }
37 + function u(e) {
38 + var n;
39 + e.done
40 + ? o(e.value)
41 + : ((n = e.value),
42 + n instanceof t
43 + ? n
44 + : new t(function (e) {
45 + e(n);
46 + })).then(i, c);
47 + }
48 + u((r = r.apply(e, n || [])).next());
49 + });
50 +}
51 +function t(e, n) {
52 + var t,
53 + r,
54 + o,
55 + a,
56 + i = {
57 + label: 0,
58 + sent: function () {
59 + if (1 & o[0]) throw o[1];
60 + return o[1];
61 + },
62 + trys: [],
63 + ops: [],
64 + };
65 + return (
66 + (a = { next: c(0), throw: c(1), return: c(2) }),
67 + 'function' == typeof Symbol &&
68 + (a[Symbol.iterator] = function () {
69 + return this;
70 + }),
71 + a
72 + );
73 + function c(c) {
74 + return function (u) {
75 + return (function (c) {
76 + if (t) throw new TypeError('Generator is already executing.');
77 + for (; a && ((a = 0), c[0] && (i = 0)), i; )
78 + try {
79 + if (
80 + ((t = 1),
81 + r &&
82 + (o =
83 + 2 & c[0]
84 + ? r.return
85 + : c[0]
86 + ? r.throw || ((o = r.return) && o.call(r), 0)
87 + : r.next) &&
88 + !(o = o.call(r, c[1])).done)
89 + )
90 + return o;
91 + switch (((r = 0), o && (c = [2 & c[0], o.value]), c[0])) {
92 + case 0:
93 + case 1:
94 + o = c;
95 + break;
96 + case 4:
97 + return i.label++, { value: c[1], done: !1 };
98 + case 5:
99 + i.label++, (r = c[1]), (c = [0]);
100 + continue;
101 + case 7:
102 + (c = i.ops.pop()), i.trys.pop();
103 + continue;
104 + default:
105 + if (
106 + !((o = i.trys),
107 + (o = o.length > 0 && o[o.length - 1]) || (6 !== c[0] && 2 !== c[0]))
108 + ) {
109 + i = 0;
110 + continue;
111 + }
112 + if (3 === c[0] && (!o || (c[1] > o[0] && c[1] < o[3]))) {
113 + i.label = c[1];
114 + break;
115 + }
116 + if (6 === c[0] && i.label < o[1]) {
117 + (i.label = o[1]), (o = c);
118 + break;
119 + }
120 + if (o && i.label < o[2]) {
121 + (i.label = o[2]), i.ops.push(c);
122 + break;
123 + }
124 + o[2] && i.ops.pop(), i.trys.pop();
125 + continue;
126 + }
127 + c = n.call(e, i);
128 + } catch (u) {
129 + (c = [6, u]), (r = 0);
130 + } finally {
131 + t = o = 0;
132 + }
133 + if (5 & c[0]) throw c[1];
134 + return { value: c[0] ? c[1] : void 0, done: !0 };
135 + })([c, u]);
136 + };
137 + }
138 +}
139 +function r(e, n, t) {
140 + if (t || 2 === arguments.length)
141 + for (var r, o = 0, a = n.length; o < a; o++)
142 + (!r && o in n) || (r || (r = Array.prototype.slice.call(n, 0, o)), (r[o] = n[o]));
143 + return e.concat(r || Array.prototype.slice.call(n));
144 +}
145 +function o(e, n) {
146 + return new Promise(function (t) {
147 + return setTimeout(t, e, n);
148 + });
149 +}
150 +function a(e) {
151 + return !!e && 'function' == typeof e.then;
152 +}
153 +function i(e, n) {
154 + try {
155 + var t = e();
156 + a(t)
157 + ? t.then(
158 + function (e) {
159 + return n(!0, e);
160 + },
161 + function (e) {
162 + return n(!1, e);
163 + },
164 + )
165 + : n(!0, t);
166 + } catch (r) {
167 + n(!1, r);
168 + }
169 +}
170 +function c(e, r, a) {
171 + return (
172 + void 0 === a && (a = 16),
173 + n(this, void 0, void 0, function () {
174 + var n, i, c;
175 + return t(this, function (t) {
176 + switch (t.label) {
177 + case 0:
178 + (n = Date.now()), (i = 0), (t.label = 1);
179 + case 1:
180 + return i < e.length
181 + ? (r(e[i], i), (c = Date.now()) >= n + a ? ((n = c), [4, o(0)]) : [3, 3])
182 + : [3, 4];
183 + case 2:
184 + t.sent(), (t.label = 3);
185 + case 3:
186 + return ++i, [3, 1];
187 + case 4:
188 + return [2];
189 + }
190 + });
191 + })
192 + );
193 +}
194 +function u(e) {
195 + e.then(void 0, function () {});
196 +}
197 +function l(e, n) {
198 + (e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]]),
199 + (n = [n[0] >>> 16, 65535 & n[0], n[1] >>> 16, 65535 & n[1]]);
200 + var t = [0, 0, 0, 0];
201 + return (
202 + (t[3] += e[3] + n[3]),
203 + (t[2] += t[3] >>> 16),
204 + (t[3] &= 65535),
205 + (t[2] += e[2] + n[2]),
206 + (t[1] += t[2] >>> 16),
207 + (t[2] &= 65535),
208 + (t[1] += e[1] + n[1]),
209 + (t[0] += t[1] >>> 16),
210 + (t[1] &= 65535),
211 + (t[0] += e[0] + n[0]),
212 + (t[0] &= 65535),
213 + [(t[0] << 16) | t[1], (t[2] << 16) | t[3]]
214 + );
215 +}
216 +function s(e, n) {
217 + (e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]]),
218 + (n = [n[0] >>> 16, 65535 & n[0], n[1] >>> 16, 65535 & n[1]]);
219 + var t = [0, 0, 0, 0];
220 + return (
221 + (t[3] += e[3] * n[3]),
222 + (t[2] += t[3] >>> 16),
223 + (t[3] &= 65535),
224 + (t[2] += e[2] * n[3]),
225 + (t[1] += t[2] >>> 16),
226 + (t[2] &= 65535),
227 + (t[2] += e[3] * n[2]),
228 + (t[1] += t[2] >>> 16),
229 + (t[2] &= 65535),
230 + (t[1] += e[1] * n[3]),
231 + (t[0] += t[1] >>> 16),
232 + (t[1] &= 65535),
233 + (t[1] += e[2] * n[2]),
234 + (t[0] += t[1] >>> 16),
235 + (t[1] &= 65535),
236 + (t[1] += e[3] * n[1]),
237 + (t[0] += t[1] >>> 16),
238 + (t[1] &= 65535),
239 + (t[0] += e[0] * n[3] + e[1] * n[2] + e[2] * n[1] + e[3] * n[0]),
240 + (t[0] &= 65535),
241 + [(t[0] << 16) | t[1], (t[2] << 16) | t[3]]
242 + );
243 +}
244 +function d(e, n) {
245 + return 32 === (n %= 64)
246 + ? [e[1], e[0]]
247 + : n < 32
248 + ? [(e[0] << n) | (e[1] >>> (32 - n)), (e[1] << n) | (e[0] >>> (32 - n))]
249 + : ((n -= 32), [(e[1] << n) | (e[0] >>> (32 - n)), (e[0] << n) | (e[1] >>> (32 - n))]);
250 +}
251 +function m(e, n) {
252 + return 0 === (n %= 64)
253 + ? e
254 + : n < 32
255 + ? [(e[0] << n) | (e[1] >>> (32 - n)), e[1] << n]
256 + : [e[1] << (n - 32), 0];
257 +}
258 +function f(e, n) {
259 + return [e[0] ^ n[0], e[1] ^ n[1]];
260 +}
261 +function v(e) {
262 + return (
263 + (e = f(e, [0, e[0] >>> 1])),
264 + (e = f((e = s(e, [4283543511, 3981806797])), [0, e[0] >>> 1])),
265 + (e = f((e = s(e, [3301882366, 444984403])), [0, e[0] >>> 1]))
266 + );
267 +}
268 +function h(e, n) {
269 + n = n || 0;
270 + var t,
271 + r = (e = e || '').length % 16,
272 + o = e.length - r,
273 + a = [0, n],
274 + i = [0, n],
275 + c = [0, 0],
276 + u = [0, 0],
277 + h = [2277735313, 289559509],
278 + b = [1291169091, 658871167];
279 + for (t = 0; t < o; t += 16)
280 + (c = [
281 + (255 & e.charCodeAt(t + 4)) |
282 + ((255 & e.charCodeAt(t + 5)) << 8) |
283 + ((255 & e.charCodeAt(t + 6)) << 16) |
284 + ((255 & e.charCodeAt(t + 7)) << 24),
285 + (255 & e.charCodeAt(t)) |
286 + ((255 & e.charCodeAt(t + 1)) << 8) |
287 + ((255 & e.charCodeAt(t + 2)) << 16) |
288 + ((255 & e.charCodeAt(t + 3)) << 24),
289 + ]),
290 + (u = [
291 + (255 & e.charCodeAt(t + 12)) |
292 + ((255 & e.charCodeAt(t + 13)) << 8) |
293 + ((255 & e.charCodeAt(t + 14)) << 16) |
294 + ((255 & e.charCodeAt(t + 15)) << 24),
295 + (255 & e.charCodeAt(t + 8)) |
296 + ((255 & e.charCodeAt(t + 9)) << 8) |
297 + ((255 & e.charCodeAt(t + 10)) << 16) |
298 + ((255 & e.charCodeAt(t + 11)) << 24),
299 + ]),
300 + (c = d((c = s(c, h)), 31)),
301 + (a = l((a = d((a = f(a, (c = s(c, b)))), 27)), i)),
302 + (a = l(s(a, [0, 5]), [0, 1390208809])),
303 + (u = d((u = s(u, b)), 33)),
304 + (i = l((i = d((i = f(i, (u = s(u, h)))), 31)), a)),
305 + (i = l(s(i, [0, 5]), [0, 944331445]));
306 + switch (((c = [0, 0]), (u = [0, 0]), r)) {
307 + case 15:
308 + u = f(u, m([0, e.charCodeAt(t + 14)], 48));
309 + case 14:
310 + u = f(u, m([0, e.charCodeAt(t + 13)], 40));
311 + case 13:
312 + u = f(u, m([0, e.charCodeAt(t + 12)], 32));
313 + case 12:
314 + u = f(u, m([0, e.charCodeAt(t + 11)], 24));
315 + case 11:
316 + u = f(u, m([0, e.charCodeAt(t + 10)], 16));
317 + case 10:
318 + u = f(u, m([0, e.charCodeAt(t + 9)], 8));
319 + case 9:
320 + (u = s((u = f(u, [0, e.charCodeAt(t + 8)])), b)), (i = f(i, (u = s((u = d(u, 33)), h))));
321 + case 8:
322 + c = f(c, m([0, e.charCodeAt(t + 7)], 56));
323 + case 7:
324 + c = f(c, m([0, e.charCodeAt(t + 6)], 48));
325 + case 6:
326 + c = f(c, m([0, e.charCodeAt(t + 5)], 40));
327 + case 5:
328 + c = f(c, m([0, e.charCodeAt(t + 4)], 32));
329 + case 4:
330 + c = f(c, m([0, e.charCodeAt(t + 3)], 24));
331 + case 3:
332 + c = f(c, m([0, e.charCodeAt(t + 2)], 16));
333 + case 2:
334 + c = f(c, m([0, e.charCodeAt(t + 1)], 8));
335 + case 1:
336 + (c = s((c = f(c, [0, e.charCodeAt(t)])), h)), (a = f(a, (c = s((c = d(c, 31)), b))));
337 + }
338 + return (
339 + (a = l((a = f(a, [0, e.length])), (i = f(i, [0, e.length])))),
340 + (i = l(i, a)),
341 + (a = l((a = v(a)), (i = v(i)))),
342 + (i = l(i, a)),
343 + ('00000000' + (a[0] >>> 0).toString(16)).slice(-8) +
344 + ('00000000' + (a[1] >>> 0).toString(16)).slice(-8) +
345 + ('00000000' + (i[0] >>> 0).toString(16)).slice(-8) +
346 + ('00000000' + (i[1] >>> 0).toString(16)).slice(-8)
347 + );
348 +}
349 +function b(e) {
350 + return parseInt(e);
351 +}
352 +function p(e) {
353 + return parseFloat(e);
354 +}
355 +function y(e, n) {
356 + return 'number' == typeof e && isNaN(e) ? n : e;
357 +}
358 +function g(e) {
359 + return e.reduce(function (e, n) {
360 + return e + (n ? 1 : 0);
361 + }, 0);
362 +}
363 +function w(e, n) {
364 + if ((void 0 === n && (n = 1), Math.abs(n) >= 1)) return Math.round(e / n) * n;
365 + var t = 1 / n;
366 + return Math.round(e * t) / t;
367 +}
368 +function L(e) {
369 + return e && 'object' == typeof e && 'message' in e ? e : { message: e };
370 +}
371 +function k(e) {
372 + return 'function' != typeof e;
373 +}
374 +function V(e, r, a) {
375 + var l = Object.keys(e).filter(function (e) {
376 + return !(function (e, n) {
377 + for (var t = 0, r = e.length; t < r; ++t) if (e[t] === n) return !0;
378 + return !1;
379 + })(a, e);
380 + }),
381 + s = Array(l.length);
382 + return (
383 + c(l, function (n, t) {
384 + s[t] = (function (e, n) {
385 + var t = new Promise(function (t) {
386 + var r = Date.now();
387 + i(e.bind(null, n), function () {
388 + for (var e = [], n = 0; n < arguments.length; n++) e[n] = arguments[n];
389 + var o = Date.now() - r;
390 + if (!e[0])
391 + return t(function () {
392 + return { error: L(e[1]), duration: o };
393 + });
394 + var a = e[1];
395 + if (k(a))
396 + return t(function () {
397 + return { value: a, duration: o };
398 + });
399 + t(function () {
400 + return new Promise(function (e) {
401 + var n = Date.now();
402 + i(a, function () {
403 + for (var t = [], r = 0; r < arguments.length; r++) t[r] = arguments[r];
404 + var a = o + Date.now() - n;
405 + if (!t[0]) return e({ error: L(t[1]), duration: a });
406 + e({ value: t[1], duration: a });
407 + });
408 + });
409 + });
410 + });
411 + });
412 + return (
413 + u(t),
414 + function () {
415 + return t.then(function (e) {
416 + return e();
417 + });
418 + }
419 + );
420 + })(e[n], r);
421 + }),
422 + function () {
423 + return n(this, void 0, void 0, function () {
424 + var e, n, r, a, i, d;
425 + return t(this, function (m) {
426 + switch (m.label) {
427 + case 0:
428 + for (e = {}, n = 0, r = l; n < r.length; n++) (a = r[n]), (e[a] = void 0);
429 + (i = Array(l.length)),
430 + (d = function () {
431 + var n;
432 + return t(this, function (t) {
433 + switch (t.label) {
434 + case 0:
435 + return (
436 + (n = !0),
437 + [
438 + 4,
439 + c(l, function (t, r) {
440 + if (!i[r])
441 + if (s[r]) {
442 + var o = s[r]().then(function (n) {
443 + return (e[t] = n);
444 + });
445 + u(o), (i[r] = o);
446 + } else n = !1;
447 + }),
448 + ]
449 + );
450 + case 1:
451 + return t.sent(), n ? [2, 'break'] : [4, o(1)];
452 + case 2:
453 + return t.sent(), [2];
454 + }
455 + });
456 + }),
457 + (m.label = 1);
458 + case 1:
459 + return [5, d()];
460 + case 2:
461 + if ('break' === m.sent()) return [3, 4];
462 + m.label = 3;
463 + case 3:
464 + return [3, 1];
465 + case 4:
466 + return [4, Promise.all(i)];
467 + case 5:
468 + return m.sent(), [2, e];
469 + }
470 + });
471 + });
472 + }
473 + );
474 +}
475 +function W(e, n) {
476 + var t = function (e) {
477 + return k(e)
478 + ? n(e)
479 + : function () {
480 + var t = e();
481 + return a(t) ? t.then(n) : n(t);
482 + };
483 + };
484 + return function (n) {
485 + var r = e(n);
486 + return a(r) ? r.then(t) : t(r);
487 + };
488 +}
489 +function Z() {
490 + var e = window,
491 + n = navigator;
492 + return (
493 + g([
494 + 'MSCSSMatrix' in e,
495 + 'msSetImmediate' in e,
496 + 'msIndexedDB' in e,
497 + 'msMaxTouchPoints' in n,
498 + 'msPointerEnabled' in n,
499 + ]) >= 4
500 + );
501 +}
502 +function S() {
503 + var e = window,
504 + n = navigator;
505 + return (
506 + g(['msWriteProfilerMark' in e, 'MSStream' in e, 'msLaunchUri' in n, 'msSaveBlob' in n]) >= 3 &&
507 + !Z()
508 + );
509 +}
510 +function X() {
511 + var e = window,
512 + n = navigator;
513 + return (
514 + g([
515 + 'webkitPersistentStorage' in n,
516 + 'webkitTemporaryStorage' in n,
517 + 0 === n.vendor.indexOf('Google'),
518 + 'webkitResolveLocalFileSystemURL' in e,
519 + 'BatteryManager' in e,
520 + 'webkitMediaStream' in e,
521 + 'webkitSpeechGrammar' in e,
522 + ]) >= 5
523 + );
524 +}
525 +function x() {
526 + var e = window,
527 + n = navigator;
528 + return (
529 + g([
530 + 'ApplePayError' in e,
531 + 'CSSPrimitiveValue' in e,
532 + 'Counter' in e,
533 + 0 === n.vendor.indexOf('Apple'),
534 + 'getStorageUpdates' in n,
535 + 'WebKitMediaKeys' in e,
536 + ]) >= 4
537 + );
538 +}
539 +function F() {
540 + var e = window;
541 + return (
542 + g([
543 + 'safari' in e,
544 + !('DeviceMotionEvent' in e),
545 + !('ongestureend' in e),
546 + !('standalone' in navigator),
547 + ]) >= 3
548 + );
549 +}
550 +function Y() {
551 + var e,
552 + n,
553 + t = window;
554 + return (
555 + g([
556 + 'buildID' in navigator,
557 + 'MozAppearance' in
558 + (null !==
559 + (n = null === (e = document.documentElement) || void 0 === e ? void 0 : e.style) &&
560 + void 0 !== n
561 + ? n
562 + : {}),
563 + 'onmozfullscreenchange' in t,
564 + 'mozInnerScreenX' in t,
565 + 'CSSMozDocumentRule' in t,
566 + 'CanvasCaptureMediaStream' in t,
567 + ]) >= 4
568 + );
569 +}
570 +function C() {
571 + var e = document;
572 + return (
573 + e.fullscreenElement ||
574 + e.msFullscreenElement ||
575 + e.mozFullScreenElement ||
576 + e.webkitFullscreenElement ||
577 + null
578 + );
579 +}
580 +function R() {
581 + var e = X(),
582 + n = Y();
583 + if (!e && !n) return !1;
584 + var t = window;
585 + return (
586 + g([
587 + 'onorientationchange' in t,
588 + 'orientation' in t,
589 + e && !('SharedWorker' in t),
590 + n && /android/i.test(navigator.appVersion),
591 + ]) >= 2
592 + );
593 +}
594 +function G(e) {
595 + var n = new Error(e);
596 + return (n.name = e), n;
597 +}
598 +function M(e, r, a) {
599 + var i, c, u;
600 + return (
601 + void 0 === a && (a = 50),
602 + n(this, void 0, void 0, function () {
603 + var n, l;
604 + return t(this, function (t) {
605 + switch (t.label) {
606 + case 0:
607 + (n = document), (t.label = 1);
608 + case 1:
609 + return n.body ? [3, 3] : [4, o(a)];
610 + case 2:
611 + return t.sent(), [3, 1];
612 + case 3:
613 + (l = n.createElement('iframe')), (t.label = 4);
614 + case 4:
615 + return (
616 + t.trys.push([4, , 10, 11]),
617 + [
618 + 4,
619 + new Promise(function (e, t) {
620 + var o = !1,
621 + a = function () {
622 + (o = !0), e();
623 + };
624 + (l.onload = a),
625 + (l.onerror = function (e) {
626 + (o = !0), t(e);
627 + });
628 + var i = l.style;
629 + i.setProperty('display', 'block', 'important'),
630 + (i.position = 'absolute'),
631 + (i.top = '0'),
632 + (i.left = '0'),
633 + (i.visibility = 'hidden'),
634 + r && 'srcdoc' in l ? (l.srcdoc = r) : (l.src = 'about:blank'),
635 + n.body.appendChild(l);
636 + var c = function () {
637 + var e, n;
638 + o ||
639 + ('complete' ===
640 + (null ===
641 + (n =
642 + null === (e = l.contentWindow) || void 0 === e ? void 0 : e.document) ||
643 + void 0 === n
644 + ? void 0
645 + : n.readyState)
646 + ? a()
647 + : setTimeout(c, 10));
648 + };
649 + c();
650 + }),
651 + ]
652 + );
653 + case 5:
654 + t.sent(), (t.label = 6);
655 + case 6:
656 + return (
657 + null === (c = null === (i = l.contentWindow) || void 0 === i ? void 0 : i.document) ||
658 + void 0 === c
659 + ? void 0
660 + : c.body
661 + )
662 + ? [3, 8]
663 + : [4, o(a)];
664 + case 7:
665 + return t.sent(), [3, 6];
666 + case 8:
667 + return [4, e(l, l.contentWindow)];
668 + case 9:
669 + return [2, t.sent()];
670 + case 10:
671 + return null === (u = l.parentNode) || void 0 === u || u.removeChild(l), [7];
672 + case 11:
673 + return [2];
674 + }
675 + });
676 + })
677 + );
678 +}
679 +function I(e) {
680 + for (
681 + var n = (function (e) {
682 + for (
683 + var n,
684 + t,
685 + r = "Unexpected syntax '".concat(e, "'"),
686 + o = /^\s*([a-z-]*)(.*)$/i.exec(e),
687 + a = o[1] || void 0,
688 + i = {},
689 + c = /([.:#][\w-]+|\[.+?\])/gi,
690 + u = function (e, n) {
691 + (i[e] = i[e] || []), i[e].push(n);
692 + };
693 + ;
694 +
695 + ) {
696 + var l = c.exec(o[2]);
697 + if (!l) break;
698 + var s = l[0];
699 + switch (s[0]) {
700 + case '.':
701 + u('class', s.slice(1));
702 + break;
703 + case '#':
704 + u('id', s.slice(1));
705 + break;
706 + case '[':
707 + var d = /^\[([\w-]+)([~|^$*]?=("(.*?)"|([\w-]+)))?(\s+[is])?\]$/.exec(s);
708 + if (!d) throw new Error(r);
709 + u(
710 + d[1],
711 + null !== (t = null !== (n = d[4]) && void 0 !== n ? n : d[5]) && void 0 !== t
712 + ? t
713 + : '',
714 + );
715 + break;
716 + default:
717 + throw new Error(r);
718 + }
719 + }
720 + return [a, i];
721 + })(e),
722 + t = n[0],
723 + r = n[1],
724 + o = document.createElement(null != t ? t : 'div'),
725 + a = 0,
726 + i = Object.keys(r);
727 + a < i.length;
728 + a++
729 + ) {
730 + var c = i[a],
731 + u = r[c].join(' ');
732 + 'style' === c ? j(o.style, u) : o.setAttribute(c, u);
733 + }
734 + return o;
735 +}
736 +function j(e, n) {
737 + for (var t = 0, r = n.split(';'); t < r.length; t++) {
738 + var o = r[t],
739 + a = /^\s*([\w-]+)\s*:\s*(.+?)(\s*!([\w-]+))?\s*$/.exec(o);
740 + if (a) {
741 + var i = a[1],
742 + c = a[2],
743 + u = a[4];
744 + e.setProperty(i, c, u || '');
745 + }
746 + }
747 +}
748 +var A = ['monospace', 'sans-serif', 'serif'],
749 + J = [
750 + 'sans-serif-thin',
751 + 'ARNO PRO',
752 + 'Agency FB',
753 + 'Arabic Typesetting',
754 + 'Arial Unicode MS',
755 + 'AvantGarde Bk BT',
756 + 'BankGothic Md BT',
757 + 'Batang',
758 + 'Bitstream Vera Sans Mono',
759 + 'Calibri',
760 + 'Century',
761 + 'Century Gothic',
762 + 'Clarendon',
763 + 'EUROSTILE',
764 + 'Franklin Gothic',
765 + 'Futura Bk BT',
766 + 'Futura Md BT',
767 + 'GOTHAM',
768 + 'Gill Sans',
769 + 'HELV',
770 + 'Haettenschweiler',
771 + 'Helvetica Neue',
772 + 'Humanst521 BT',
773 + 'Leelawadee',
774 + 'Letter Gothic',
775 + 'Levenim MT',
776 + 'Lucida Bright',
777 + 'Lucida Sans',
778 + 'Menlo',
779 + 'MS Mincho',
780 + 'MS Outlook',
781 + 'MS Reference Specialty',
782 + 'MS UI Gothic',
783 + 'MT Extra',
784 + 'MYRIAD PRO',
785 + 'Marlett',
786 + 'Meiryo UI',
787 + 'Microsoft Uighur',
788 + 'Minion Pro',
789 + 'Monotype Corsiva',
790 + 'PMingLiU',
791 + 'Pristina',
792 + 'SCRIPTINA',
793 + 'Segoe UI Light',
794 + 'Serifa',
795 + 'SimHei',
796 + 'Small Fonts',
797 + 'Staccato222 BT',
798 + 'TRAJAN PRO',
799 + 'Univers CE 55 Medium',
800 + 'Vrinda',
801 + 'ZWAdobeF',
802 + ];
803 +function H(e) {
804 + return e.toDataURL();
805 +}
806 +var N, P;
807 +function z() {
808 + var e = this;
809 + return (
810 + (function () {
811 + if (void 0 === P) {
812 + var e = function () {
813 + var n = D();
814 + E(n) ? (P = setTimeout(e, 2500)) : ((N = n), (P = void 0));
815 + };
816 + e();
817 + }
818 + })(),
819 + function () {
820 + return n(e, void 0, void 0, function () {
821 + var e;
822 + return t(this, function (n) {
823 + switch (n.label) {
824 + case 0:
825 + return E((e = D()))
826 + ? N
827 + ? [2, r([], N, !0)]
828 + : C()
829 + ? [
830 + 4,
831 + ((t = document),
832 + (
833 + t.exitFullscreen ||
834 + t.msExitFullscreen ||
835 + t.mozCancelFullScreen ||
836 + t.webkitExitFullscreen
837 + ).call(t)),
838 + ]
839 + : [3, 2]
840 + : [3, 2];
841 + case 1:
842 + n.sent(), (e = D()), (n.label = 2);
843 + case 2:
844 + return E(e) || (N = e), [2, e];
845 + }
846 + var t;
847 + });
848 + });
849 + }
850 + );
851 +}
852 +function D() {
853 + var e = screen;
854 + return [
855 + y(p(e.availTop), null),
856 + y(p(e.width) - p(e.availWidth) - y(p(e.availLeft), 0), null),
857 + y(p(e.height) - p(e.availHeight) - y(p(e.availTop), 0), null),
858 + y(p(e.availLeft), null),
859 + ];
860 +}
861 +function E(e) {
862 + for (var n = 0; n < 4; ++n) if (e[n]) return !1;
863 + return !0;
864 +}
865 +function B(e) {
866 + var r;
867 + return n(this, void 0, void 0, function () {
868 + var n, a, i, c, u, l, s;
869 + return t(this, function (t) {
870 + switch (t.label) {
871 + case 0:
872 + for (
873 + n = document, a = n.createElement('div'), i = new Array(e.length), c = {}, T(a), s = 0;
874 + s < e.length;
875 + ++s
876 + )
877 + (u = I(e[s])),
878 + T((l = n.createElement('div'))),
879 + l.appendChild(u),
880 + a.appendChild(l),
881 + (i[s] = u);
882 + t.label = 1;
883 + case 1:
884 + return n.body ? [3, 3] : [4, o(50)];
885 + case 2:
886 + return t.sent(), [3, 1];
887 + case 3:
888 + n.body.appendChild(a);
889 + try {
890 + for (s = 0; s < e.length; ++s) i[s].offsetParent || (c[e[s]] = !0);
891 + } finally {
892 + null === (r = a.parentNode) || void 0 === r || r.removeChild(a);
893 + }
894 + return [2, c];
895 + }
896 + });
897 + });
898 +}
899 +function T(e) {
900 + e.style.setProperty('display', 'block', 'important');
901 +}
902 +function O(e) {
903 + return matchMedia('(inverted-colors: '.concat(e, ')')).matches;
904 +}
905 +function _(e) {
906 + return matchMedia('(forced-colors: '.concat(e, ')')).matches;
907 +}
908 +function Q(e) {
909 + return matchMedia('(prefers-contrast: '.concat(e, ')')).matches;
910 +}
911 +function U(e) {
912 + return matchMedia('(prefers-reduced-motion: '.concat(e, ')')).matches;
913 +}
914 +function K(e) {
915 + return matchMedia('(dynamic-range: '.concat(e, ')')).matches;
916 +}
917 +var q = Math,
918 + $ = function () {
919 + return 0;
920 + };
921 +var ee = {
922 + default: [],
923 + apple: [{ font: '-apple-system-body' }],
924 + serif: [{ fontFamily: 'serif' }],
925 + sans: [{ fontFamily: 'sans-serif' }],
926 + mono: [{ fontFamily: 'monospace' }],
927 + min: [{ fontSize: '1px' }],
928 + system: [{ fontFamily: 'system-ui' }],
929 +};
930 +var ne = {
931 + fonts: function () {
932 + return M(function (e, n) {
933 + var t = n.document,
934 + r = t.body;
935 + r.style.fontSize = '48px';
936 + var o = t.createElement('div'),
937 + a = {},
938 + i = {},
939 + c = function (e) {
940 + var n = t.createElement('span'),
941 + r = n.style;
942 + return (
943 + (r.position = 'absolute'),
944 + (r.top = '0'),
945 + (r.left = '0'),
946 + (r.fontFamily = e),
947 + (n.textContent = 'mmMwWLliI0O&1'),
948 + o.appendChild(n),
949 + n
950 + );
951 + },
952 + u = A.map(c),
953 + l = (function () {
954 + for (
955 + var e = {},
956 + n = function (n) {
957 + e[n] = A.map(function (e) {
958 + return (function (e, n) {
959 + return c("'".concat(e, "',").concat(n));
960 + })(n, e);
961 + });
962 + },
963 + t = 0,
964 + r = J;
965 + t < r.length;
966 + t++
967 + ) {
968 + n(r[t]);
969 + }
970 + return e;
971 + })();
972 + r.appendChild(o);
973 + for (var s = 0; s < A.length; s++)
974 + (a[A[s]] = u[s].offsetWidth), (i[A[s]] = u[s].offsetHeight);
975 + return J.filter(function (e) {
976 + return (
977 + (n = l[e]),
978 + A.some(function (e, t) {
979 + return n[t].offsetWidth !== a[e] || n[t].offsetHeight !== i[e];
980 + })
981 + );
982 + var n;
983 + });
984 + });
985 + },
986 + domBlockers: function (e) {
987 + var r = (void 0 === e ? {} : e).debug;
988 + return n(this, void 0, void 0, function () {
989 + var e, n, o, a, i;
990 + return t(this, function (t) {
991 + switch (t.label) {
992 + case 0:
993 + return x() || R()
994 + ? ((c = atob),
995 + (e = {
996 + abpIndo: [
997 + '#Iklan-Melayang',
998 + '#Kolom-Iklan-728',
999 + '#SidebarIklan-wrapper',
1000 + c('YVt0aXRsZT0iN25hZ2EgcG9rZXIiIGld'),
1001 + '[title="ALIENBOLA" i]',
1002 + ],
1003 + abpvn: [
1004 + '#quangcaomb',
1005 + c('Lmlvc0Fkc2lvc0Fkcy1sYXlvdXQ='),
1006 + '.quangcao',
1007 + c('W2hyZWZePSJodHRwczovL3I4OC52bi8iXQ=='),
1008 + c('W2hyZWZePSJodHRwczovL3piZXQudm4vIl0='),
1009 + ],
1010 + adBlockFinland: [
1011 + '.mainostila',
1012 + c('LnNwb25zb3JpdA=='),
1013 + '.ylamainos',
1014 + c('YVtocmVmKj0iL2NsaWNrdGhyZ2guYXNwPyJd'),
1015 + c('YVtocmVmXj0iaHR0cHM6Ly9hcHAucmVhZHBlYWsuY29tL2FkcyJd'),
1016 + ],
1017 + adBlockPersian: [
1018 + '#navbar_notice_50',
1019 + '.kadr',
1020 + 'TABLE[width="140px"]',
1021 + '#divAgahi',
1022 + c('I2FkMl9pbmxpbmU='),
1023 + ],
1024 + adBlockWarningRemoval: [
1025 + '#adblock-honeypot',
1026 + '.adblocker-root',
1027 + '.wp_adblock_detect',
1028 + c('LmhlYWRlci1ibG9ja2VkLWFk'),
1029 + c('I2FkX2Jsb2NrZXI='),
1030 + ],
1031 + adGuardAnnoyances: [
1032 + 'amp-embed[type="zen"]',
1033 + '.hs-sosyal',
1034 + '#cookieconsentdiv',
1035 + 'div[class^="app_gdpr"]',
1036 + '.as-oil',
1037 + ],
1038 + adGuardBase: [
1039 + '.BetterJsPopOverlay',
1040 + c('I2FkXzMwMFgyNTA='),
1041 + c('I2Jhbm5lcmZsb2F0MjI='),
1042 + c('I2FkLWJhbm5lcg=='),
1043 + c('I2NhbXBhaWduLWJhbm5lcg=='),
1044 + ],
1045 + adGuardChinese: [
1046 + c('LlppX2FkX2FfSA=='),
1047 + c('YVtocmVmKj0iL29kMDA1LmNvbSJd'),
1048 + c('YVtocmVmKj0iLmh0aGJldDM0LmNvbSJd'),
1049 + '.qq_nr_lad',
1050 + '#widget-quan',
1051 + ],
1052 + adGuardFrench: [
1053 + c('I2Jsb2NrLXZpZXdzLWFkcy1zaWRlYmFyLWJsb2NrLWJsb2Nr'),
1054 + '#pavePub',
1055 + c('LmFkLWRlc2t0b3AtcmVjdGFuZ2xl'),
1056 + '.mobile_adhesion',
1057 + '.widgetadv',
1058 + ],
1059 + adGuardGerman: [
1060 + c('LmJhbm5lcml0ZW13ZXJidW5nX2hlYWRfMQ=='),
1061 + c('LmJveHN0YXJ0d2VyYnVuZw=='),
1062 + c('LndlcmJ1bmcz'),
1063 + c('YVtocmVmXj0iaHR0cDovL3d3dy5laXMuZGUvaW5kZXgucGh0bWw/cmVmaWQ9Il0='),
1064 + c('YVtocmVmXj0iaHR0cHM6Ly93d3cudGlwaWNvLmNvbS8/YWZmaWxpYXRlSWQ9Il0='),
1065 + ],
1066 + adGuardJapanese: [
1067 + '#kauli_yad_1',
1068 + c('YVtocmVmXj0iaHR0cDovL2FkMi50cmFmZmljZ2F0ZS5uZXQvIl0='),
1069 + c('Ll9wb3BJbl9pbmZpbml0ZV9hZA=='),
1070 + c('LmFkZ29vZ2xl'),
1071 + c('LmFkX3JlZ3VsYXIz'),
1072 + ],
1073 + adGuardMobile: [
1074 + c('YW1wLWF1dG8tYWRz'),
1075 + c('LmFtcF9hZA=='),
1076 + 'amp-embed[type="24smi"]',
1077 + '#mgid_iframe1',
1078 + c('I2FkX2ludmlld19hcmVh'),
1079 + ],
1080 + adGuardRussian: [
1081 + c('YVtocmVmXj0iaHR0cHM6Ly9hZC5sZXRtZWFkcy5jb20vIl0='),
1082 + c('LnJlY2xhbWE='),
1083 + 'div[id^="smi2adblock"]',
1084 + c('ZGl2W2lkXj0iQWRGb3hfYmFubmVyXyJd'),
1085 + c('I2FkX3NxdWFyZQ=='),
1086 + ],
1087 + adGuardSocial: [
1088 + c('YVtocmVmXj0iLy93d3cuc3R1bWJsZXVwb24uY29tL3N1Ym1pdD91cmw9Il0='),
1089 + c('YVtocmVmXj0iLy90ZWxlZ3JhbS5tZS9zaGFyZS91cmw/Il0='),
1090 + '.etsy-tweet',
1091 + '#inlineShare',
1092 + '.popup-social',
1093 + ],
1094 + adGuardSpanishPortuguese: [
1095 + '#barraPublicidade',
1096 + '#Publicidade',
1097 + '#publiEspecial',
1098 + '#queTooltip',
1099 + c('W2hyZWZePSJodHRwOi8vYWRzLmdsaXNwYS5jb20vIl0='),
1100 + ],
1101 + adGuardTrackingProtection: [
1102 + '#qoo-counter',
1103 + c('YVtocmVmXj0iaHR0cDovL2NsaWNrLmhvdGxvZy5ydS8iXQ=='),
1104 + c('YVtocmVmXj0iaHR0cDovL2hpdGNvdW50ZXIucnUvdG9wL3N0YXQucGhwIl0='),
1105 + c('YVtocmVmXj0iaHR0cDovL3RvcC5tYWlsLnJ1L2p1bXAiXQ=='),
1106 + '#top100counter',
1107 + ],
1108 + adGuardTurkish: [
1109 + '#backkapat',
1110 + c('I3Jla2xhbWk='),
1111 + c('YVtocmVmXj0iaHR0cDovL2Fkc2Vydi5vbnRlay5jb20udHIvIl0='),
1112 + c('YVtocmVmXj0iaHR0cDovL2l6bGVuemkuY29tL2NhbXBhaWduLyJd'),
1113 + c('YVtocmVmXj0iaHR0cDovL3d3dy5pbnN0YWxsYWRzLm5ldC8iXQ=='),
1114 + ],
1115 + bulgarian: [
1116 + c('dGQjZnJlZW5ldF90YWJsZV9hZHM='),
1117 + '#ea_intext_div',
1118 + '.lapni-pop-over',
1119 + '#xenium_hot_offers',
1120 + c('I25ld0Fk'),
1121 + ],
1122 + easyList: [
1123 + c('I0FEX0NPTlRST0xfMjg='),
1124 + c('LnNlY29uZC1wb3N0LWFkcy13cmFwcGVy'),
1125 + '.universalboxADVBOX03',
1126 + c('LmFkdmVydGlzZW1lbnQtNzI4eDkw'),
1127 + c('LnNxdWFyZV9hZHM='),
1128 + ],
1129 + easyListChina: [
1130 + c('YVtocmVmKj0iLndlbnNpeHVldGFuZy5jb20vIl0='),
1131 + c('LmFwcGd1aWRlLXdyYXBbb25jbGljayo9ImJjZWJvcy5jb20iXQ=='),
1132 + c('LmZyb250cGFnZUFkdk0='),
1133 + '#taotaole',
1134 + '#aafoot.top_box',
1135 + ],
1136 + easyListCookie: [
1137 + '#AdaCompliance.app-notice',
1138 + '.text-center.rgpd',
1139 + '.panel--cookie',
1140 + '.js-cookies-andromeda',
1141 + '.elxtr-consent',
1142 + ],
1143 + easyListCzechSlovak: [
1144 + '#onlajny-stickers',
1145 + c('I3Jla2xhbW5pLWJveA=='),
1146 + c('LnJla2xhbWEtbWVnYWJvYXJk'),
1147 + '.sklik',
1148 + c('W2lkXj0ic2tsaWtSZWtsYW1hIl0='),
1149 + ],
1150 + easyListDutch: [
1151 + c('I2FkdmVydGVudGll'),
1152 + c('I3ZpcEFkbWFya3RCYW5uZXJCbG9jaw=='),
1153 + '.adstekst',
1154 + c('YVtocmVmXj0iaHR0cHM6Ly94bHR1YmUubmwvY2xpY2svIl0='),
1155 + '#semilo-lrectangle',
1156 + ],
1157 + easyListGermany: [
1158 + c('I0FkX1dpbjJkYXk='),
1159 + c('I3dlcmJ1bmdzYm94MzAw'),
1160 + c('YVtocmVmXj0iaHR0cDovL3d3dy5yb3RsaWNodGthcnRlaS5jb20vP3NjPSJd'),
1161 + c('I3dlcmJ1bmdfd2lkZXNreXNjcmFwZXJfc2NyZWVu'),
1162 + c('YVtocmVmXj0iaHR0cDovL2xhbmRpbmcucGFya3BsYXR6a2FydGVpLmNvbS8/YWc9Il0='),
1163 + ],
1164 + easyListItaly: [
1165 + c('LmJveF9hZHZfYW5udW5jaQ=='),
1166 + '.sb-box-pubbliredazionale',
1167 + c('YVtocmVmXj0iaHR0cDovL2FmZmlsaWF6aW9uaWFkcy5zbmFpLml0LyJd'),
1168 + c('YVtocmVmXj0iaHR0cHM6Ly9hZHNlcnZlci5odG1sLml0LyJd'),
1169 + c('YVtocmVmXj0iaHR0cHM6Ly9hZmZpbGlhemlvbmlhZHMuc25haS5pdC8iXQ=='),
1170 + ],
1171 + easyListLithuania: [
1172 + c('LnJla2xhbW9zX3RhcnBhcw=='),
1173 + c('LnJla2xhbW9zX251b3JvZG9z'),
1174 + c('aW1nW2FsdD0iUmVrbGFtaW5pcyBza3lkZWxpcyJd'),
1175 + c('aW1nW2FsdD0iRGVkaWt1b3RpLmx0IHNlcnZlcmlhaSJd'),
1176 + c('aW1nW2FsdD0iSG9zdGluZ2FzIFNlcnZlcmlhaS5sdCJd'),
1177 + ],
1178 + estonian: [c('QVtocmVmKj0iaHR0cDovL3BheTRyZXN1bHRzMjQuZXUiXQ==')],
1179 + fanboyAnnoyances: [
1180 + '#feedback-tab',
1181 + '#taboola-below-article',
1182 + '.feedburnerFeedBlock',
1183 + '.widget-feedburner-counter',
1184 + '[title="Subscribe to our blog"]',
1185 + ],
1186 + fanboyAntiFacebook: ['.util-bar-module-firefly-visible'],
1187 + fanboyEnhancedTrackers: [
1188 + '.open.pushModal',
1189 + '#issuem-leaky-paywall-articles-zero-remaining-nag',
1190 + '#sovrn_container',
1191 + 'div[class$="-hide"][zoompage-fontsize][style="display: block;"]',
1192 + '.BlockNag__Card',
1193 + ],
1194 + fanboySocial: [
1195 + '.td-tags-and-social-wrapper-box',
1196 + '.twitterContainer',
1197 + '.youtube-social',
1198 + 'a[title^="Like us on Facebook"]',
1199 + 'img[alt^="Share on Digg"]',
1200 + ],
1201 + frellwitSwedish: [
1202 + c('YVtocmVmKj0iY2FzaW5vcHJvLnNlIl1bdGFyZ2V0PSJfYmxhbmsiXQ=='),
1203 + c('YVtocmVmKj0iZG9rdG9yLXNlLm9uZWxpbmsubWUiXQ=='),
1204 + 'article.category-samarbete',
1205 + c('ZGl2LmhvbGlkQWRz'),
1206 + 'ul.adsmodern',
1207 + ],
1208 + greekAdBlock: [
1209 + c('QVtocmVmKj0iYWRtYW4ub3RlbmV0LmdyL2NsaWNrPyJd'),
1210 + c('QVtocmVmKj0iaHR0cDovL2F4aWFiYW5uZXJzLmV4b2R1cy5nci8iXQ=='),
1211 + c('QVtocmVmKj0iaHR0cDovL2ludGVyYWN0aXZlLmZvcnRobmV0LmdyL2NsaWNrPyJd'),
1212 + 'DIV.agores300',
1213 + 'TABLE.advright',
1214 + ],
1215 + hungarian: [
1216 + '#cemp_doboz',
1217 + '.optimonk-iframe-container',
1218 + c('LmFkX19tYWlu'),
1219 + c('W2NsYXNzKj0iR29vZ2xlQWRzIl0='),
1220 + '#hirdetesek_box',
1221 + ],
1222 + iDontCareAboutCookies: [
1223 + '.alert-info[data-block-track*="CookieNotice"]',
1224 + '.ModuleTemplateCookieIndicator',
1225 + '.o--cookies--container',
1226 + '.cookie-msg-info-container',
1227 + '#cookies-policy-sticky',
1228 + ],
1229 + icelandicAbp: [
1230 + c('QVtocmVmXj0iL2ZyYW1ld29yay9yZXNvdXJjZXMvZm9ybXMvYWRzLmFzcHgiXQ=='),
1231 + ],
1232 + latvian: [
1233 + c(
1234 + 'YVtocmVmPSJodHRwOi8vd3d3LnNhbGlkemluaS5sdi8iXVtzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMjBweDsgaGVpZ2h0OiA0MHB4OyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7Il0=',
1235 + ),
1236 + c(
1237 + 'YVtocmVmPSJodHRwOi8vd3d3LnNhbGlkemluaS5sdi8iXVtzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiA4OHB4OyBoZWlnaHQ6IDMxcHg7IG92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiByZWxhdGl2ZTsiXQ==',
1238 + ),
1239 + ],
1240 + listKr: [
1241 + c('YVtocmVmKj0iLy9hZC5wbGFuYnBsdXMuY28ua3IvIl0='),
1242 + c('I2xpdmVyZUFkV3JhcHBlcg=='),
1243 + c('YVtocmVmKj0iLy9hZHYuaW1hZHJlcC5jby5rci8iXQ=='),
1244 + c('aW5zLmZhc3R2aWV3LWFk'),
1245 + '.revenue_unit_item.dable',
1246 + ],
1247 + listeAr: [
1248 + c('LmdlbWluaUxCMUFk'),
1249 + '.right-and-left-sponsers',
1250 + c('YVtocmVmKj0iLmFmbGFtLmluZm8iXQ=='),
1251 + c('YVtocmVmKj0iYm9vcmFxLm9yZyJd'),
1252 + c('YVtocmVmKj0iZHViaXp6bGUuY29tL2FyLz91dG1fc291cmNlPSJd'),
1253 + ],
1254 + listeFr: [
1255 + c('YVtocmVmXj0iaHR0cDovL3Byb21vLnZhZG9yLmNvbS8iXQ=='),
1256 + c('I2FkY29udGFpbmVyX3JlY2hlcmNoZQ=='),
1257 + c('YVtocmVmKj0id2Vib3JhbWEuZnIvZmNnaS1iaW4vIl0='),
1258 + '.site-pub-interstitiel',
1259 + 'div[id^="crt-"][data-criteo-id]',
1260 + ],
1261 + officialPolish: [
1262 + '#ceneo-placeholder-ceneo-12',
1263 + c('W2hyZWZePSJodHRwczovL2FmZi5zZW5kaHViLnBsLyJd'),
1264 + c('YVtocmVmXj0iaHR0cDovL2Fkdm1hbmFnZXIudGVjaGZ1bi5wbC9yZWRpcmVjdC8iXQ=='),
1265 + c('YVtocmVmXj0iaHR0cDovL3d3dy50cml6ZXIucGwvP3V0bV9zb3VyY2UiXQ=='),
1266 + c('ZGl2I3NrYXBpZWNfYWQ='),
1267 + ],
1268 + ro: [
1269 + c('YVtocmVmXj0iLy9hZmZ0cmsuYWx0ZXgucm8vQ291bnRlci9DbGljayJd'),
1270 + 'a[href^="/magazin/"]',
1271 + c('YVtocmVmXj0iaHR0cHM6Ly9ibGFja2ZyaWRheXNhbGVzLnJvL3Ryay9zaG9wLyJd'),
1272 + c('YVtocmVmXj0iaHR0cHM6Ly9ldmVudC4ycGVyZm9ybWFudC5jb20vZXZlbnRzL2NsaWNrIl0='),
1273 + c('YVtocmVmXj0iaHR0cHM6Ly9sLnByb2ZpdHNoYXJlLnJvLyJd'),
1274 + ],
1275 + ruAd: [
1276 + c('YVtocmVmKj0iLy9mZWJyYXJlLnJ1LyJd'),
1277 + c('YVtocmVmKj0iLy91dGltZy5ydS8iXQ=='),
1278 + c('YVtocmVmKj0iOi8vY2hpa2lkaWtpLnJ1Il0='),
1279 + '#pgeldiz',
1280 + '.yandex-rtb-block',
1281 + ],
1282 + thaiAds: [
1283 + 'a[href*=macau-uta-popup]',
1284 + c('I2Fkcy1nb29nbGUtbWlkZGxlX3JlY3RhbmdsZS1ncm91cA=='),
1285 + c('LmFkczMwMHM='),
1286 + '.bumq',
1287 + '.img-kosana',
1288 + ],
1289 + webAnnoyancesUltralist: [
1290 + '#mod-social-share-2',
1291 + '#social-tools',
1292 + c('LmN0cGwtZnVsbGJhbm5lcg=='),
1293 + '.zergnet-recommend',
1294 + '.yt.btn-link.btn-md.btn',
1295 + ],
1296 + }),
1297 + (n = Object.keys(e)),
1298 + [
1299 + 4,
1300 + B(
1301 + (i = []).concat.apply(
1302 + i,
1303 + n.map(function (n) {
1304 + return e[n];
1305 + }),
1306 + ),
1307 + ),
1308 + ])
1309 + : [2, void 0];
1310 + case 1:
1311 + return (
1312 + (o = t.sent()),
1313 + r &&
1314 + (function (e, n) {
1315 + for (
1316 + var t = 'DOM blockers debug:\n```', r = 0, o = Object.keys(e);
1317 + r < o.length;
1318 + r++
1319 + ) {
1320 + var a = o[r];
1321 + t += '\n'.concat(a, ':');
1322 + for (var i = 0, c = e[a]; i < c.length; i++) {
1323 + var u = c[i];
1324 + t += '\n '.concat(n[u] ? '🚫' : '➡️', ' ').concat(u);
1325 + }
1326 + }
1327 + console.log(''.concat(t, '\n```'));
1328 + })(e, o),
1329 + (a = n.filter(function (n) {
1330 + var t = e[n];
1331 + return (
1332 + g(
1333 + t.map(function (e) {
1334 + return o[e];
1335 + }),
1336 + ) >
1337 + 0.6 * t.length
1338 + );
1339 + })).sort(),
1340 + [2, a]
1341 + );
1342 + }
1343 + var c;
1344 + });
1345 + });
1346 + },
1347 + fontPreferences: function () {
1348 + return (function (e, n) {
1349 + void 0 === n && (n = 4e3);
1350 + return M(function (t, o) {
1351 + var a = o.document,
1352 + i = a.body,
1353 + c = i.style;
1354 + (c.width = ''.concat(n, 'px')),
1355 + (c.webkitTextSizeAdjust = c.textSizeAdjust = 'none'),
1356 + X()
1357 + ? (i.style.zoom = ''.concat(1 / o.devicePixelRatio))
1358 + : x() && (i.style.zoom = 'reset');
1359 + var u = a.createElement('div');
1360 + return (
1361 + (u.textContent = r([], Array((n / 20) << 0), !0)
1362 + .map(function () {
1363 + return 'word';
1364 + })
1365 + .join(' ')),
1366 + i.appendChild(u),
1367 + e(a, i)
1368 + );
1369 + }, '<!doctype html><html><head><meta name="viewport" content="width=device-width, initial-scale=1">');
1370 + })(function (e, n) {
1371 + for (var t = {}, r = {}, o = 0, a = Object.keys(ee); o < a.length; o++) {
1372 + var i = a[o],
1373 + c = ee[i],
1374 + u = c[0],
1375 + l = void 0 === u ? {} : u,
1376 + s = c[1],
1377 + d = void 0 === s ? 'mmMwWLliI0fiflO&1' : s,
1378 + m = e.createElement('span');
1379 + (m.textContent = d), (m.style.whiteSpace = 'nowrap');
1380 + for (var f = 0, v = Object.keys(l); f < v.length; f++) {
1381 + var h = v[f],
1382 + b = l[h];
1383 + void 0 !== b && (m.style[h] = b);
1384 + }
1385 + (t[i] = m), n.appendChild(e.createElement('br')), n.appendChild(m);
1386 + }
1387 + for (var p = 0, y = Object.keys(ee); p < y.length; p++) {
1388 + r[(i = y[p])] = t[i].getBoundingClientRect().width;
1389 + }
1390 + return r;
1391 + });
1392 + },
1393 + audio: function () {
1394 + var e = window,
1395 + n = e.OfflineAudioContext || e.webkitOfflineAudioContext;
1396 + if (!n) return -2;
1397 + if (
1398 + x() &&
1399 + !F() &&
1400 + !(function () {
1401 + var e = window;
1402 + return (
1403 + g([
1404 + 'DOMRectList' in e,
1405 + 'RTCPeerConnectionIceEvent' in e,
1406 + 'SVGGeometryElement' in e,
1407 + 'ontransitioncancel' in e,
1408 + ]) >= 3
1409 + );
1410 + })()
1411 + )
1412 + return -1;
1413 + var t = new n(1, 5e3, 44100),
1414 + r = t.createOscillator();
1415 + (r.type = 'triangle'), (r.frequency.value = 1e4);
1416 + var o = t.createDynamicsCompressor();
1417 + (o.threshold.value = -50),
1418 + (o.knee.value = 40),
1419 + (o.ratio.value = 12),
1420 + (o.attack.value = 0),
1421 + (o.release.value = 0.25),
1422 + r.connect(o),
1423 + o.connect(t.destination),
1424 + r.start(0);
1425 + var a = (function (e) {
1426 + var n = 3,
1427 + t = 500,
1428 + r = 500,
1429 + o = 5e3,
1430 + a = function () {};
1431 + return [
1432 + new Promise(function (i, c) {
1433 + var u = !1,
1434 + l = 0,
1435 + s = 0;
1436 + e.oncomplete = function (e) {
1437 + return i(e.renderedBuffer);
1438 + };
1439 + var d = function () {
1440 + setTimeout(function () {
1441 + return c(G('timeout'));
1442 + }, Math.min(r, s + o - Date.now()));
1443 + },
1444 + m = function () {
1445 + try {
1446 + switch ((e.startRendering(), e.state)) {
1447 + case 'running':
1448 + (s = Date.now()), u && d();
1449 + break;
1450 + case 'suspended':
1451 + document.hidden || l++, u && l >= n ? c(G('suspended')) : setTimeout(m, t);
1452 + }
1453 + } catch (r) {
1454 + c(r);
1455 + }
1456 + };
1457 + m(),
1458 + (a = function () {
1459 + u || ((u = !0), s > 0 && d());
1460 + });
1461 + }),
1462 + a,
1463 + ];
1464 + })(t),
1465 + i = a[0],
1466 + c = a[1],
1467 + l = i.then(
1468 + function (e) {
1469 + return (function (e) {
1470 + for (var n = 0, t = 0; t < e.length; ++t) n += Math.abs(e[t]);
1471 + return n;
1472 + })(e.getChannelData(0).subarray(4500));
1473 + },
1474 + function (e) {
1475 + if ('timeout' === e.name || 'suspended' === e.name) return -3;
1476 + throw e;
1477 + },
1478 + );
1479 + return (
1480 + u(l),
1481 + function () {
1482 + return c(), l;
1483 + }
1484 + );
1485 + },
1486 + screenFrame: function () {
1487 + var e = this,
1488 + r = z();
1489 + return function () {
1490 + return n(e, void 0, void 0, function () {
1491 + var e, n;
1492 + return t(this, function (t) {
1493 + switch (t.label) {
1494 + case 0:
1495 + return [4, r()];
1496 + case 1:
1497 + return (
1498 + (e = t.sent()),
1499 + [
1500 + 2,
1501 + [
1502 + (n = function (e) {
1503 + return null === e ? null : w(e, 10);
1504 + })(e[0]),
1505 + n(e[1]),
1506 + n(e[2]),
1507 + n(e[3]),
1508 + ],
1509 + ]
1510 + );
1511 + }
1512 + });
1513 + });
1514 + };
1515 + },
1516 + osCpu: function () {
1517 + return navigator.oscpu;
1518 + },
1519 + languages: function () {
1520 + var e,
1521 + n = navigator,
1522 + t = [],
1523 + r = n.language || n.userLanguage || n.browserLanguage || n.systemLanguage;
1524 + if ((void 0 !== r && t.push([r]), Array.isArray(n.languages)))
1525 + (X() &&
1526 + g([
1527 + !('MediaSettingsRange' in (e = window)),
1528 + 'RTCEncodedAudioFrame' in e,
1529 + '' + e.Intl == '[object Intl]',
1530 + '' + e.Reflect == '[object Reflect]',
1531 + ]) >= 3) ||
1532 + t.push(n.languages);
1533 + else if ('string' == typeof n.languages) {
1534 + var o = n.languages;
1535 + o && t.push(o.split(','));
1536 + }
1537 + return t;
1538 + },
1539 + colorDepth: function () {
1540 + return window.screen.colorDepth;
1541 + },
1542 + deviceMemory: function () {
1543 + return y(p(navigator.deviceMemory), void 0);
1544 + },
1545 + screenResolution: function () {
1546 + var e = screen,
1547 + n = function (e) {
1548 + return y(b(e), null);
1549 + },
1550 + t = [n(e.width), n(e.height)];
1551 + return t.sort().reverse(), t;
1552 + },
1553 + hardwareConcurrency: function () {
1554 + return y(b(navigator.hardwareConcurrency), void 0);
1555 + },
1556 + timezone: function () {
1557 + var e,
1558 + n = null === (e = window.Intl) || void 0 === e ? void 0 : e.DateTimeFormat;
1559 + if (n) {
1560 + var t = new n().resolvedOptions().timeZone;
1561 + if (t) return t;
1562 + }
1563 + var r,
1564 + o =
1565 + ((r = new Date().getFullYear()),
1566 + -Math.max(
1567 + p(new Date(r, 0, 1).getTimezoneOffset()),
1568 + p(new Date(r, 6, 1).getTimezoneOffset()),
1569 + ));
1570 + return 'UTC'.concat(o >= 0 ? '+' : '').concat(Math.abs(o));
1571 + },
1572 + sessionStorage: function () {
1573 + try {
1574 + return !!window.sessionStorage;
1575 + } catch (e) {
1576 + return !0;
1577 + }
1578 + },
1579 + localStorage: function () {
1580 + try {
1581 + return !!window.localStorage;
1582 + } catch (e) {
1583 + return !0;
1584 + }
1585 + },
1586 + indexedDB: function () {
1587 + if (!Z() && !S())
1588 + try {
1589 + return !!window.indexedDB;
1590 + } catch (e) {
1591 + return !0;
1592 + }
1593 + },
1594 + openDatabase: function () {
1595 + return !!window.openDatabase;
1596 + },
1597 + cpuClass: function () {
1598 + return navigator.cpuClass;
1599 + },
1600 + platform: function () {
1601 + var e = navigator.platform;
1602 + return 'MacIntel' === e && x() && !F()
1603 + ? (function () {
1604 + if ('iPad' === navigator.platform) return !0;
1605 + var e = screen,
1606 + n = e.width / e.height;
1607 + return (
1608 + g([
1609 + 'MediaSource' in window,
1610 + !!Element.prototype.webkitRequestFullscreen,
1611 + n > 0.65 && n < 1.53,
1612 + ]) >= 2
1613 + );
1614 + })()
1615 + ? 'iPad'
1616 + : 'iPhone'
1617 + : e;
1618 + },
1619 + plugins: function () {
1620 + var e = navigator.plugins;
1621 + if (e) {
1622 + for (var n = [], t = 0; t < e.length; ++t) {
1623 + var r = e[t];
1624 + if (r) {
1625 + for (var o = [], a = 0; a < r.length; ++a) {
1626 + var i = r[a];
1627 + o.push({ type: i.type, suffixes: i.suffixes });
1628 + }
1629 + n.push({ name: r.name, description: r.description, mimeTypes: o });
1630 + }
1631 + }
1632 + return n;
1633 + }
1634 + },
1635 + canvas: function () {
1636 + var e,
1637 + n,
1638 + t = !1,
1639 + r = (function () {
1640 + var e = document.createElement('canvas');
1641 + return (e.width = 1), (e.height = 1), [e, e.getContext('2d')];
1642 + })(),
1643 + o = r[0],
1644 + a = r[1];
1645 + if (
1646 + (function (e, n) {
1647 + return !(!n || !e.toDataURL);
1648 + })(o, a)
1649 + ) {
1650 + (t = (function (e) {
1651 + return e.rect(0, 0, 10, 10), e.rect(2, 2, 6, 6), !e.isPointInPath(5, 5, 'evenodd');
1652 + })(a)),
1653 + (function (e, n) {
1654 + (e.width = 240),
1655 + (e.height = 60),
1656 + (n.textBaseline = 'alphabetic'),
1657 + (n.fillStyle = '#f60'),
1658 + n.fillRect(100, 1, 62, 20),
1659 + (n.fillStyle = '#069'),
1660 + (n.font = '11pt "Times New Roman"');
1661 + var t = 'Cwm fjordbank gly '.concat(String.fromCharCode(55357, 56835));
1662 + n.fillText(t, 2, 15),
1663 + (n.fillStyle = 'rgba(102, 204, 0, 0.2)'),
1664 + (n.font = '18pt Arial'),
1665 + n.fillText(t, 4, 45);
1666 + })(o, a);
1667 + var i = H(o);
1668 + i !== H(o)
1669 + ? (e = n = 'unstable')
1670 + : ((n = i),
1671 + (function (e, n) {
1672 + (e.width = 122), (e.height = 110), (n.globalCompositeOperation = 'multiply');
1673 + for (
1674 + var t = 0,
1675 + r = [
1676 + ['#f2f', 40, 40],
1677 + ['#2ff', 80, 40],
1678 + ['#ff2', 60, 80],
1679 + ];
1680 + t < r.length;
1681 + t++
1682 + ) {
1683 + var o = r[t],
1684 + a = o[0],
1685 + i = o[1],
1686 + c = o[2];
1687 + (n.fillStyle = a),
1688 + n.beginPath(),
1689 + n.arc(i, c, 40, 0, 2 * Math.PI, !0),
1690 + n.closePath(),
1691 + n.fill();
1692 + }
1693 + (n.fillStyle = '#f9c'),
1694 + n.arc(60, 60, 60, 0, 2 * Math.PI, !0),
1695 + n.arc(60, 60, 20, 0, 2 * Math.PI, !0),
1696 + n.fill('evenodd');
1697 + })(o, a),
1698 + (e = H(o)));
1699 + } else e = n = '';
1700 + return { winding: t, geometry: e, text: n };
1701 + },
1702 + touchSupport: function () {
1703 + var e,
1704 + n = navigator,
1705 + t = 0;
1706 + void 0 !== n.maxTouchPoints
1707 + ? (t = b(n.maxTouchPoints))
1708 + : void 0 !== n.msMaxTouchPoints && (t = n.msMaxTouchPoints);
1709 + try {
1710 + document.createEvent('TouchEvent'), (e = !0);
1711 + } catch (r) {
1712 + e = !1;
1713 + }
1714 + return { maxTouchPoints: t, touchEvent: e, touchStart: 'ontouchstart' in window };
1715 + },
1716 + vendor: function () {
1717 + return navigator.vendor || '';
1718 + },
1719 + vendorFlavors: function () {
1720 + for (
1721 + var e = [],
1722 + n = 0,
1723 + t = [
1724 + 'chrome',
1725 + 'safari',
1726 + '__crWeb',
1727 + '__gCrWeb',
1728 + 'yandex',
1729 + '__yb',
1730 + '__ybro',
1731 + '__firefox__',
1732 + '__edgeTrackingPreventionStatistics',
1733 + 'webkit',
1734 + 'oprt',
1735 + 'samsungAr',
1736 + 'ucweb',
1737 + 'UCShellJava',
1738 + 'puffinDevice',
1739 + ];
1740 + n < t.length;
1741 + n++
1742 + ) {
1743 + var r = t[n],
1744 + o = window[r];
1745 + o && 'object' == typeof o && e.push(r);
1746 + }
1747 + return e.sort();
1748 + },
1749 + cookiesEnabled: function () {
1750 + var e = document;
1751 + try {
1752 + e.cookie = 'cookietest=1; SameSite=Strict;';
1753 + var n = -1 !== e.cookie.indexOf('cookietest=');
1754 + return (e.cookie = 'cookietest=1; SameSite=Strict; expires=Thu, 01-Jan-1970 00:00:01 GMT'), n;
1755 + } catch (t) {
1756 + return !1;
1757 + }
1758 + },
1759 + colorGamut: function () {
1760 + for (var e = 0, n = ['rec2020', 'p3', 'srgb']; e < n.length; e++) {
1761 + var t = n[e];
1762 + if (matchMedia('(color-gamut: '.concat(t, ')')).matches) return t;
1763 + }
1764 + },
1765 + invertedColors: function () {
1766 + return !!O('inverted') || (!O('none') && void 0);
1767 + },
1768 + forcedColors: function () {
1769 + return !!_('active') || (!_('none') && void 0);
1770 + },
1771 + monochrome: function () {
1772 + if (matchMedia('(min-monochrome: 0)').matches) {
1773 + for (var e = 0; e <= 100; ++e)
1774 + if (matchMedia('(max-monochrome: '.concat(e, ')')).matches) return e;
1775 + throw new Error('Too high value');
1776 + }
1777 + },
1778 + contrast: function () {
1779 + return Q('no-preference')
1780 + ? 0
1781 + : Q('high') || Q('more')
1782 + ? 1
1783 + : Q('low') || Q('less')
1784 + ? -1
1785 + : Q('forced')
1786 + ? 10
1787 + : void 0;
1788 + },
1789 + reducedMotion: function () {
1790 + return !!U('reduce') || (!U('no-preference') && void 0);
1791 + },
1792 + hdr: function () {
1793 + return !!K('high') || (!K('standard') && void 0);
1794 + },
1795 + math: function () {
1796 + var e,
1797 + n = q.acos || $,
1798 + t = q.acosh || $,
1799 + r = q.asin || $,
1800 + o = q.asinh || $,
1801 + a = q.atanh || $,
1802 + i = q.atan || $,
1803 + c = q.sin || $,
1804 + u = q.sinh || $,
1805 + l = q.cos || $,
1806 + s = q.cosh || $,
1807 + d = q.tan || $,
1808 + m = q.tanh || $,
1809 + f = q.exp || $,
1810 + v = q.expm1 || $,
1811 + h = q.log1p || $;
1812 + return {
1813 + acos: n(0.12312423423423424),
1814 + acosh: t(1e308),
1815 + acoshPf: ((e = 1e154), q.log(e + q.sqrt(e * e - 1))),
1816 + asin: r(0.12312423423423424),
1817 + asinh: o(1),
1818 + asinhPf: (function (e) {
1819 + return q.log(e + q.sqrt(e * e + 1));
1820 + })(1),
1821 + atanh: a(0.5),
1822 + atanhPf: (function (e) {
1823 + return q.log((1 + e) / (1 - e)) / 2;
1824 + })(0.5),
1825 + atan: i(0.5),
1826 + sin: c(-1e300),
1827 + sinh: u(1),
1828 + sinhPf: (function (e) {
1829 + return q.exp(e) - 1 / q.exp(e) / 2;
1830 + })(1),
1831 + cos: l(10.000000000123),
1832 + cosh: s(1),
1833 + coshPf: (function (e) {
1834 + return (q.exp(e) + 1 / q.exp(e)) / 2;
1835 + })(1),
1836 + tan: d(-1e300),
1837 + tanh: m(1),
1838 + tanhPf: (function (e) {
1839 + return (q.exp(2 * e) - 1) / (q.exp(2 * e) + 1);
1840 + })(1),
1841 + exp: f(1),
1842 + expm1: v(1),
1843 + expm1Pf: (function (e) {
1844 + return q.exp(e) - 1;
1845 + })(1),
1846 + log1p: h(10),
1847 + log1pPf: (function (e) {
1848 + return q.log(1 + e);
1849 + })(10),
1850 + powPI: (function (e) {
1851 + return q.pow(q.PI, e);
1852 + })(-100),
1853 + };
1854 + },
1855 + videoCard: function () {
1856 + var e,
1857 + n = document.createElement('canvas'),
1858 + t =
1859 + null !== (e = n.getContext('webgl')) && void 0 !== e
1860 + ? e
1861 + : n.getContext('experimental-webgl');
1862 + if (t && 'getExtension' in t) {
1863 + var r = t.getExtension('WEBGL_debug_renderer_info');
1864 + if (r)
1865 + return {
1866 + vendor: (t.getParameter(r.UNMASKED_VENDOR_WEBGL) || '').toString(),
1867 + renderer: (t.getParameter(r.UNMASKED_RENDERER_WEBGL) || '').toString(),
1868 + };
1869 + }
1870 + },
1871 + pdfViewerEnabled: function () {
1872 + return navigator.pdfViewerEnabled;
1873 + },
1874 + architecture: function () {
1875 + var e = new Float32Array(1),
1876 + n = new Uint8Array(e.buffer);
1877 + return (e[0] = 1 / 0), (e[0] = e[0] - e[0]), n[3];
1878 + },
1879 +};
1880 +function te(e) {
1881 + var n = (function (e) {
1882 + if (R()) return 0.4;
1883 + if (x()) return F() ? 0.5 : 0.3;
1884 + var n = e.platform.value || '';
1885 + if (/^Win/.test(n)) return 0.6;
1886 + if (/^Mac/.test(n)) return 0.5;
1887 + return 0.7;
1888 + })(e),
1889 + t = (function (e) {
1890 + return w(0.99 + 0.01 * e, 1e-4);
1891 + })(n);
1892 + return {
1893 + score: n,
1894 + comment: '$ if upgrade to Pro: https://fpjs.dev/pro'.replace(/\$/g, ''.concat(t)),
1895 + };
1896 +}
1897 +function re(n) {
1898 + return JSON.stringify(
1899 + n,
1900 + function (n, t) {
1901 + return t instanceof Error
1902 + ? e(
1903 + {
1904 + name: (r = t).name,
1905 + message: r.message,
1906 + stack: null === (o = r.stack) || void 0 === o ? void 0 : o.split('\n'),
1907 + },
1908 + r,
1909 + )
1910 + : t;
1911 + var r, o;
1912 + },
1913 + 2,
1914 + );
1915 +}
1916 +function oe(e) {
1917 + return h(
1918 + (function (e) {
1919 + for (var n = '', t = 0, r = Object.keys(e).sort(); t < r.length; t++) {
1920 + var o = r[t],
1921 + a = e[o],
1922 + i = a.error ? 'error' : JSON.stringify(a.value);
1923 + n += ''
1924 + .concat(n ? '|' : '')
1925 + .concat(o.replace(/([:|\\])/g, '\\$1'), ':')
1926 + .concat(i);
1927 + }
1928 + return n;
1929 + })(e),
1930 + );
1931 +}
1932 +function ae(e) {
1933 + return (
1934 + void 0 === e && (e = 50),
1935 + (function (e, n) {
1936 + void 0 === n && (n = 1 / 0);
1937 + var t = window.requestIdleCallback;
1938 + return t
1939 + ? new Promise(function (e) {
1940 + return t.call(
1941 + window,
1942 + function () {
1943 + return e();
1944 + },
1945 + { timeout: n },
1946 + );
1947 + })
1948 + : o(Math.min(e, n));
1949 + })(e, 2 * e)
1950 + );
1951 +}
1952 +function ie(e, r) {
1953 + var o = Date.now();
1954 + return {
1955 + get: function (a) {
1956 + return n(this, void 0, void 0, function () {
1957 + var n, i, c;
1958 + return t(this, function (t) {
1959 + switch (t.label) {
1960 + case 0:
1961 + return (n = Date.now()), [4, e()];
1962 + case 1:
1963 + return (
1964 + (i = t.sent()),
1965 + (c = (function (e) {
1966 + var n;
1967 + return {
1968 + get visitorId() {
1969 + return void 0 === n && (n = oe(this.components)), n;
1970 + },
1971 + set visitorId(e) {
1972 + n = e;
1973 + },
1974 + confidence: te(e),
1975 + components: e,
1976 + version: '3.4.0',
1977 + };
1978 + })(i)),
1979 + (r || (null == a ? void 0 : a.debug)) &&
1980 + console.log(
1981 + 'Copy the text below to get the debug data:\n\n```\nversion: '
1982 + .concat(c.version, '\nuserAgent: ')
1983 + .concat(navigator.userAgent, '\ntimeBetweenLoadAndGet: ')
1984 + .concat(n - o, '\nvisitorId: ')
1985 + .concat(c.visitorId, '\ncomponents: ')
1986 + .concat(re(i), '\n```'),
1987 + ),
1988 + [2, c]
1989 + );
1990 + }
1991 + });
1992 + });
1993 + },
1994 + };
1995 +}
1996 +function ce(e) {
1997 + var r = void 0 === e ? {} : e,
1998 + o = r.delayFallback,
1999 + a = r.debug;
2000 + return (
2001 + r.monitoring,
2002 + n(this, void 0, void 0, function () {
2003 + return t(this, function (e) {
2004 + switch (e.label) {
2005 + case 0:
2006 + return [4, ae(o)];
2007 + case 1:
2008 + return e.sent(), [2, ie(V(ne, { debug: a }, []), a)];
2009 + }
2010 + });
2011 + })
2012 + );
2013 +}
2014 +var ue = { load: ce, hashComponents: oe, componentsToDebugString: re },
2015 + le = h;
2016 +export {
2017 + re as componentsToDebugString,
2018 + ue as default,
2019 + C as getFullscreenElement,
2020 + z as getScreenFrame,
2021 + oe as hashComponents,
2022 + R as isAndroid,
2023 + X as isChromium,
2024 + F as isDesktopSafari,
2025 + S as isEdgeHTML,
2026 + Y as isGecko,
2027 + Z as isTrident,
2028 + x as isWebKit,
2029 + ce as load,
2030 + V as loadSources,
2031 + le as murmurX64Hash128,
2032 + ae as prepareForSources,
2033 + ne as sources,
2034 + W as transformSource,
2035 +};
1 +/*
2 + * @Date: 2022-07-18 10:22:22
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-08-22 18:23:07
5 + * @FilePath: /front/src/utils/generateIcons.js
6 + * @Description: 文件描述
7 + */
8 +import icon_nav from '@images/icon/nav.png'
9 +import icon_gz from '@images/icon/icon_gz.png'
10 +
11 +export {
12 + icon_nav,
13 + icon_gz,
14 +}
1 +/*
2 + * @Author: hookehuyr hookehuyr@gmail.com
3 + * @Date: 2022-05-17 11:17:58
4 + * @LastEditors: hookehuyr hookehuyr@gmail.com
5 + * @LastEditTime: 2022-07-18 10:42:12
6 + * @FilePath: /front/src/utils/generateModules.js
7 + * @Description:
8 + */
9 +import MuiVideo from '@/components/MuiVideo/index.vue'
10 +
11 +export {
12 + MuiVideo,
13 +}
1 +/*
2 + * @Date: 2022-05-17 11:26:03
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-08-05 15:18:06
5 + * @FilePath: /front/src/utils/generatePackage.js
6 + * @Description: 文件描述
7 + */
8 +import Cookies from 'js-cookie'
9 +import $ from 'jquery'
10 +import _ from 'lodash'
11 +import dayjs from 'dayjs'
12 +import axios from '@/utils/axios';
13 +import { storeToRefs } from 'pinia'
14 +import { mainStore } from '@/store'
15 +import { Toast, Dialog } from 'vant';
16 +import { wxInfo, hasEllipsis } from '@/utils/tools';
17 +import { useTitle } from '@vueuse/core'
18 +
19 +export {
20 + Cookies,
21 + $,
22 + _,
23 + axios,
24 + storeToRefs,
25 + mainStore,
26 + Toast,
27 + Dialog,
28 + wxInfo,
29 + hasEllipsis,
30 + useTitle,
31 + dayjs
32 +}
1 +/*
2 + * @Date: 2022-05-16 17:21:45
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-06-29 17:00:15
5 + * @FilePath: /tswj/src/utils/generateRoute.js
6 + * @Description: 文件描述
7 + */
8 +
9 +/**
10 + * 根据后台返回的路径,生成页面的组件模版
11 + * @param {*} component
12 + * @returns 模版地址
13 + */
14 +function loadView(component) {
15 + return () => import(`../views/${component}.vue`)
16 +}
17 +
18 +/**
19 + * 生成路由结构
20 + * @param {*} routes
21 + */
22 +const generateRoutes = (routes) => {
23 + const arr = []
24 + routes.forEach(route => {
25 + const router = {}
26 + const {
27 + path,
28 + redirect,
29 + name,
30 + component,
31 + keepAlive,
32 + meta,
33 + children
34 + } = route
35 +
36 + router.path = path
37 + redirect && (router.redirect = redirect)
38 + name && (router.name = name)
39 + router.component = loadView(component)
40 + keepAlive && (router.keepAlive = keepAlive)
41 + meta && (router.meta = meta)
42 + router.children = !Array.isArray(children) || generateRoutes(children);
43 + arr.push(router)
44 + })
45 + return arr
46 +}
47 +
48 +export default generateRoutes;
1 +import sha1 from "js-sha1";
2 +
3 +function getEtag(buffer, callback) {
4 + // sha1算法
5 + var shA1 = sha1.digest;
6 +
7 + // 以4M为单位分割
8 + var blockSize = 4 * 1024 * 1024;
9 + var sha1String = [];
10 + var prefix = 0x16;
11 + var blockCount = 0;
12 +
13 + var bufferSize = buffer.size || buffer.length || buffer.byteLength;
14 + blockCount = Math.ceil(bufferSize / blockSize);
15 +
16 + for (var i = 0; i < blockCount; i++) {
17 + sha1String.push(shA1(buffer.slice(i * blockSize, (i + 1) * blockSize)));
18 + }
19 + function concatArr2Uint8(s) {//Array 2 Uint8Array
20 + var tmp = [];
21 + for (var i of s) tmp = tmp.concat(i);
22 + return new Uint8Array(tmp);
23 + }
24 + function Uint8ToBase64(u8Arr, urisafe) {//Uint8Array 2 Base64
25 + var CHUNK_SIZE = 0x8000; //arbitrary number
26 + var index = 0;
27 + var length = u8Arr.length;
28 + var result = '';
29 + var slice;
30 + while (index < length) {
31 + slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length));
32 + result += String.fromCharCode.apply(null, slice);
33 + index += CHUNK_SIZE;
34 + }
35 + return urisafe ? btoa(result).replace(/\//g, '_').replace(/\+/g, '-') : btoa(result);
36 + }
37 + function calcEtag() {
38 + if (!sha1String.length) return 'Fto5o-5ea0sNMlW_75VgGJCv2AcJ';
39 + var sha1Buffer = concatArr2Uint8(sha1String);
40 + // 如果大于4M,则对各个块的sha1结果再次sha1
41 + if (blockCount > 1) {
42 + prefix = 0x96;
43 + sha1Buffer = shA1(sha1Buffer.buffer);
44 + } else {
45 + sha1Buffer = Array.apply([], sha1Buffer);
46 + }
47 + sha1Buffer = concatArr2Uint8([[prefix], sha1Buffer]);
48 + return Uint8ToBase64(sha1Buffer, true);
49 + }
50 + return (calcEtag());
51 +}
52 +
53 +export { getEtag }
1 +/*
2 + * [js-sha1]{@link https://github.com/emn178/js-sha1}
3 + *
4 + * @version 0.6.0
5 + * @author Chen, Yi-Cyuan [emn178@gmail.com]
6 + * @copyright Chen, Yi-Cyuan 2014-2017
7 + * @license MIT
8 + */
9 +/*jslint bitwise: true */
10 +(function () {
11 + 'use strict';
12 +
13 + var root = typeof window === 'object' ? window : {};
14 + var NODE_JS = !root.JS_SHA1_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
15 + if (NODE_JS) {
16 + root = global;
17 + }
18 + var COMMON_JS = !root.JS_SHA1_NO_COMMON_JS && typeof module === 'object' && module.exports;
19 + var AMD = typeof define === 'function' && define.amd;
20 + var HEX_CHARS = '0123456789abcdef'.split('');
21 + var EXTRA = [-2147483648, 8388608, 32768, 128];
22 + var SHIFT = [24, 16, 8, 0];
23 + var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
24 +
25 + var blocks = [];
26 +
27 + var createOutputMethod = function (outputType) {
28 + return function (message) {
29 + return new Sha1(true).update(message)[outputType]();
30 + };
31 + };
32 +
33 + var createMethod = function () {
34 + var method = createOutputMethod('hex');
35 + if (NODE_JS) {
36 + method = nodeWrap(method);
37 + }
38 + method.create = function () {
39 + return new Sha1();
40 + };
41 + method.update = function (message) {
42 + return method.create().update(message);
43 + };
44 + for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
45 + var type = OUTPUT_TYPES[i];
46 + method[type] = createOutputMethod(type);
47 + }
48 + return method;
49 + };
50 +
51 + var nodeWrap = function (method) {
52 + var crypto = eval("require('crypto')");
53 + var Buffer = eval("require('buffer').Buffer");
54 + var nodeMethod = function (message) {
55 + if (typeof message === 'string') {
56 + return crypto.createHash('sha1').update(message, 'utf8').digest('hex');
57 + } else if (message.constructor === ArrayBuffer) {
58 + message = new Uint8Array(message);
59 + } else if (message.length === undefined) {
60 + return method(message);
61 + }
62 + return crypto.createHash('sha1').update(new Buffer(message)).digest('hex');
63 + };
64 + return nodeMethod;
65 + };
66 +
67 + function Sha1(sharedMemory) {
68 + if (sharedMemory) {
69 + blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
70 + blocks[4] = blocks[5] = blocks[6] = blocks[7] =
71 + blocks[8] = blocks[9] = blocks[10] = blocks[11] =
72 + blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
73 + this.blocks = blocks;
74 + } else {
75 + this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
76 + }
77 +
78 + this.h0 = 0x67452301;
79 + this.h1 = 0xEFCDAB89;
80 + this.h2 = 0x98BADCFE;
81 + this.h3 = 0x10325476;
82 + this.h4 = 0xC3D2E1F0;
83 +
84 + this.block = this.start = this.bytes = this.hBytes = 0;
85 + this.finalized = this.hashed = false;
86 + this.first = true;
87 + }
88 +
89 + Sha1.prototype.update = function (message) {
90 + if (this.finalized) {
91 + return;
92 + }
93 + var notString = typeof (message) !== 'string';
94 + if (notString && message.constructor === root.ArrayBuffer) {
95 + message = new Uint8Array(message);
96 + }
97 + var code, index = 0, i, length = message.length || 0, blocks = this.blocks;
98 +
99 + while (index < length) {
100 + if (this.hashed) {
101 + this.hashed = false;
102 + blocks[0] = this.block;
103 + blocks[16] = blocks[1] = blocks[2] = blocks[3] =
104 + blocks[4] = blocks[5] = blocks[6] = blocks[7] =
105 + blocks[8] = blocks[9] = blocks[10] = blocks[11] =
106 + blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
107 + }
108 +
109 + if (notString) {
110 + for (i = this.start; index < length && i < 64; ++index) {
111 + blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
112 + }
113 + } else {
114 + for (i = this.start; index < length && i < 64; ++index) {
115 + code = message.charCodeAt(index);
116 + if (code < 0x80) {
117 + blocks[i >> 2] |= code << SHIFT[i++ & 3];
118 + } else if (code < 0x800) {
119 + blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
120 + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
121 + } else if (code < 0xd800 || code >= 0xe000) {
122 + blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
123 + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
124 + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
125 + } else {
126 + code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
127 + blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
128 + blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
129 + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
130 + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
131 + }
132 + }
133 + }
134 +
135 + this.lastByteIndex = i;
136 + this.bytes += i - this.start;
137 + if (i >= 64) {
138 + this.block = blocks[16];
139 + this.start = i - 64;
140 + this.hash();
141 + this.hashed = true;
142 + } else {
143 + this.start = i;
144 + }
145 + }
146 + if (this.bytes > 4294967295) {
147 + this.hBytes += this.bytes / 4294967296 << 0;
148 + this.bytes = this.bytes % 4294967296;
149 + }
150 + return this;
151 + };
152 +
153 + Sha1.prototype.finalize = function () {
154 + if (this.finalized) {
155 + return;
156 + }
157 + this.finalized = true;
158 + var blocks = this.blocks, i = this.lastByteIndex;
159 + blocks[16] = this.block;
160 + blocks[i >> 2] |= EXTRA[i & 3];
161 + this.block = blocks[16];
162 + if (i >= 56) {
163 + if (!this.hashed) {
164 + this.hash();
165 + }
166 + blocks[0] = this.block;
167 + blocks[16] = blocks[1] = blocks[2] = blocks[3] =
168 + blocks[4] = blocks[5] = blocks[6] = blocks[7] =
169 + blocks[8] = blocks[9] = blocks[10] = blocks[11] =
170 + blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
171 + }
172 + blocks[14] = this.hBytes << 3 | this.bytes >>> 29;
173 + blocks[15] = this.bytes << 3;
174 + this.hash();
175 + };
176 +
177 + Sha1.prototype.hash = function () {
178 + var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4;
179 + var f, j, t, blocks = this.blocks;
180 +
181 + for (j = 16; j < 80; ++j) {
182 + t = blocks[j - 3] ^ blocks[j - 8] ^ blocks[j - 14] ^ blocks[j - 16];
183 + blocks[j] = (t << 1) | (t >>> 31);
184 + }
185 +
186 + for (j = 0; j < 20; j += 5) {
187 + f = (b & c) | ((~b) & d);
188 + t = (a << 5) | (a >>> 27);
189 + e = t + f + e + 1518500249 + blocks[j] << 0;
190 + b = (b << 30) | (b >>> 2);
191 +
192 + f = (a & b) | ((~a) & c);
193 + t = (e << 5) | (e >>> 27);
194 + d = t + f + d + 1518500249 + blocks[j + 1] << 0;
195 + a = (a << 30) | (a >>> 2);
196 +
197 + f = (e & a) | ((~e) & b);
198 + t = (d << 5) | (d >>> 27);
199 + c = t + f + c + 1518500249 + blocks[j + 2] << 0;
200 + e = (e << 30) | (e >>> 2);
201 +
202 + f = (d & e) | ((~d) & a);
203 + t = (c << 5) | (c >>> 27);
204 + b = t + f + b + 1518500249 + blocks[j + 3] << 0;
205 + d = (d << 30) | (d >>> 2);
206 +
207 + f = (c & d) | ((~c) & e);
208 + t = (b << 5) | (b >>> 27);
209 + a = t + f + a + 1518500249 + blocks[j + 4] << 0;
210 + c = (c << 30) | (c >>> 2);
211 + }
212 +
213 + for (; j < 40; j += 5) {
214 + f = b ^ c ^ d;
215 + t = (a << 5) | (a >>> 27);
216 + e = t + f + e + 1859775393 + blocks[j] << 0;
217 + b = (b << 30) | (b >>> 2);
218 +
219 + f = a ^ b ^ c;
220 + t = (e << 5) | (e >>> 27);
221 + d = t + f + d + 1859775393 + blocks[j + 1] << 0;
222 + a = (a << 30) | (a >>> 2);
223 +
224 + f = e ^ a ^ b;
225 + t = (d << 5) | (d >>> 27);
226 + c = t + f + c + 1859775393 + blocks[j + 2] << 0;
227 + e = (e << 30) | (e >>> 2);
228 +
229 + f = d ^ e ^ a;
230 + t = (c << 5) | (c >>> 27);
231 + b = t + f + b + 1859775393 + blocks[j + 3] << 0;
232 + d = (d << 30) | (d >>> 2);
233 +
234 + f = c ^ d ^ e;
235 + t = (b << 5) | (b >>> 27);
236 + a = t + f + a + 1859775393 + blocks[j + 4] << 0;
237 + c = (c << 30) | (c >>> 2);
238 + }
239 +
240 + for (; j < 60; j += 5) {
241 + f = (b & c) | (b & d) | (c & d);
242 + t = (a << 5) | (a >>> 27);
243 + e = t + f + e - 1894007588 + blocks[j] << 0;
244 + b = (b << 30) | (b >>> 2);
245 +
246 + f = (a & b) | (a & c) | (b & c);
247 + t = (e << 5) | (e >>> 27);
248 + d = t + f + d - 1894007588 + blocks[j + 1] << 0;
249 + a = (a << 30) | (a >>> 2);
250 +
251 + f = (e & a) | (e & b) | (a & b);
252 + t = (d << 5) | (d >>> 27);
253 + c = t + f + c - 1894007588 + blocks[j + 2] << 0;
254 + e = (e << 30) | (e >>> 2);
255 +
256 + f = (d & e) | (d & a) | (e & a);
257 + t = (c << 5) | (c >>> 27);
258 + b = t + f + b - 1894007588 + blocks[j + 3] << 0;
259 + d = (d << 30) | (d >>> 2);
260 +
261 + f = (c & d) | (c & e) | (d & e);
262 + t = (b << 5) | (b >>> 27);
263 + a = t + f + a - 1894007588 + blocks[j + 4] << 0;
264 + c = (c << 30) | (c >>> 2);
265 + }
266 +
267 + for (; j < 80; j += 5) {
268 + f = b ^ c ^ d;
269 + t = (a << 5) | (a >>> 27);
270 + e = t + f + e - 899497514 + blocks[j] << 0;
271 + b = (b << 30) | (b >>> 2);
272 +
273 + f = a ^ b ^ c;
274 + t = (e << 5) | (e >>> 27);
275 + d = t + f + d - 899497514 + blocks[j + 1] << 0;
276 + a = (a << 30) | (a >>> 2);
277 +
278 + f = e ^ a ^ b;
279 + t = (d << 5) | (d >>> 27);
280 + c = t + f + c - 899497514 + blocks[j + 2] << 0;
281 + e = (e << 30) | (e >>> 2);
282 +
283 + f = d ^ e ^ a;
284 + t = (c << 5) | (c >>> 27);
285 + b = t + f + b - 899497514 + blocks[j + 3] << 0;
286 + d = (d << 30) | (d >>> 2);
287 +
288 + f = c ^ d ^ e;
289 + t = (b << 5) | (b >>> 27);
290 + a = t + f + a - 899497514 + blocks[j + 4] << 0;
291 + c = (c << 30) | (c >>> 2);
292 + }
293 +
294 + this.h0 = this.h0 + a << 0;
295 + this.h1 = this.h1 + b << 0;
296 + this.h2 = this.h2 + c << 0;
297 + this.h3 = this.h3 + d << 0;
298 + this.h4 = this.h4 + e << 0;
299 + };
300 +
301 + Sha1.prototype.hex = function () {
302 + this.finalize();
303 +
304 + var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4;
305 +
306 + return HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
307 + HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
308 + HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
309 + HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
310 + HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
311 + HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
312 + HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
313 + HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
314 + HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
315 + HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
316 + HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
317 + HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
318 + HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F] +
319 + HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
320 + HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
321 + HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
322 + HEX_CHARS[(h4 >> 28) & 0x0F] + HEX_CHARS[(h4 >> 24) & 0x0F] +
323 + HEX_CHARS[(h4 >> 20) & 0x0F] + HEX_CHARS[(h4 >> 16) & 0x0F] +
324 + HEX_CHARS[(h4 >> 12) & 0x0F] + HEX_CHARS[(h4 >> 8) & 0x0F] +
325 + HEX_CHARS[(h4 >> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F];
326 + };
327 +
328 + Sha1.prototype.toString = Sha1.prototype.hex;
329 +
330 + Sha1.prototype.digest = function () {
331 + this.finalize();
332 +
333 + var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4;
334 +
335 + return [
336 + (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, h0 & 0xFF,
337 + (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, h1 & 0xFF,
338 + (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, h2 & 0xFF,
339 + (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, h3 & 0xFF,
340 + (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, h4 & 0xFF
341 + ];
342 + };
343 +
344 + Sha1.prototype.array = Sha1.prototype.digest;
345 +
346 + Sha1.prototype.arrayBuffer = function () {
347 + this.finalize();
348 +
349 + var buffer = new ArrayBuffer(20);
350 + var dataView = new DataView(buffer);
351 + dataView.setUint32(0, this.h0);
352 + dataView.setUint32(4, this.h1);
353 + dataView.setUint32(8, this.h2);
354 + dataView.setUint32(12, this.h3);
355 + dataView.setUint32(16, this.h4);
356 + return buffer;
357 + };
358 +
359 + var exports = createMethod();
360 +
361 + if (COMMON_JS) {
362 + module.exports = exports;
363 + } else {
364 + root.sha1 = exports;
365 + if (AMD) {
366 + define(function () {
367 + return exports;
368 + });
369 + }
370 + }
371 +})();
1 +/*
2 + * @Date: 2022-04-18 15:59:42
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2023-02-24 16:13:06
5 + * @FilePath: /data-table/src/utils/tools.js
6 + * @Description: 文件描述
7 + */
8 +import dayjs from 'dayjs';
9 +
10 +// 格式化时间
11 +const formatDate = (date) => {
12 + return dayjs(date).format('YYYY-MM-DD HH:mm');
13 +};
14 +
15 +/**
16 + * @description 判断浏览器属于平台
17 + * @returns
18 + */
19 +const wxInfo = () => {
20 + let u = navigator.userAgent;
21 + let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器
22 + let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
23 + let isMobile = u.indexOf('Android') > -1 || u.indexOf('iPhone') > -1 || u.indexOf('iPad') > -1; // 移动端平台
24 + let isIpad = u.indexOf('iPad') > -1; // iPad平台
25 + let uAgent = navigator.userAgent.toLowerCase();
26 + let isWeiXin = (uAgent.match(/MicroMessenger/i) == 'micromessenger') ? true : false;
27 + let isPC = (uAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone|micromessenger)/i)) ? false : true;
28 + return {
29 + isAndroid,
30 + isiOS,
31 + isWeiXin,
32 + isMobile,
33 + isIpad,
34 + isPC
35 + };
36 +};
37 +
38 +/**
39 + * @description 判断多行省略文本
40 + * @param {*} id 目标dom标签
41 + * @returns
42 + */
43 +const hasEllipsis = (id) => {
44 + let oDiv = document.getElementById(id);
45 + let flag = false;
46 + if (oDiv.scrollHeight > oDiv.clientHeight) {
47 + flag = true
48 + }
49 + return flag
50 +}
51 +
52 +/**
53 + * @description 解析URL参数
54 + * @param {*} url
55 + * @returns
56 + */
57 +const parseQueryString = url => {
58 + var json = {};
59 + var arr = url.indexOf('?') >= 0 ? url.substr(url.indexOf('?') + 1).split('&') : [];
60 + arr.forEach(item => {
61 + var tmp = item.split('=');
62 + json[tmp[0]] = decodeURIComponent(tmp[1]);
63 + });
64 + return json;
65 +}
66 +
67 +/**
68 + * 字符串包含字符数组中字符的状态
69 + * @param {*} array 字符数组
70 + * @param {*} str 字符串
71 + * @returns 包含状态
72 + */
73 +const strExist = (array, str) => {
74 + const exist = array.filter(arr => {
75 + if (str.indexOf(arr) >= 0) return str;
76 + })
77 + return exist.length > 0
78 +}
79 +
80 +/**
81 + * 自定义替换参数
82 + * @param {*} url
83 + * @param {*} arg
84 + * @param {*} arg_val
85 + * @returns
86 + */
87 +const changeURLArg = (url, arg, arg_val) => {
88 + var pattern = arg + '=([^&]*)';
89 + var replaceText = arg + '=' + arg_val;
90 + if (url.match(pattern)) {
91 + var tmp = '/(' + arg + '=)([^&]*)/gi';
92 + tmp = url.replace(eval(tmp), replaceText);
93 + return tmp;
94 + } else {
95 + if (url.match('[\?]')) {
96 + return url + '&' + replaceText;
97 + } else {
98 + return url + '?' + replaceText;
99 + }
100 + }
101 + return url + '\n' + arg + '\n' + arg_val;
102 +}
103 +
104 +// 获取参数key/value值对
105 +const getUrlParams = (url) => {
106 + // 没有参数处理
107 + if (url.split('?').length === 1) return false;
108 + let arr = url.split('?');
109 + let res = arr[1].split('&');
110 + let items = {};
111 + for (let i = 0; i < res.length; i++) {
112 + let [key, value] = res[i].split('=');
113 + items[key] = value;
114 + }
115 + return items
116 +}
117 +
118 +// 格式化URL参数为字符串
119 +const stringifyQuery = (params) => {
120 + const queryString = [];
121 + Object.keys(params || {}).forEach((k) => {
122 + queryString.push(k + '=' + params[k]);
123 + });
124 +
125 + return '?' + queryString.join('&');
126 +};
127 +
128 +export {
129 + formatDate,
130 + wxInfo,
131 + hasEllipsis,
132 + parseQueryString,
133 + strExist,
134 + changeURLArg,
135 + getUrlParams,
136 + stringifyQuery,
137 +};
1 +import VConsole from 'vconsole';
2 +
3 +// const vConsole = new VConsole();
4 +let vConsole = '';
5 +// 或者使用配置参数来初始化,详情见文档
6 +if (+import.meta.env.VITE_CONSOLE) {
7 + vConsole = new VConsole({ theme: 'dark' });
8 +}
9 +
10 +export default vConsole
1 +/*
2 + * @Date: 2024-02-06 11:38:13
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-02-06 13:04:25
5 + * @FilePath: /xysBooking/src/utils/versionUpdater.js
6 + * @Description:
7 + */
8 +/* eslint-disable */
9 +/**
10 + * @description: 版本更新检查
11 + * @param {*} time 阈值
12 + * @return {*}
13 + */
14 +export class Updater {
15 + constructor(options = {}) {
16 + this.oldScript = [];
17 + this.newScript = [];
18 + this.dispatch = {};
19 + this.init(); //初始化
20 + this.timing(options.time); //轮询
21 + }
22 +
23 + async init() {
24 + const html = await this.getHtml();
25 + this.oldScript = this.parserScript(html);
26 + }
27 +
28 + async getHtml() {
29 + // TAG: html的位置需要动态修改
30 + const html = await fetch(import.meta.env.VITE_BASE).then((res) => res.text()); //读取index html
31 + return html;
32 + }
33 +
34 + parserScript(html) {
35 + const reg = new RegExp(/<script(?:\s+[^>]*)?>(.*?)<\/script\s*>/gi); //script正则
36 + return html.match(reg); //匹配script标签
37 + }
38 +
39 + //发布订阅通知
40 + on(key, fn) {
41 + (this.dispatch[key] || (this.dispatch[key] = [])).push(fn);
42 + return this;
43 + }
44 +
45 + compare(oldArr, newArr) {
46 + const base = oldArr.length;
47 + // 去重
48 + const arr = Array.from(new Set(oldArr.concat(newArr)));
49 + //如果新旧length 一样无更新
50 + if (arr.length === base) {
51 + this.dispatch['no-update'].forEach((fn) => {
52 + fn();
53 + });
54 + } else {
55 + //否则通知更新
56 + this.dispatch['update'].forEach((fn) => {
57 + fn();
58 + });
59 + }
60 + }
61 +
62 + timing(time = 10000) {
63 + //轮询
64 + setInterval(async () => {
65 + const newHtml = await this.getHtml();
66 + this.newScript = this.parserScript(newHtml);
67 + this.compare(this.oldScript, this.newScript);
68 + }, time);
69 + }
70 +}
1 +<!--
2 + * @Date: 2022-06-29 18:18:02
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-06-29 18:18:09
5 + * @FilePath: /tswj/src/views/test/404.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <div class="">404</div>
10 +</template>
11 +
12 +<script setup>
13 +import { ref } from 'vue'
14 +import { useRoute, useRouter } from 'vue-router'
15 +
16 +import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js'
17 +//import { } from '@/utils/generateModules.js'
18 +//import { } from '@/utils/generateIcons.js'
19 +//import { } from '@/composables'
20 +const $route = useRoute();
21 +const $router = useRouter();
22 +useTitle($route.meta.title);
23 +
24 +</script>
25 +
26 +<style lang="less" scoped>
27 +
28 +</style>
1 +<template>
2 + <div />
3 +</template>
4 +
5 +<script setup lang="ts">
6 +// 类装饰器、方法装饰器、属性装饰器、参数装饰器
7 +// function addAge(constructor: Function) {
8 +// constructor.prototype.age = 18
9 +// }
10 +// @addAge
11 +// class Person {
12 +// name: string;
13 +// age!: number;
14 +// constructor() {
15 +// this.name = 'abc'
16 +// }
17 +// say () {
18 +// console.warn('xxx')
19 +// }
20 +// }
21 +// let person = new Person();
22 +// console.warn(person);
23 +// 属性/方法装饰器
24 +// 声明装饰器修饰方法
25 +// function method(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
26 +// console.warn(target);
27 +// console.warn('prop ' + propertyKey);
28 +// console.warn('desc ' + JSON.stringify(descriptor));
29 +// descriptor.writable = false;
30 +// }
31 +// // 声明装饰器修饰属性
32 +// function prop(target: any, key: string): any {
33 +// console.warn(target);
34 +// console.warn('prop ' + key);
35 +// const descriptor: PropertyDescriptor = {
36 +// writable: true,
37 +// configurable: true,
38 +// enumerable: true,
39 +// value: 'abc'
40 +// };
41 +// return descriptor;
42 +// }
43 +// // 类
44 +// class Person {
45 +// // @prop
46 +// name: string;
47 +// constructor() {
48 +// this.name = 'xxx'
49 +// }
50 +// @method
51 +// say() {
52 +// return 'instance method'
53 +// }
54 +// @method
55 +// static run() {
56 +// return 'static method'
57 +// }
58 +// }
59 +// const person = new Person()
60 +// person.name
61 +// Person.run()
62 +// 参数装饰器
63 +// function logParameter(target: Object, propertyKey: string, index: number) {
64 +// console.log(target, propertyKey, index);
65 +// }
66 +
67 +// class Person {
68 +// greet(@logParameter message: string, @logParameter name: string): string {
69 +// return `${message} ${name}`;
70 +// }
71 +// }
72 +// const p = new Person('');
73 +// p.greet('hello', 'randy');
74 +// class Person {
75 +// name = 'abc'
76 +// constructor (name) {
77 +// this.name = name;
78 +// }
79 +// say() {
80 +// console.warn('');
81 +// }
82 +// }
83 +// import Person from '@/Person'
84 +// class Son extends Person {
85 +// say () {
86 +// return ''
87 +// }
88 +// }
89 +// const person = new Son('')
90 +// console.warn(person);
91 +// type E3 = NonNullable<string | number | null | undefined>
92 +// // let e1: E3 = 1
93 +// let e2: E3 = undefined
94 +// console.warn(e2);
95 +// function getUserInfo () {
96 +// return 'abc'
97 +// }
98 +// type E = ReturnType<typeof getUserInfo>
99 +// const user: E = {}
100 +// console.warn(user);
101 +// interface A {
102 +// a: string;
103 +// b: number;
104 +// d: boolean;
105 +// }
106 +// type aPartial = Partial<A>
107 +// type Point = 'x';
108 +// type PointList = Record<Point, { key: number }>
109 +// const z: PointList = {
110 +// x: {
111 +// key: 1
112 +// }
113 +// }
114 +</script>
115 +
116 +<style lang="less" scoped>
117 +</style>
1 +<!--
2 + * @Date: 2022-08-29 13:55:31
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-12-06 20:56:54
5 + * @FilePath: /data-table/src/views/auth.vue
6 + * @Description: 授权模块
7 +-->
8 +<template>
9 + <div />
10 +</template>
11 +
12 +<script setup>
13 +import { onMounted } from 'vue'
14 +import { useRoute } from 'vue-router'
15 +
16 +const $route = useRoute();
17 +
18 +onMounted(() => {
19 + // php需要先跳转链接获取openid
20 + /**
21 + * encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
22 + * 该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。
23 + * 其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
24 + */
25 + let raw_url = encodeURIComponent(location.origin + location.pathname + $route.query.href); // 未授权的地址
26 + // TAG: 开发环境测试数据
27 + const short_url = `/srv/?f=custom_form&a=openid&res=${raw_url}&form_code=${$route.query.code}`;
28 + location.href = import.meta.env.DEV
29 + ? `${short_url}&openid=${import.meta.env.VITE_OPENID}`
30 + : `${short_url}`;
31 +})
32 +</script>
1 +<!--
2 + * @Date: 2024-07-23 10:34:37
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-09-06 17:35:34
5 + * @FilePath: /custom_table/src/views/index.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <el-table :data="tableData" style="width: 100%">
10 + <el-table-column prop="date" label="Date" width="180" />
11 + <el-table-column prop="name" label="Name" width="180" />
12 + <el-table-column prop="address" label="Address" />
13 + </el-table>
14 +</template>
15 +
16 +<script setup>
17 +import { ref } from 'vue'
18 +import { useRoute, useRouter } from 'vue-router'
19 +
20 +import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js'
21 +//import { } from '@/utils/generateModules.js'
22 +//import { } from '@/utils/generateIcons.js'
23 +//import { } from '@/composables'
24 +const $route = useRoute();
25 +const $router = useRouter();
26 +useTitle($route.meta.title);
27 +
28 +const tableData = [
29 + {
30 + date: '2016-05-03',
31 + name: 'Tom',
32 + address: 'No. 189, Grove St, Los Angeles',
33 + },
34 + {
35 + date: '2016-05-02',
36 + name: 'Tom',
37 + address: 'No. 189, Grove St, Los Angeles',
38 + },
39 + {
40 + date: '2016-05-04',
41 + name: 'Tom',
42 + address: 'No. 189, Grove St, Los Angeles',
43 + },
44 + {
45 + date: '2016-05-01',
46 + name: 'Tom',
47 + address: 'No. 189, Grove St, Los Angeles',
48 + },
49 +]
50 +
51 +</script>
52 +
53 +<style lang="less" scoped>
54 +
55 +</style>
1 +<!--
2 + * @Date: 2022-06-29 18:18:02
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-07-22 13:24:19
5 + * @FilePath: /data-table/src/views/no_auth.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <div class="table-box" :style="{ margin: is_pc ? '1rem 0' : '1rem', overflow: 'auto' }">
10 + <div class="text-box">
11 + <van-icon name="warning" color="red" size="1.25rem" />&nbsp;您暂无权限访问该页面
12 + </div>
13 + <div style="font-size: 15px; color: #525967; text-align: center; margin: 1rem auto;">{{ formSetting.auth_error }}</div>
14 + </div>
15 +</template>
16 +
17 +<script setup>
18 +import { ref } from 'vue'
19 +import { useRoute, useRouter } from 'vue-router'
20 +
21 +import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js'
22 +//import { } from '@/utils/generateModules.js'
23 +//import { } from '@/utils/generateIcons.js'
24 +//import { } from '@/composables'
25 +import { styleColor } from "@/constant.js";
26 +import { wxInfo, getUrlParams } from "@/utils/tools";
27 +
28 +const $route = useRoute();
29 +const $router = useRouter();
30 +useTitle($route.meta.title);
31 +
32 +// 获取表单设置
33 +const store = mainStore();
34 +const { formSetting } = storeToRefs(store);
35 +
36 +const is_pc = computed(() => wxInfo().isPC);
37 +
38 +onMounted(() => {
39 + // TAG: 全局背景色
40 + document
41 + .querySelector("body")
42 + .setAttribute("style", `background-color: ${styleColor.backgroundColor}`);
43 +})
44 +
45 +</script>
46 +
47 +<style lang="less" scoped>
48 +.table-box {
49 + background-color: #ffffff;
50 + padding: 1rem;
51 + border-radius: 5px;
52 + max-width: 800px;
53 + min-width: 20rem;
54 + .text-box {
55 + text-align: center;
56 + color: red;
57 + overflow: hidden;
58 + }
59 +}
60 +</style>
1 +<!--
2 + * @Date: 2022-06-29 18:18:02
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-06-29 18:18:09
5 + * @FilePath: /tswj/src/views/test/404.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <div class="stop-page">
10 + <div style="padding-top: 2rem; padding-bottom: 2rem; text-align: center">
11 + <van-image
12 + round
13 + width="10rem"
14 + height="10rem"
15 + style="vertical-align: bottom"
16 + :src="icon_success"
17 + />
18 + <p style="font-size: 1.05rem; margin: 0.5rem; font-weight: bold">
19 + <span v-if="status === 'apply'">表单未开始</span>
20 + <span v-if="status === 'finish'">表单已结束</span>
21 + <span v-if="status === 'disable'">表单已关闭</span>
22 + </p>
23 + <!-- <p style="font-size: 0.9rem; margin-bottom: 0.5rem">您的作品正在审核中</p> -->
24 + <!-- <p style="font-size: 0.9rem">请耐心等待~~</p> -->
25 + </div>
26 + <!-- <div style="padding: 0 15% 1rem 15%">
27 + <div class="button-plain" :style="styleObj" @click="handle">返回</div>
28 + </div> -->
29 + </div>
30 +</template>
31 +
32 +<script setup>
33 +import { ref } from "vue";
34 +import { useRoute, useRouter } from "vue-router";
35 +import { styleColor } from "@/constant.js";
36 +import icon_success from "@images/que-sucess@2x.png";
37 +
38 +import {
39 + Cookies,
40 + $,
41 + _,
42 + axios,
43 + storeToRefs,
44 + mainStore,
45 + Toast,
46 + useTitle,
47 +} from "@/utils/generatePackage.js";
48 +//import { } from '@/utils/generateModules.js'
49 +//import { } from '@/utils/generateIcons.js'
50 +//import { } from '@/composables'
51 +const $route = useRoute();
52 +const $router = useRouter();
53 +useTitle($route.meta.title);
54 +
55 +const styleObj = {
56 + background: styleColor.baseColor,
57 + border: styleColor.baseColor,
58 + color: "#FFFFFF",
59 +};
60 +
61 +const status = $route.query.status;
62 +
63 +onMounted(() => {});
64 +
65 +const handle = () => {
66 + $router.go(-1);
67 +};
68 +</script>
69 +
70 +<style lang="less" scoped>
71 +.stop-page {
72 + .button-plain {
73 + width: auto;
74 + height: auto;
75 + text-align: center;
76 + padding: 0.6rem;
77 + margin: 0.5rem;
78 + font-size: 1rem;
79 + // background: @base-font-color;
80 + border-radius: 24px;
81 + // border: 1px solid @base-color;
82 + // color: @base-color;
83 + font-weight: bold;
84 + }
85 +}
86 +</style>
1 +<!--
2 + * @Date: 2022-06-29 18:18:02
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-08-02 18:44:30
5 + * @FilePath: /temple_material_request/src/views/success.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <div class="success-page">
10 + <div class="text-wrapper">
11 + <van-image
12 + width="15rem"
13 + height="10rem"
14 + style="vertical-align: bottom"
15 + :src="icon_success"
16 + />
17 + <div style="font-size: 1.5rem; color: #A67939; margin-top: 2rem;">物资申领成功</div>
18 + </div>
19 + <div style="border: 1px dashed #A67939;"></div>
20 + <div style="padding: 3rem 4rem;">
21 + <van-button plain block :color="styleColor.baseColor" style="margin-bottom: 1.5rem;" @click="goTo('activity')">回到活动主页</van-button>
22 + <van-button plain block :color="styleColor.baseColor" @click="goTo('home')">返回首页</van-button>
23 + </div>
24 + </div>
25 +</template>
26 +
27 +<script setup>
28 +import { ref } from "vue";
29 +import { useRoute, useRouter } from "vue-router";
30 +import { styleColor } from "@/constant.js";
31 +import icon_success from "@images/que-sucess@2x.png";
32 +
33 +import {
34 + Cookies,
35 + $,
36 + _,
37 + axios,
38 + storeToRefs,
39 + mainStore,
40 + Toast,
41 + useTitle,
42 +} from "@/utils/generatePackage.js";
43 +//import { } from '@/utils/generateModules.js'
44 +//import { } from '@/utils/generateIcons.js'
45 +//import { } from '@/composables'
46 +const $route = useRoute();
47 +const $router = useRouter();
48 +useTitle($route.meta.title);
49 +
50 +const activity_id = $route.query.activity_id ? $route.query.activity_id : '';
51 +const form_id = $route.query.form_id ? $route.query.form_id : '';
52 +const client_id = $route.query.client_id ? $route.query.client_id : '';
53 +
54 +const styleObj = {
55 + background: styleColor.baseColor,
56 + border: styleColor.baseColor,
57 + color: "#FFFFFF",
58 +};
59 +
60 +onMounted(() => {
61 + $('body').css('backgroundColor', 'white');
62 +});
63 +
64 +const handle = () => {
65 + $router.go(-1);
66 +};
67 +
68 +const goTo = (type) => {
69 + if (type === 'home') { // 返回首页
70 + location.href = `../../../?p=volunteer_home&t=volunteer&c=${client_id}`;
71 + } else { // 返回活动主页
72 + location.href = `../?p=activity&form_id=${form_id}&i=${activity_id}`;
73 + }
74 +}
75 +</script>
76 +
77 +<style lang="less" scoped>
78 +.success-page {
79 + .text-wrapper {
80 + padding-top: 2rem;
81 + padding-bottom: 2rem;
82 + text-align: center;
83 + .name {
84 + font-size: 1.25rem;
85 + margin: 0.5rem;
86 + font-weight: bold;
87 + }
88 + .text {
89 + font-size: 1.05rem;
90 + margin: 0.5rem;
91 + font-weight: bold;
92 + }
93 + }
94 + .rich-text {
95 + padding: 1rem 2rem;
96 + white-space: pre-wrap;
97 + :deep(img) {
98 + width: 100%;
99 + }
100 + }
101 + .button-plain {
102 + width: auto;
103 + height: auto;
104 + text-align: center;
105 + padding: 0.6rem;
106 + margin: 0.5rem;
107 + font-size: 1rem;
108 + // background: @base-font-color;
109 + border-radius: 24px;
110 + // border: 1px solid @base-color;
111 + // color: @base-color;
112 + font-weight: bold;
113 + }
114 +}
115 +</style>
1 +<!--
2 + * @Date: 2024-07-23 10:29:03
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-07-26 18:02:58
5 + * @FilePath: /temple_material_request/src/views/test.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <div class="tinymce-box">
10 + <!-- <TEditor ref="refEdit" ></TEditor> -->
11 + <div @click="getValue">获取内容</div>
12 + <div @click="setValue">设置内容</div>
13 + </div>
14 +</template>
15 +
16 +<script setup>
17 + // import TEditor from "@/components/TEditor/index.vue";
18 +
19 + const refEdit = ref(null);
20 +
21 + // refEdit.value.handleGetContent()
22 + const getValue = () => {
23 + console.warn(refEdit.value.handleGetContent());
24 + }
25 +
26 + const setValue = () => {
27 + refEdit.value.handleSetContent('<p>test</p>')
28 + }
29 +</script>
30 +
31 +<style>
32 +.tinymce-box {
33 + width: 100%;
34 +}
35 +</style>
1 +{
2 + "compilerOptions": {
3 + /* 基本选项 */
4 + "target": "esnext", // 指定 ECMAScript 目标版本: 'ES3' (default), 'ES5', 'ES6'/'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'
5 + "module": "CommonJS", // 指定使用模块: 'commonjs', 'amd', 'system', 'umd' or 'es2015'
6 + "lib": [ // 指定要包含在编译中的库文件
7 + "esnext",
8 + "dom",
9 + "dom.iterable",
10 + "scripthost"
11 + ],
12 + "allowJs": true, // 允许编译 javascript 文件
13 + // "checkJs": true, // 报告 javascript 文件中的错误
14 + "jsx": "preserve", // 指定 jsx 代码的生成: 'preserve', 'react-native', or 'react'
15 + // "declaration": true, // 生成相应的 '.d.ts' 文件
16 + // "sourceMap": true, // 生成相应的 '.map' 文件
17 + // "outFile": "./", // 将输出文件合并为一个文件
18 + "outDir": "./", // 指定输出目录
19 + // "rootDir": "./", // 用来控制输出目录结构 --outDir.
20 + "removeComments": true, // 删除编译后的所有的注释
21 + // "noEmit": true, // 不生成输出文件
22 + "importHelpers": true, // tslib 导入辅助工具函数
23 + "isolatedModules": false, // 将每个文件做为单独的模块 (与 'ts.transpileModule' 类似)
24 +
25 + /* 严格的类型检查选项 */
26 + "strict": true, // 启用所有严格类型检查选项
27 + // "noImplicitAny": true, // 在表达式和声明上有隐含的 any类型时报错
28 + // "strictNullChecks": true, // 启用严格的 null 检查
29 + // "noImplicitThis": true, // this 表达式值为 any 类型的时候,生成一个错误
30 + // "alwaysStrict": true, // 以严格模式检查每个模块,并在每个文件里加入 'use strict'
31 +
32 + /* 额外的检查 */
33 + "noUnusedLocals": true, // 有未使用的变量时,抛出错误
34 + "noUnusedParameters": true, // 有未使用的参数时,抛出错误
35 + "noImplicitReturns": true, // 并不是所有函数里的代码都有返回值时,抛出错误
36 + "noFallthroughCasesInSwitch": true, // 报告 switch 语句的 fallthrough 错误。(即,不允许 switch case 语句贯穿)
37 +
38 + /* 模块解析选项 */
39 + "moduleResolution": "node", // 选择模块解析策略: 'node' (Node.js) or 'classic' (TypeScript pre-1.6)
40 + "baseUrl": ".", // 用于解析非相对模块名称的基目录
41 + "paths": { // 模块名到基于 baseUrl 的路径映射的列表
42 + "@/*": [
43 + "src/*"
44 + ]
45 + },
46 + // "rootDirs": [], // 根文件夹列表,其组合内容表示项目运行时的结构内容
47 + // "typeRoots": [], // 包含类型声明的文件列表
48 + "types": [ // 需要包含的类型声明文件名列表
49 + // "webpack-env",
50 + "vite/client",
51 + "lodash",
52 + "moment",
53 + "node",
54 + "jquery",
55 + "element-plus/global"
56 + ],
57 + "allowSyntheticDefaultImports": true, // 允许从没有设置默认导出的模块中默认导入。
58 +
59 + /* Source Map Options */
60 + // "sourceRoot": "./", // 指定调试器应该找到 TypeScript 文件而不是源文件的位置
61 + // "mapRoot": "./", // 指定调试器应该找到映射文件而不是生成文件的位置
62 + // "inlineSourceMap": true, // 生成单个 sourcemaps 文件,而不是将 sourcemaps 生成不同的文件
63 + // "inlineSources": true, // 将代码与 sourcemaps 生成到一个文件中,要求同时设置了 --inlineSourceMap --sourceMap 属性
64 +
65 + /* 其他选项 */
66 + "experimentalDecorators": true, // 启用装饰器
67 + // "emitDecoratorMetadata": true, // 为装饰器提供元数据的支持
68 +
69 + "esModuleInterop": true, // 可以在es6中导入commonjs
70 + },
71 + "include": [
72 + "src/**/*"
73 + ],
74 + "exclude": [
75 + "node_modules",
76 + "dist"
77 + ],
78 + "vueCompilerOptions": {
79 + "target": 2,
80 + "experimentalSuppressInvalidJsxElementTypeErrors": true
81 + }
82 +}
1 +{
2 + "defaultSeverity": "warning",
3 + "extends": [
4 + "tslint:recommended"
5 + ],
6 + "linterOptions": {
7 + "exclude": [
8 + "node_modules/**"
9 + ]
10 + },
11 + "rules": {
12 + "quotemark": [
13 + true,
14 + "single"
15 + ],
16 + "indent": [
17 + true,
18 + "spaces",
19 + 2
20 + ],
21 + "interface-name": false,
22 + "ordered-imports": false,
23 + "object-literal-sort-keys": false,
24 + "no-consecutive-blank-lines": false,
25 + "no-console": true
26 + }
27 +}
1 +/*
2 + * @Date: 2022-06-13 10:39:44
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-06-13 10:41:43
5 + * @FilePath: /tswj/typings/index.d.ts
6 + * @Description: 文件描述
7 + */
8 +export {};
9 +
10 +// => 全局类型声明
11 +declare global {
12 + interface Window {
13 + _hmt: any;
14 + wx: any;
15 + AlipayJSBridge: any;
16 + }
17 + namespace GD {
18 + interface BaseResponse<T = any> {
19 + code: number;
20 + data: T;
21 + msg: string;
22 + page: {
23 + pageNo: number;
24 + pageSize: number;
25 + pages: number;
26 + total: number;
27 + };
28 + }
29 + }
30 +}
31 +
32 +// const response = GD.BaseResponse<{name: string}>
1 +import vue from '@vitejs/plugin-vue';
2 +import dynamicImport from 'vite-plugin-dynamic-import';
3 +// import legacy from '@vitejs/plugin-legacy';
4 +// import styleImport, { VantResolve } from 'vite-plugin-style-import';
5 +import Components from 'unplugin-vue-components/vite';
6 +// import { VantResolver } from 'unplugin-vue-components/resolvers';
7 +import { defineConfig, loadEnv } from 'vite';
8 +import { createProxy } from './build/proxy'
9 +import DefineOptions from 'unplugin-vue-define-options/vite';
10 +import AutoImport from 'unplugin-auto-import/vite';
11 +import postcsspxtoviewport from 'postcss-px-to-viewport'
12 +
13 +var path = require('path');
14 +
15 +export default ({ command, mode }) => {
16 + const root = process.cwd();
17 +
18 + const viteEnv = loadEnv(mode, root);
19 + // let isProd = (command === 'serve'); // 情景配置是否为开发模式 serve 或 build
20 +
21 + return defineConfig({
22 + // root: '',
23 + // root: './src/packages', // 多页面应用配置入口根目录
24 + base: viteEnv.VITE_BASE, // 开发或生产环境服务的公共基础路径。
25 + // base: isProd ? '/' : '/f/voice/', // 开发或生产环境服务的公共基础路径。
26 + // mode: '', // 在配置中指明将会把 serve 和 build 时的模式 都 覆盖掉。也可以通过命令行 --mode 选项来重写。
27 + // define: '', // 定义全局常量替换方式。其中每项在开发环境下会被定义在全局,而在构建时被静态替换。
28 + plugins: [ // 将要用到的插件数组。Falsy 虚值的插件将被忽略,插件数组将被扁平化(flatten)。查看 插件 API 获取 Vite 插件的更多细节。
29 + vue(),
30 + // Components({
31 + // // resolvers: [VantResolver()],
32 + // }),
33 + // styleImport({
34 + // resolves: [VantResolve()],
35 + // libs: [
36 + // {
37 + // libraryName: 'vant',
38 + // esModule: true,
39 + // resolveStyle: name => `../es/${name}/style`
40 + // }
41 + // ]
42 + // }), // 按需引入 vant 位置报错问题
43 + dynamicImport(), // 增强 Vite 内置的 dynamic import, 支持在 import() 中使用别名
44 + // legacy({
45 + // targets: ['defaults', 'not IE 11']
46 + // }), // Vite 的默认旧版浏览器支持时提供此插件本机ESM的支持。
47 + DefineOptions(), // TAG: 插件来对组件名进行注册的, 解决setup没法写name的问题
48 + AutoImport({ // API 自动导入
49 + // 可以自定义文件生成的位置,默认是根目录下,使用ts的建议放src目录下
50 + dts: 'src/auto-imports.d.ts',
51 + imports: ['vue', 'vue-router'],
52 + // 解决eslint报错问题
53 + eslintrc: {
54 + enabled: true
55 + }
56 + }),
57 + ],
58 + publicDir: 'public', // 作为静态资源服务的文件夹。这个目录中的文件会在开发中被服务于 /,在开发模式时,会被拷贝到 outDir 的根目录,并没有转换,永远只是复制到这里。该值可以是文件系统的绝对路径,也可以是相对于项目的根目录路径。
59 + // cacheDir: '', // 存储缓存文件的目录。此目录下会存储预打包的依赖项或 vite 生成的某些缓存文件,使用缓存可以提高性能。如需重新生成缓存文件,你可以使用 --force 命令行选项或手动删除目录。此选项的值可以是文件的绝对路径,也可以是以项目根目录为基准的相对路径。
60 + resolve: {
61 + alias: { // 将会被传递到 @rollup/plugin-alias 作为 entries 的选项。也可以是一个对象,或一个 { find, replacement } 的数组. 当使用文件系统路径的别名时,请始终使用绝对路径。相对路径的别名值会被原封不动地使用,因此无法被正常解析。 更高级的自定义解析方法可以通过 插件 实现。
62 + "@": path.resolve(__dirname, "src"),
63 + "@components": path.resolve(__dirname, "src/components"),
64 + "@composables": path.resolve(__dirname, "src/composables"),
65 + "@utils": path.resolve(__dirname, "src/utils"),
66 + "@images": path.resolve(__dirname, "src/assets/images"),
67 + "@css": path.resolve(__dirname, "src/assets/css"),
68 + "@mock": path.resolve(__dirname, "src/assets/mock"),
69 + "common": path.resolve(__dirname, "src/common"),
70 + "@api": path.resolve(__dirname, "src/api"),
71 + },
72 + dedupe: ['vue'], // 如果你在你的应用程序中有相同依赖的副本(比如 monorepos),使用这个选项来强制 Vite 总是将列出的依赖关系解析到相同的副本(从项目根目录)。
73 + // conditions: [''], // 在解析包的 情景导出 时允许的附加条件。
74 + // mainFields: [''], // package.json 中,在解析包的入口点时尝试的字段列表。注意,这比从 exports 字段解析的情景导出优先级低:如果一个入口点从 exports 成功解析,主字段将被忽略。
75 + extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'], // 导入时想要省略的扩展名列表。注意,不 建议忽略自定义导入类型的扩展名(例如:.vue),因为它会干扰 IDE 和类型支持。
76 + },
77 + css: {
78 + modules: '', // 配置 CSS modules 的行为。选项将被传递给 postcss-modules。
79 + postcss: { // 内联的 PostCSS 配置(格式同 postcss.config.js),或者一个(默认基于项目根目录的)自定义的 PostCSS 配置路径。其路径搜索是通过 postcss-load-config 实现的。 注意,如果提供了该内联配置,Vite 将不会搜索其他 PostCSS 配置源。
80 + plugins: [
81 + // postcsspxtoviewport({
82 + // unitToConvert: 'px', // 要转化的单位
83 + // viewportWidth: 375, // UI设计稿的宽度
84 + // unitPrecision: 6, // 转换后的精度,即小数点位数
85 + // propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
86 + // viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
87 + // fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
88 + // selectorBlackList: ['ignore-'], // 指定不转换为视窗单位的类名,
89 + // minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
90 + // mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
91 + // replace: true, // 是否转换后直接更换属性值
92 + // // exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
93 + // exclude: [],
94 + // landscape: false // 是否处理横屏情况
95 + // })
96 + ]
97 + },
98 + preprocessorOptions: {
99 + less: {
100 + javascriptEnabled: true,
101 + additionalData: `@import "${path.resolve(__dirname, 'src/assets/styles/base.less')}";`
102 + }
103 + } // 指定传递给 CSS 预处理器的选项。
104 + },
105 + // json: {
106 + // namedExports: true, // 是否支持从 .json 文件中进行按名导入。
107 + // stringify: false, // 若设置为 true,导入的 JSON 会被转换为 export default JSON.parse("...") 会比转译成对象字面量性能更好,尤其是当 JSON 文件较大的时候。 开启此项,则会禁用按名导入。
108 + // },
109 + // esbuild: false, //
110 + // assetsInclude: '', // 指定其他文件类型作为静态资源处理
111 + logLevel: 'info', // 调整控制台输出的级别,默认为 'info'。
112 + // clearScreen: true, // 设为 false 可以避免 Vite 清屏而错过在终端中打印某些关键信息。命令行模式下请通过 --clearScreen false 设置。
113 + server: {
114 + host: '0.0.0.0',
115 + port: viteEnv.VITE_PORT, // 本地服务端口
116 + // strictPort: true, // 设为true时若端口已被占用则会直接退出, 而不是尝试下一个可用端口
117 + // https: '',
118 + // open: false, // 在服务器启动时自动在浏览器中打开应用程序. 当此值为字符串时, 会被当作URL的路径名.
119 + // proxy: { // 代理
120 + // '/srv/': {
121 + // // target: 'http://voice.onwall.cn',
122 + // target: viteEnv.VITE_PROXY_TARGET,
123 + // changeOrigin: true,
124 + // // rewrite: (path) => path.replace(/^\/api/, '')
125 + // },
126 + // },
127 + proxy: createProxy(viteEnv.VITE_PROXY_PREFIX, viteEnv.VITE_PROXY_TARGET),
128 + // cors: '', // 为开发服务器配置 CORS。默认启用并允许任何源,传递一个 选项对象 来调整行为或设为 false 表示禁用。
129 + // force: '', // 设置为 true 强制使依赖预构建。
130 + // hmr: '', // 禁用或配置 HMR 连接(用于 HMR websocket 必须使用不同的 http 服务器地址的情况)。 设置 server.hmr.overlay 为 false 可以禁用服务器错误遮罩层。
131 + // watch: '', // 传递给 chokidar 的文件系统监视器选项。
132 + },
133 + build: {
134 + // outDir: 'voice', // 指定输出路径(相对于项目根目录).
135 + outDir: viteEnv.VITE_OUTDIR, // 指定输出路径(相对于项目根目录).
136 + assetsDir: 'static',
137 + rollupOptions: {
138 + output: {
139 + chunkFileNames: 'static/js/[name]-[hash].js',
140 + entryFileNames: 'static/js/[name]-[hash].js',
141 + assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
142 + },
143 + input: { // 多页面应用模式, 打包时配置,运行配置要处理root
144 + main: path.resolve(__dirname, 'index.html'),
145 + // mono1: path.resolve(__dirname, 'src/packages/mono1/index.html'),
146 + // mono2: path.resolve(__dirname, 'src/packages/mono2/index.html'),
147 + }
148 + },
149 + },
150 + optimizeDeps: {
151 + // entries: '',
152 + // exclude: [],
153 + include: ['jquery', 'lodash', 'moment', 'axios', 'pinia', 'vue-router', 'vant'], // 默认情况下,不在 node_modules 中的,链接的包不会被预构建。使用此选项可强制预构建链接的包。
154 + // keepNames: false, // 打包器有时需要重命名符号以避免冲突。 设置此项为 true 可以在函数和类上保留 name 属性。 若想获取更多详情,请参阅 keepNames
155 + }
156 + });
157 +};
This diff could not be displayed because it is too large.