前端项目修正初始化-2

main
ccongli 1 year ago
parent 76d9a8bf86
commit e08e65995f

@ -0,0 +1,19 @@
root = true
[*]
charset=utf-8
end_of_line=lf
insert_final_newline=true
indent_style=space
indent_size=2
max_line_length = 100
[*.{yml,yaml,json}]
indent_style = space
indent_size = 2
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab

@ -0,0 +1,17 @@
# 端口号
VITE_PORT = 8090
# 网站标题
VITE_GLOB_APP_TITLE = 云息Saas平台
# 简称,用于配置文件名字 不要出现空格、数字开头等特殊字符
VITE_GLOB_APP_SHORT_NAME = Yunxi_Saas_Admin
# 租户开关
VITE_GLOB_APP_TENANT_ENABLE = true
# 验证码的开关
VITE_GLOB_APP_CAPTCHA_ENABLE = true
# 百度统计
VITE_APP_BAIDU_CODE = eb21166668bf766b9d059a6fd1c10777

@ -0,0 +1,28 @@
# 本地开发环境
NODE_ENV=development
# 资源公共路径,需要以 /开头和结尾
VITE_PUBLIC_PATH = /
# 本地开发代理,可以解决跨域及多地址代理
# 如果接口地址匹配到则会转发到http://localhost:3000防止本地出现跨域问题
# 可以有多个,注意多个不能换行,否则代理将会失效
VITE_PROXY = [["/dev-api","http://api-dashboard.yudao.iocoder.cn/admin-api"],["/upload","http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload"]]
# VITE_PROXY=[["/api","http://vben.xingyuv.com/test"]]
# 是否删除Console.log
VITE_DROP_CONSOLE = false
# 基础页面地址,例如 swagger 等页面
VITE_GLOB_BASE_URL = "http://api-dashboard.yudao.iocoder.cn"
# 接口地址,如果没有跨域问题,直接在这里配置即可
VITE_GLOB_API_URL = /dev-api
# 文件上传接口 可选
VITE_GLOB_UPLOAD_URL = /upload
# 接口地址前缀,有些系统所有接口地址都有前缀,可以在这里统一加,方便切换
VITE_GLOB_API_URL_PREFIX =
# 百度统计
VITE_APP_BAIDU_CODE = eb21166668bf766b9d059a6fd1c10777

@ -0,0 +1,30 @@
# 资源公共路径,需要以 / 开头和结尾
VITE_PUBLIC_PATH = /
# 是否删除Console.log
VITE_DROP_CONSOLE = true
# 打包是否输出gzbr文件
# 可选: gzip | brotli | none
# 也可以有多个, 例如 gzip|'brotli',这样会同时生成 .gz和.br文件
VITE_BUILD_COMPRESS = 'gzip'
# 使用compress时是否删除源文件默认false
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
# 基础页面地址,例如 swagger 等页面
VITE_GLOB_BASE_URL = "http://localhost:48080"
# 接口地址 可以由nginx做转发或者直接写实际地址
VITE_GLOB_API_URL = http://localhost:48080/admin-api
# 文件上传地址 可以由nginx做转发或者直接写实际地址
VITE_GLOB_UPLOAD_URL = /upload
# 接口地址前缀,有些系统所有接口地址都有前缀,可以在这里统一加,方便切换
VITE_GLOB_API_URL_PREFIX =
# 打包是否开启pwa功能
VITE_USE_PWA = false
# 百度统计
VITE_APP_BAIDU_CODE = eb21166668bf766b9d059a6fd1c10777

@ -0,0 +1,30 @@
# 资源公共路径,需要以 / 开头和结尾
VITE_PUBLIC_PATH = /
# 是否删除Console.log
VITE_DROP_CONSOLE = true
# 打包是否输出gzbr文件
# 可选: gzip | brotli | none
# 也可以有多个, 例如 gzip|'brotli',这样会同时生成 .gz和.br文件
VITE_BUILD_COMPRESS = 'gzip'
# 使用compress时是否删除源文件默认false
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
# 基础页面地址,例如 swagger 等页面
VITE_GLOB_BASE_URL = "http://api-dashboard.yudao.iocoder.cn"
# 接口地址,如果没有跨域问题,直接在这里配置即可
VITE_GLOB_API_URL = http://api-dashboard.yudao.iocoder.cn/admin-api
# 文件上传地址 可以由nginx做转发或者直接写实际地址
VITE_GLOB_UPLOAD_URL = http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload
# 接口地址前缀,有些系统所有接口地址都有前缀,可以在这里统一加,方便切换
VITE_GLOB_API_URL_PREFIX =
# 打包是否开启pwa功能
VITE_USE_PWA = false
# 百度统计
VITE_APP_BAIDU_CODE = eb21166668bf766b9d059a6fd1c10777

@ -0,0 +1,30 @@
# 资源公共路径,需要以 / 开头和结尾
VITE_PUBLIC_PATH = /
# 是否删除Console.log
VITE_DROP_CONSOLE = true
# 打包是否输出gzbr文件
# 可选: gzip | brotli | none
# 也可以有多个, 例如 gzip|'brotli',这样会同时生成 .gz和.br文件
VITE_BUILD_COMPRESS = 'gzip'
# 使用compress时是否删除源文件默认false
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
# 基础页面地址,例如 swagger 等页面
VITE_GLOB_BASE_URL = "http://localhost:48080"
# 接口地址,如果没有跨域问题,直接在这里配置即可
VITE_GLOB_API_URL = http://localhost:48080/admin-api
# 文件上传地址 可以由nginx做转发或者直接写实际地址
VITE_GLOB_UPLOAD_URL = /upload
# 接口地址前缀,有些系统所有接口地址都有前缀,可以在这里统一加,方便切换
VITE_GLOB_API_URL_PREFIX =
# 打包是否开启pwa功能
VITE_USE_PWA = false
# 百度统计
VITE_APP_BAIDU_CODE = eb21166668bf766b9d059a6fd1c10777

@ -0,0 +1,13 @@
*.sh
node_modules
*.md
*.woff
*.ttf
.vscode
.idea
dist
/public
/docs
.local
/bin
Dockerfile

@ -0,0 +1,10 @@
const process = require('node:process')
process.env.ESLINT_TSCONFIG = 'tsconfig.json'
module.exports = {
extends: ['@xingyuv', '@unocss'],
rules: {
'no-console': 'off',
},
}

@ -0,0 +1,11 @@
# https://docs.github.com/cn/get-started/getting-started-with-git/configuring-git-to-handle-line-endings
# Automatically normalize line endings (to LF) for all text-based files.
* text=auto eol=lf
# Declare files that will always have CRLF line endings on checkout.
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.{ico,png,jpg,jpeg,gif,webp,svg,woff,woff2} binary

@ -0,0 +1,39 @@
node_modules
.DS_Store
dist
.npmrc
.cache
tests/server/static
tests/server/static/upload
*.local
# local env files
.env.local
.env.*.local
.env.development
.eslintcache
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
# .vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
package-lock.json
.history
.vscode
.vite

@ -0,0 +1,6 @@
ports:
- port: 3344
onOpen: open-preview
tasks:
- init: pnpm install
command: pnpm run dev

@ -0,0 +1,16 @@
{
"extends": [
"development"
],
"hints": {
"compat-api/css": [
"default",
{
"ignore": [
"-webkit-tap-highlight-color",
"text-size-adjust"
]
}
]
}
}

@ -0,0 +1,9 @@
/dist/*
.local
.output.js
/node_modules/**
**/*.svg
**/*.sh
/public/*

@ -0,0 +1,3 @@
/dist/*
/public/*
public/*

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023-present, xingyuv
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -0,0 +1,132 @@
# yudao-ui-admin-vben
[![license](https://img.shields.io/github/license/xingyuv/vue-vben-admin.svg)](LICENSE)
**严肃声明:现在、未来都不会有商业版本,所有代码全部开源!**
**「我喜欢写代码,乐此不疲」**
**「我喜欢做开源,以此为乐」**
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
## 预览地址
- [预览地址](http://dashboard-vben.yudao.iocoder.cn/)
- [启动文档](https://doc.iocoder.cn/quick-start/)
- [开发文档](http://vben-doc.x-surge.com/)
- [视频教程](https://doc.iocoder.cn/video/)
## 外包项目请联系 [ xinyu370 ]
- ![alt 定制开发](./public/resource/img/wx2.png)
## 交流群
- ![alt 交流群](./public/resource/img/wx.png)
## 框架
| 框架 | 说明 | 版本 |
| -------------------------------------------------------------------- | --------------------- | ------ |
| [Vue](https://staging-cn.vuejs.org/) | Vue 框架 | 3.3.4 |
| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.4.9 |
| [ant-design-vue](https://antdv.com/) | ant-design-vue | 4.0.3 |
| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 5.1.6 |
| [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.1.6 |
| [vueuse](https://vueuse.org/) | 常用工具集 | 10.4.1 |
| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.4.1 |
| [vue-router](https://router.vuejs.org/) | Vue 路由 | 4.2.5 |
| [unocss](https://uno.antfu.me/) | 原子 css | 0.56.1 |
| [iconify](https://icon-sets.iconify.design/) | 在线图标库 | 3.1.1 |
- ![alt VbenAdmin](https://anncwb.github.io/anncwb/images/preview1.png)
- ![alt VbenAdmin](https://anncwb.github.io/anncwb/images/preview2.png)
- ![alt VbenAdmin](https://anncwb.github.io/anncwb/images/preview3.png)
## 准备
- [node](http://nodejs.org/) 和 [git](https://git-scm.com/) -项目开发环境
- [Vite4](https://vitejs.dev/) - 熟悉 vite 特性
- [Vue3](https://v3.vuejs.org/) - 熟悉 Vue 基础语法
- [TypeScript](https://www.typescriptlang.org/) - 熟悉`TypeScript`基本语法
- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 es6 基本语法
- [Vue-Router-Next](https://next.router.vuejs.org/) - 熟悉 vue-router 基本使用
- [Ant-Design-Vue-4.0](https://antdv.com/) - ui 基本使用
## 安装使用
- 获取项目代码
```bash
git clone https://gitee.com/xingyuv/yudao-ui-admin-vben.git
or
git clone https://github.com/xingyuv/yudao-ui-admin-vben.git
```
- 安装依赖
```bash
pnpm i
如提示 Expected version: >=8.6.0
使用 cmd 等升级 pnpm 版本
npm add -g pnpm
```
- 运行
```bash
pnpm dev
or
// 如果不想启动后端
pnpm front
```
- 打包
```bash
pnpm build
```
## 开发进度
- 系统管理 已完成
- 基础设施 已完成
- 支付管理 已完成
- 升级 antdv 4.0 已完成
- 公众号 进行中 50% 预计年底
- 工作流 进行中 40% 预计年底
## Git 贡献提交规范
- 参考 [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) 规范 ([Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular))
- `feat` 增加新功能
- `fix` 修复问题/BUG
- `style` 代码风格相关无影响运行结果的
- `perf` 优化/性能提升
- `refactor` 重构
- `revert` 撤销修改
- `test` 测试相关
- `docs` 文档/注释
- `chore` 依赖更新/脚手架配置修改等
- `workflow` 工作流改进
- `ci` 持续集成
- `types` 类型定义文件更改
- `wip` 开发中
## 浏览器支持
本地开发推荐使用`Chrome 80+` 浏览器
支持现代浏览器, 不支持 IE
| ![alt IE](https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_32x32.png) | ![alt Edge](https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_32x32.png) | ![alt Firefox](https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_32x32.png) | ![alt Chrome](https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_32x32.png) | ![alt Safari](https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_32x32.png) |
| :---------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------: |
| [IE](http://godban.github.io/browsers-support-badges/) | [Edge](http://godban.github.io/browsers-support-badgess/) | [Firefox](http://godban.github.io/browsers-support-badges/) | [Chrome](http://godban.github.io/browsers-support-badges/) | [Safari](http://godban.github.io/browsers-support-badges/) |
| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |

@ -0,0 +1,91 @@
const fs = require('node:fs')
const path = require('node:path')
const { execSync } = require('node:child_process')
const scopes = fs
.readdirSync(path.resolve(__dirname, 'src'), { withFileTypes: true })
.filter(dirent => dirent.isDirectory())
.map(dirent => dirent.name.replace(/s$/, ''))
// precomputed scope
const scopeComplete = execSync('git status --porcelain || true')
.toString()
.trim()
.split('\n')
.find(r => ~r.indexOf('M src'))
?.replace(/(\/)/g, '%%')
?.match(/src%%((\w|-)*)/)?.[1]
?.replace(/s$/, '')
/** @type {import('cz-git').UserConfig} */
module.exports = {
ignores: [commit => commit.includes('init')],
extends: ['@commitlint/config-conventional'],
rules: {
'body-leading-blank': [2, 'always'],
'footer-leading-blank': [1, 'always'],
'header-max-length': [2, 'always', 108],
'subject-empty': [2, 'never'],
'type-empty': [2, 'never'],
'subject-case': [0],
'type-enum': [
2,
'always',
['feat', 'fix', 'perf', 'style', 'docs', 'test', 'refactor', 'build', 'ci', 'chore', 'revert', 'wip', 'workflow', 'types', 'release'],
],
},
prompt: {
/** @use `yarn commit :f` */
alias: {
f: 'docs: fix typos',
r: 'docs: update README',
s: 'style: update code format',
b: 'build: bump dependencies',
c: 'chore: update config',
},
customScopesAlign: !scopeComplete ? 'top' : 'bottom',
defaultScope: scopeComplete,
scopes: [...scopes, 'mock'],
allowEmptyIssuePrefixs: false,
allowCustomIssuePrefixs: false,
// English
typesAppend: [
{ value: 'wip', name: 'wip: work in process' },
{ value: 'workflow', name: 'workflow: workflow improvements' },
{ value: 'types', name: 'types: type definition file changes' },
],
// 中英文对照版
messages: {
type: '选择你要提交的类型 :',
scope: '选择一个提交范围 (可选):',
customScope: '请输入自定义的提交范围 :',
subject: '填写简短精炼的变更描述 :\n',
body: '填写更加详细的变更描述 (可选)。使用 "|" 换行 :\n',
breaking: '列举非兼容性重大的变更 (可选)。使用 "|" 换行 :\n',
footerPrefixsSelect: '选择关联issue前缀 (可选):',
customFooterPrefixs: '输入自定义issue前缀 :',
footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
confirmCommit: '是否提交或修改commit ?',
},
types: [
{ value: 'feat', name: 'feat: 新增功能' },
{ value: 'fix', name: 'fix: 修复缺陷' },
{ value: 'docs', name: 'docs: 文档变更' },
{ value: 'style', name: 'style: 代码格式' },
{ value: 'refactor', name: 'refactor: 代码重构' },
{ value: 'perf', name: 'perf: 性能优化' },
{ value: 'test', name: 'test: 添加疏漏测试或已有测试改动' },
{ value: 'build', name: 'build: 构建流程、外部依赖变更 (如升级 npm 包、修改打包配置等)' },
{ value: 'ci', name: 'ci: 修改 CI 配置、脚本' },
{ value: 'revert', name: 'revert: 回滚 commit' },
{ value: 'chore', name: 'chore: 对构建过程或辅助工具和库的更改 (不影响源文件、测试用例)' },
{ value: 'wip', name: 'wip: 正在开发中' },
{ value: 'workflow', name: 'workflow: 工作流程改进' },
{ value: 'types', name: 'types: 类型定义文件修改' },
],
emptyScopesAlias: 'empty: 不填写',
customScopesAlias: 'custom: 自定义',
},
}

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html lang="en" id="htmlRoot">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta
name="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
/>
<title>%VITE_GLOB_APP_TITLE%</title>
<link rel="icon" href="/favicon.ico" />
</head>
<body>
<script>
(() => {
let htmlRoot = document.getElementById('htmlRoot')
let theme = window.localStorage.getItem('__APP__DARK__MODE__')
if (htmlRoot && theme) {
htmlRoot.setAttribute('data-theme', theme)
theme = htmlRoot = null
}
})()
</script>
<div id="app">
<style>
html[data-theme="dark"] {
.app-loading {
background-color: #2c344a;
.app-loading-title {
color: rgb(255 255 255 / 85%);
}
}
}
.app-loading {
display: flex;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
flex-direction: column;
background-color: #f4f7f9;
}
.app-loading .app-loading-wrap {
position: absolute;
top: 50%;
left: 50%;
display: flex;
transform: translate3d(-50%, -50%, 0);
justify-content: center;
align-items: center;
flex-direction: column;
}
.app-loading .dots {
display: flex;
padding: 98px;
justify-content: center;
align-items: center;
}
.app-loading .app-loading-title {
display: flex;
margin-top: 30px;
font-size: 30px;
color: rgb(0 0 0 / 85%);
justify-content: center;
align-items: center;
}
.app-loading .app-loading-logo {
display: block;
width: 90px;
margin: 0 auto;
margin-bottom: 20px;
}
.dot {
position: relative;
display: inline-block;
width: 48px;
height: 48px;
margin-top: 30px;
font-size: 32px;
transform: rotate(45deg);
box-sizing: border-box;
animation: antRotate 1.2s infinite linear;
}
.dot i {
position: absolute;
display: block;
width: 20px;
height: 20px;
background-color: #0065cc;
border-radius: 100%;
opacity: 30%;
transform: scale(0.75);
animation: antSpinMove 1s infinite linear alternate;
transform-origin: 50% 50%;
}
.dot i:nth-child(1) {
top: 0;
left: 0;
}
.dot i:nth-child(2) {
top: 0;
right: 0;
animation-delay: 0.4s;
}
.dot i:nth-child(3) {
right: 0;
bottom: 0;
animation-delay: 0.8s;
}
.dot i:nth-child(4) {
bottom: 0;
left: 0;
animation-delay: 1.2s;
}
@keyframes antRotate {
to {
transform: rotate(405deg);
}
}
@keyframes antRotate {
to {
transform: rotate(405deg);
}
}
@keyframes antSpinMove {
to {
opacity: 100%;
}
}
@keyframes antSpinMove {
to {
opacity: 100%;
}
}
</style>
<div class="app-loading">
<div class="app-loading-wrap">
<img src="/resource/img/logo.png" class="app-loading-logo" alt="Logo" />
<div class="app-loading-dots">
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
</div>
<div class="app-loading-title">%VITE_GLOB_APP_TITLE%</div>
</div>
</div>
</div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

@ -0,0 +1,169 @@
{
"name": "yudao-ui-admin-vben",
"version": "1.8.1-snapshot",
"packageManager": "pnpm@8.6.0",
"author": {
"name": "xingyuv",
"email": "xingyu4j@vip.qq.com",
"url": "https://gitee.com/xingyuv"
},
"license": "MIT",
"homepage": "https://gitee.com/xingyuv",
"repository": {
"type": "git",
"url": "git+https://gitee.com/xingyuv/vue-vben-admin.git"
},
"bugs": {
"url": "https://gitee.com/xingyuv/issues"
},
"engines": {
"node": ">= 18.0.0",
"pnpm": ">=8.6.0"
},
"scripts": {
"commit": "czg",
"bootstrap": "pnpm install",
"serve": "pnpm dev",
"dev": "vite",
"front": "vite --mode front",
"build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts",
"build:test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode test && esno ./build/script/postBuild.ts",
"build:static": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode static && esno ./build/script/postBuild.ts",
"build:no-cache": "pnpm clean:cache && pnpm build",
"report": "cross-env REPORT=true pnpm build",
"type:check": "vue-tsc --noEmit --skipLibCheck",
"preview": "pnpm build && vite preview",
"preview:dist": "vite preview",
"clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
"clean:lib": "rimraf node_modules",
"lint": "eslint \"src/**/*.{vue,ts,tsx}\"",
"lint:fix": "eslint \"src/**/*.{vue,ts,tsx}\" --fix",
"lint:stylelint": "stylelint \"src/**/*.{vue,css,less,scss}\" --fix --cache --cache-location node_modules/.cache/stylelint/",
"lint:lint-staged": "lint-staged",
"npm:check": "npx npm-check-updates",
"reinstall": "rimraf pnpm-lock.yaml && rimraf package.lock.json && rimraf node_modules && pnpm bootstrap",
"prepare": "husky install",
"gen:icon": "esno ./build/generate/icon/index.ts"
},
"dependencies": {
"@ant-design/colors": "^7.0.0",
"@ant-design/icons-vue": "^7.0.0",
"@iconify/iconify": "^3.1.1",
"@videojs-player/vue": "^1.0.0",
"@vue/runtime-core": "^3.3.4",
"@vueuse/core": "^10.4.1",
"@zxcvbn-ts/core": "^3.0.4",
"ant-design-vue": "^4.0.3",
"axios": "^1.5.0",
"benz-amr-recorder": "^1.1.5",
"codemirror": "^5.65.3",
"cron-parser": "^4.9.0",
"cropperjs": "^1.6.1",
"crypto-js": "^4.1.1",
"dayjs": "^1.11.10",
"echarts": "^5.4.3",
"lodash-es": "^4.17.21",
"nprogress": "^0.2.0",
"path-to-regexp": "^6.2.1",
"pinia": "^2.1.6",
"print-js": "^1.6.0",
"qs": "^6.11.2",
"resize-observer-polyfill": "^1.5.1",
"sortablejs": "^1.15.0",
"tinymce": "^5.10.7",
"vditor": "^3.9.5",
"video-js": "^0.7.0",
"vue": "^3.3.4",
"vue-i18n": "^9.4.1",
"vue-json-pretty": "^2.2.4",
"vue-router": "^4.2.5",
"vue-types": "^5.1.1",
"vuedraggable": "^4.1.0",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@commitlint/cli": "^17.7.1",
"@commitlint/config-conventional": "^17.7.0",
"@iconify/json": "^2.2.119",
"@purge-icons/generated": "^0.9.0",
"@types/codemirror": "^5.60.10",
"@types/crypto-js": "^4.1.2",
"@types/fs-extra": "^11.0.2",
"@types/inquirer": "^9.0.3",
"@types/lodash-es": "^4.17.9",
"@types/node": "^20.6.0",
"@types/nprogress": "^0.2.1",
"@types/qs": "^6.9.8",
"@types/sortablejs": "^1.15.2",
"@unocss/eslint-config": "^0.56.1",
"@vitejs/plugin-vue": "4.3.4",
"@vitejs/plugin-vue-jsx": "^3.0.2",
"@vue/compiler-sfc": "^3.3.4",
"@xingyuv/eslint-config": "^0.1.6",
"cross-env": "^7.0.3",
"cz-git": "^1.7.1",
"czg": "^1.7.1",
"dotenv": "^16.3.1",
"eslint": "^8.50.0",
"esno": "^0.17.0",
"fs-extra": "^11.1.1",
"husky": "^8.0.3",
"inquirer": "^9.2.11",
"less": "^4.2.0",
"lint-staged": "^14.0.1",
"picocolors": "^1.0.0",
"postcss": "^8.4.30",
"postcss-html": "^1.5.0",
"postcss-less": "^6.0.0",
"prettier": "^3.0.3",
"rimraf": "^5.0.1",
"rollup": "^3.29.3",
"rollup-plugin-visualizer": "^5.9.2",
"stylelint": "^15.10.3",
"stylelint-config-recess-order": "^4.3.0",
"stylelint-config-recommended": "^13.0.0",
"stylelint-config-recommended-vue": "^1.5.0",
"stylelint-config-standard": "^34.0.0",
"stylelint-order": "^6.0.3",
"stylelint-prettier": "^4.0.2",
"terser": "^5.20.0",
"typescript": "^5.2.2",
"unocss": "^0.56.1",
"vite": "^4.4.9",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-mkcert": "^1.16.0",
"vite-plugin-progress": "^0.0.7",
"vite-plugin-purge-icons": "^0.9.2",
"vite-plugin-pwa": "^0.16.5",
"vite-plugin-svg-icons": "^2.0.1",
"vite-vue-plugin-html": "^1.0.2",
"vue-eslint-parser": "^9.3.1",
"vue-tsc": "^1.8.13"
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix"
],
"{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [
"prettier --write--parser json"
],
"package.json": [
"prettier --write"
],
"*.vue": [
"eslint --fix",
"stylelint --fix"
],
"*.{scss,less,styl,html}": [
"stylelint --fix"
],
"*.md": [
"prettier --write"
]
},
"config": {
"commitizen": {
"path": "node_modules/cz-git"
}
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

@ -0,0 +1,419 @@
tinymce.addI18n('es', {
Redo: 'Rehacer',
Undo: 'Deshacer',
Cut: 'Cortar',
Copy: 'Copiar',
Paste: 'Pegar',
'Select all': 'Seleccionar todo',
'New document': 'Nuevo documento',
Ok: 'Ok',
Cancel: 'Cancelar',
'Visual aids': 'Ayudas visuales',
Bold: 'Negrita',
Italic: 'Cursiva',
Underline: 'Subrayado',
Strikethrough: 'Tachado',
Superscript: 'Super\u00edndice',
Subscript: 'Sub\u00edndice',
'Clear formatting': 'Limpiar formato',
'Align left': 'Alinear a la izquierda',
'Align center': 'Alinear al centro',
'Align right': 'Alinear a la derecha',
Justify: 'Justificar',
'Bullet list': 'Lista de vi\u00f1etas',
'Numbered list': 'Lista numerada',
'Decrease indent': 'Disminuir sangr\u00eda',
'Increase indent': 'Incrementar sangr\u00eda',
Close: 'Cerrar',
Formats: 'Formatos',
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": 'Su navegador no es compatible con el acceso directo al portapapeles. Use las teclas Crtl+X\/C\/V de su teclado.',
Headers: 'Encabezados',
'Header 1': 'Encabezado 1',
'Header 2': 'Encabezado 2',
'Header 3': 'Encabezado 3',
'Header 4': 'Encabezado 4',
'Header 5': 'Encabezado 5',
'Header 6': 'Encabezado 6',
Headings: 'Encabezados',
'Heading 1': 'Encabezado 1',
'Heading 2': 'Encabezado 2',
'Heading 3': 'Encabezado 3',
'Heading 4': 'Encabezado 4',
'Heading 5': 'Encabezado 5',
'Heading 6': 'Encabezado 6',
Preformatted: 'Con formato previo',
Div: 'Div',
Pre: 'Pre',
Code: 'C\u00f3digo',
Paragraph: 'P\u00e1rrafo',
Blockquote: 'Blockquote',
Inline: 'Alineado',
Blocks: 'Bloques',
'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.': 'Pegar est\u00e1 ahora en modo de texto plano. El contenido se pegar\u00e1 como texto plano hasta que desactive esta opci\u00f3n.',
Fonts: 'Fuentes',
'Font Sizes': 'Tama\u00f1os de fuente',
Class: 'Clase',
'Browse for an image': 'Buscar una imagen',
OR: 'OR',
'Drop an image here': 'Arrastre una imagen aqu\u00ed',
Upload: 'Cargar',
Block: 'Bloque',
Align: 'Alinear',
Default: 'Por defecto',
Circle: 'C\u00edrculo',
Disc: 'Disco',
Square: 'Cuadrado',
'Lower Alpha': 'Inferior Alfa',
'Lower Greek': 'Inferior Griega',
'Lower Roman': 'Inferior Romana',
'Upper Alpha': 'Superior Alfa',
'Upper Roman': 'Superior Romana',
'Anchor...': 'Anclaje...',
Name: 'Nombre',
Id: 'Id',
'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.': 'Deber\u00eda comenzar por una letra, seguida solo de letras, n\u00fameros, guiones, puntos, dos puntos o guiones bajos.',
'You have unsaved changes are you sure you want to navigate away?': 'Tiene cambios sin guardar. \u00bfEst\u00e1 seguro de que quiere salir?',
'Restore last draft': 'Restaurar el \u00faltimo borrador',
'Special character...': 'Car\u00e1cter especial...',
'Source code': 'C\u00f3digo fuente',
'Insert\/Edit code sample': 'Insertar\/editar c\u00f3digo de prueba',
Language: 'Idioma',
'Code sample...': 'Ejemplo de c\u00f3digo...',
'Color Picker': 'Selector de colores',
R: 'R',
G: 'V',
B: 'A',
'Left to right': 'De izquierda a derecha',
'Right to left': 'De derecha a izquierda',
'Emoticons...': 'Emoticones...',
'Metadata and Document Properties': 'Metadatos y propiedades del documento',
Title: 'T\u00edtulo',
Keywords: 'Palabras clave',
Description: 'Descripci\u00f3n',
Robots: 'Robots',
Author: 'Autor',
Encoding: 'Codificaci\u00f3n',
Fullscreen: 'Pantalla completa',
Action: 'Acci\u00f3n',
Shortcut: 'Atajo',
Help: 'Ayuda',
Address: 'Direcci\u00f3n',
'Focus to menubar': 'Enfocar la barra del men\u00fa',
'Focus to toolbar': 'Enfocar la barra de herramientas',
'Focus to element path': 'Enfocar la ruta del elemento',
'Focus to contextual toolbar': 'Enfocar la barra de herramientas contextual',
'Insert link (if link plugin activated)': 'Insertar enlace (si el complemento de enlace est\u00e1 activado)',
'Save (if save plugin activated)': 'Guardar (si el componente de salvar est\u00e1 activado)',
'Find (if searchreplace plugin activated)': 'Buscar (si el complemento buscar-remplazar est\u00e1 activado)',
'Plugins installed ({0}):': 'Plugins instalados ({0}):',
'Premium plugins:': 'Complementos premium:',
'Learn more...': 'Aprende m\u00e1s...',
'You are using {0}': 'Estas usando {0}',
Plugins: 'Complementos',
'Handy Shortcuts': 'Accesos directos',
'Horizontal line': 'L\u00ednea horizontal',
'Insert\/edit image': 'Insertar\/editar imagen',
'Image description': 'Descripci\u00f3n de la imagen',
Source: 'Enlace',
Dimensions: 'Dimensiones',
'Constrain proportions': 'Restringir proporciones',
General: 'General',
Advanced: 'Avanzado',
Style: 'Estilo',
'Vertical space': 'Espacio vertical',
'Horizontal space': 'Espacio horizontal',
Border: 'Borde',
'Insert image': 'Insertar imagen',
'Image...': 'Imagen...',
'Image list': 'Lista de im\u00e1genes',
'Rotate counterclockwise': 'Girar a la izquierda',
'Rotate clockwise': 'Girar a la derecha',
'Flip vertically': 'Invertir verticalmente',
'Flip horizontally': 'Invertir horizontalmente',
'Edit image': 'Editar imagen',
'Image options': 'Opciones de imagen',
'Zoom in': 'Acercar',
'Zoom out': 'Alejar',
Crop: 'Recortar',
Resize: 'Redimensionar',
Orientation: 'Orientaci\u00f3n',
Brightness: 'Brillo',
Sharpen: 'Forma',
Contrast: 'Contraste',
'Color levels': 'Niveles de color',
Gamma: 'Gamma',
Invert: 'Invertir',
Apply: 'Aplicar',
Back: 'Atr\u00e1s',
'Insert date\/time': 'Insertar fecha\/hora',
'Date\/time': 'Fecha\/hora',
'Insert\/Edit Link': 'Insertar\/editar enlace',
'Insert\/edit link': 'Insertar\/editar enlace',
'Text to display': 'Texto para mostrar',
Url: 'URL',
'Open link in...': 'Abrir enlace en...',
'Current window': 'Ventana actual',
None: 'Ninguno',
'New window': 'Nueva ventana',
'Remove link': 'Quitar enlace',
Anchors: 'Anclas',
'Link...': 'Enlace...',
'Paste or type a link': 'Pega o introduce un enlace',
'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?': 'El enlace que has introducido no parece ser una direcci\u00f3n de correo electr\u00f3nico. Quieres a\u00f1adir el prefijo necesario mailto: ?',
'The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?': 'El enlace que has introducido no parece ser una enlace externo. Quieres a\u00f1adir el prefijo necesario http:\/\/ ?',
'Link list': 'Lista de enlaces',
'Insert video': 'Insertar video',
'Insert\/edit video': 'Insertar\/editar video',
'Insert\/edit media': 'Insertar\/editar medio',
'Alternative source': 'Enlace alternativo',
'Alternative source URL': 'Origen de URL alternativo',
'Media poster (Image URL)': 'P\u00f3ster de medio (URL de imagen)',
'Paste your embed code below:': 'Pega tu c\u00f3digo embebido debajo',
Embed: 'Incrustado',
'Media...': 'Medios...',
'Nonbreaking space': 'Espacio fijo',
'Page break': 'Salto de p\u00e1gina',
'Paste as text': 'Pegar como texto',
Preview: 'Previsualizar',
'Print...': 'Imprimir...',
Save: 'Guardar',
Find: 'Buscar',
'Replace with': 'Reemplazar con',
Replace: 'Reemplazar',
'Replace all': 'Reemplazar todo',
Previous: 'Anterior',
Next: 'Siguiente',
'Find and replace...': 'Buscar y reemplazar...',
'Could not find the specified string.': 'No se encuentra la cadena de texto especificada',
'Match case': 'Coincidencia exacta',
'Find whole words only': 'Solo palabras completas',
'Spell check': 'Revisar ortograf\u00eda',
Ignore: 'Ignorar',
'Ignore all': 'Ignorar todos',
Finish: 'Finalizar',
'Add to Dictionary': 'A\u00f1adir al Diccionario',
'Insert table': 'Insertar tabla',
'Table properties': 'Propiedades de la tabla',
'Delete table': 'Eliminar tabla',
Cell: 'Celda',
Row: 'Fila',
Column: 'Columna',
'Cell properties': 'Propiedades de la celda',
'Merge cells': 'Combinar celdas',
'Split cell': 'Dividir celdas',
'Insert row before': 'Insertar fila antes',
'Insert row after': 'Insertar fila despu\u00e9s ',
'Delete row': 'Eliminar fila',
'Row properties': 'Propiedades de la fila',
'Cut row': 'Cortar fila',
'Copy row': 'Copiar fila',
'Paste row before': 'Pegar la fila antes',
'Paste row after': 'Pegar la fila despu\u00e9s',
'Insert column before': 'Insertar columna antes',
'Insert column after': 'Insertar columna despu\u00e9s',
'Delete column': 'Eliminar columna',
Cols: 'Columnas',
Rows: 'Filas',
Width: 'Ancho',
Height: 'Alto',
'Cell spacing': 'Espacio entre celdas',
'Cell padding': 'Relleno de celda',
'Show caption': 'Mostrar t\u00edtulo',
Left: 'Izquierda',
Center: 'Centrado',
Right: 'Derecha',
'Cell type': 'Tipo de celda',
Scope: '\u00c1mbito',
Alignment: 'Alineaci\u00f3n',
'H Align': 'Alineamiento Horizontal',
'V Align': 'Alineamiento Vertical',
Top: 'Arriba',
Middle: 'Centro',
Bottom: 'Abajo',
'Header cell': 'Celda de la cebecera',
'Row group': 'Grupo de filas',
'Column group': 'Grupo de columnas',
'Row type': 'Tipo de fila',
Header: 'Cabecera',
Body: 'Cuerpo',
Footer: 'Pie de p\u00e1gina',
'Border color': 'Color del borde',
'Insert template...': 'Insertar plantilla...',
Templates: 'Plantillas',
Template: 'Plantilla',
'Text color': 'Color del texto',
'Background color': 'Color de fondo',
'Custom...': 'Personalizar...',
'Custom color': 'Color personalizado',
'No color': 'Sin color',
'Remove color': 'Quitar color',
'Table of Contents': 'Tabla de contenidos',
'Show blocks': 'Mostrar bloques',
'Show invisible characters': 'Mostrar caracteres invisibles',
'Word count': 'Contar palabras',
Count: 'Recuento',
Document: 'Documento',
Selection: 'Selecci\u00f3n',
Words: 'Palabras',
'Words: {0}': 'Palabras: {0}',
'{0} words': '{0} palabras',
File: 'Archivo',
Edit: 'Editar',
Insert: 'Insertar',
View: 'Ver',
Format: 'Formato',
Table: 'Tabla',
Tools: 'Herramientas',
'Powered by {0}': 'Desarrollado por {0}',
'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help': '\u00c1rea de texto enriquecido. Pulse ALT-F9 para el menu. Pulse ALT-F10 para la barra de herramientas. Pulse ALT-0 para ayuda',
'Image title': 'Titulo de imagen',
'Border width': 'Ancho de borde',
'Border style': 'Estilo de borde',
Error: 'Error',
Warn: 'Advertencia',
Valid: 'V\u00e1lido',
'To open the popup, press Shift+Enter': 'Para abrir el elemento emergente, pulse May\u00fas+Intro',
'Rich Text Area. Press ALT-0 for help.': '\u00c1rea de texto enriquecido. Pulse ALT-0 para abrir la ayuda.',
'System Font': 'Fuente de sistema',
'Failed to upload image: {0}': 'Fallo al cargar imagen: {0}',
'Failed to load plugin: {0} from url {1}': 'Fallo al cargar complemento: {0} desde URL {1}',
'Failed to load plugin url: {0}': 'Fallo al cargar URL del complemento: {0}',
'Failed to initialize plugin: {0}': 'Fallo al iniciar el complemento: {0}',
example: 'ejemplo',
Search: 'Buscar',
All: 'Todo',
Currency: 'Divisa',
Text: 'Texto',
Quotations: 'Comillas',
Mathematical: 'S\u00edmbolo matem\u00e1tico',
'Extended Latin': 'Latino extendido A',
Symbols: 'S\u00edmbolos',
Arrows: 'Flechas',
'User Defined': 'Definido por el usuario',
'dollar sign': 'signo de d\u00f3lar',
'currency sign': 'signo de divisa',
'euro-currency sign': 'signo de euro',
'colon sign': 'signo de dos puntos',
'cruzeiro sign': 'signo de cruceiro',
'french franc sign': 'signo de franco franc\u00e9s',
'lira sign': 'signo de lira',
'mill sign': 'signo de mill',
'naira sign': 'signo de naira',
'peseta sign': 'signo de peseta',
'rupee sign': 'signo de rupia',
'won sign': 'signo de won',
'new sheqel sign': 'signo de nuevo s\u00e9quel',
'dong sign': 'signo de dong',
'kip sign': 'signo de kip',
'tugrik sign': 'signo de tugrik',
'drachma sign': 'signo de dracma',
'german penny symbol': 'signo de penique alem\u00e1n',
'peso sign': 'signo de peso',
'guarani sign': 'signo de guaran\u00ed',
'austral sign': 'signo de austral',
'hryvnia sign': 'signo de grivna',
'cedi sign': 'signo de cedi',
'livre tournois sign': 'signo de libra tornesa',
'spesmilo sign': 'signo de spesmilo',
'tenge sign': 'signo de tenge',
'indian rupee sign': 'signo de rupia india',
'turkish lira sign': 'signo de lira turca',
'nordic mark sign': 'signo de marco n\u00f3rdico',
'manat sign': 'signo de manat',
'ruble sign': 'signo de rublo',
'yen character': 'car\u00e1cter de yen',
'yuan character': 'car\u00e1cter de yuan',
'yuan character, in hong kong and taiwan': 'car\u00e1cter de yuan en Hong Kong y Taiw\u00e1n',
'yen\/yuan character variant one': 'Variante uno de car\u00e1cter de yen\/yuan',
'Loading emoticons...': 'Cargando emoticonos...',
'Could not load emoticons': 'No se han podido cargar los emoticonos',
People: 'Personas',
'Animals and Nature': 'Animales y naturaleza',
'Food and Drink': 'Comida y bebida',
Activity: 'Actividad',
'Travel and Places': 'Viajes y lugares',
Objects: 'Objetos',
Flags: 'Banderas',
Characters: 'Caracteres',
'Characters (no spaces)': 'Caracteres (sin espacios)',
'{0} characters': '{0} caracteres',
'Error: Form submit field collision.': 'Error: Colisi\u00f3n de campo al enviar formulario.',
'Error: No form element found.': 'Error: No se encuentra ning\u00fan elemento de formulario.',
Update: 'Actualizar',
'Color swatch': 'Muestrario de colores',
Turquoise: 'Turquesa',
Green: 'Verde',
Blue: 'Azul',
Purple: 'P\u00farpura',
'Navy Blue': 'Azul marino',
'Dark Turquoise': 'Turquesa oscuro',
'Dark Green': 'Verde oscuro',
'Medium Blue': 'Azul medio',
'Medium Purple': 'P\u00farpura medio',
'Midnight Blue': 'Azul medio',
Yellow: 'Amarillo',
Orange: 'Naranja',
Red: 'Rojo',
'Light Gray': 'Gris claro',
Gray: 'Gris',
'Dark Yellow': 'Amarillo oscuro',
'Dark Orange': 'Naranja oscuro',
'Dark Red': 'Rojo oscuro',
'Medium Gray': 'Gris medio',
'Dark Gray': 'Gris oscuro',
'Light Green': 'Verde claro',
'Light Yellow': 'Amarillo claro',
'Light Red': 'Rojo claro',
'Light Purple': 'Morado claro',
'Light Blue': 'Azul claro',
'Dark Purple': 'Morado oscuro',
'Dark Blue': 'Azul oscuro',
Black: 'Negro',
White: 'Blanco',
'Switch to or from fullscreen mode': 'Activar o desactivar modo pantalla completa',
'Open help dialog': 'Abrir di\u00e1logo de ayuda',
history: 'historial',
styles: 'estilos',
formatting: 'formato',
alignment: 'alineaci\u00f3n',
indentation: 'sangr\u00eda',
'permanent pen': 'bol\u00edgrafo permanente',
comments: 'comentarios',
'Format Painter': 'Copiar formato',
'Insert\/edit iframe': 'Insertar\/editar iframe',
Capitalization: 'Uso de may\u00fasculas',
lowercase: 'min\u00fasculas',
UPPERCASE: 'MAY\u00daSCULAS',
'Title Case': 'Tipo T\u00edtulo',
'Permanent Pen Properties': 'Propiedades del bol\u00edgrafo permanente',
'Permanent pen properties...': 'Propiedades del bol\u00edgrafo permanente...',
Font: 'Fuente',
Size: 'Tama\u00f1o',
'More...': 'M\u00e1s...',
'Spellcheck Language': 'Corrector',
'Select...': 'Seleccionar...',
Preferences: 'Preferencias',
Yes: 'S\u00ed',
No: 'No',
'Keyboard Navigation': 'Navegaci\u00f3n con el teclado',
Version: 'Versi\u00f3n',
Anchor: 'Ancla',
'Special character': 'Car\u00e1cter especial',
'Code sample': 'Ejemplo de c\u00f3digo',
Color: 'Color',
Emoticons: 'Emoticonos',
'Document properties': 'Propiedades del documento',
Image: 'Imagen',
'Insert link': 'Insertar enlace',
Target: 'Destino',
Link: 'Enlace',
Poster: 'Miniatura',
Media: 'Media',
Print: 'Imprimir',
Prev: 'Anterior',
'Find and replace': 'Buscar y reemplazar',
'Whole words': 'Palabras completas',
Spellcheck: 'Corrector ortogr\u00e1fico',
Caption: 'Subt\u00edtulo',
'Insert template': 'Insertar plantilla'
})

@ -0,0 +1,389 @@
tinymce.addI18n('zh_CN',{
"Redo": "\u91cd\u505a",
"Undo": "\u64a4\u9500",
"Cut": "\u526a\u5207",
"Copy": "\u590d\u5236",
"Paste": "\u7c98\u8d34",
"Select all": "\u5168\u9009",
"New document": "\u65b0\u6587\u4ef6",
"Ok": "\u786e\u5b9a",
"Cancel": "\u53d6\u6d88",
"Visual aids": "\u7f51\u683c\u7ebf",
"Bold": "\u7c97\u4f53",
"Italic": "\u659c\u4f53",
"Underline": "\u4e0b\u5212\u7ebf",
"Strikethrough": "\u5220\u9664\u7ebf",
"Superscript": "\u4e0a\u6807",
"Subscript": "\u4e0b\u6807",
"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
"Align left": "\u5de6\u8fb9\u5bf9\u9f50",
"Align center": "\u4e2d\u95f4\u5bf9\u9f50",
"Align right": "\u53f3\u8fb9\u5bf9\u9f50",
"Justify": "\u4e24\u7aef\u5bf9\u9f50",
"Bullet list": "\u9879\u76ee\u7b26\u53f7",
"Numbered list": "\u7f16\u53f7\u5217\u8868",
"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
"Close": "\u5173\u95ed",
"Formats": "\u683c\u5f0f",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002",
"Headers": "\u6807\u9898",
"Header 1": "\u6807\u98981",
"Header 2": "\u6807\u98982",
"Header 3": "\u6807\u98983",
"Header 4": "\u6807\u98984",
"Header 5": "\u6807\u98985",
"Header 6": "\u6807\u98986",
"Headings": "\u6807\u9898",
"Heading 1": "\u6807\u98981",
"Heading 2": "\u6807\u98982",
"Heading 3": "\u6807\u98983",
"Heading 4": "\u6807\u98984",
"Heading 5": "\u6807\u98985",
"Heading 6": "\u6807\u98986",
"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684",
"Div": "Div",
"Pre": "Pre",
"Code": "\u4ee3\u7801",
"Paragraph": "\u6bb5\u843d",
"Blockquote": "\u5f15\u6587\u533a\u5757",
"Inline": "\u6587\u672c",
"Blocks": "\u57fa\u5757",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
"Fonts": "\u5b57\u4f53",
"Font Sizes": "\u5b57\u53f7",
"Class": "\u7c7b\u578b",
"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf",
"OR": "\u6216",
"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64",
"Upload": "\u4e0a\u4f20",
"Block": "\u5757",
"Align": "\u5bf9\u9f50",
"Default": "\u9ed8\u8ba4",
"Circle": "\u7a7a\u5fc3\u5706",
"Disc": "\u5b9e\u5fc3\u5706",
"Square": "\u65b9\u5757",
"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Anchor...": "\u951a\u70b9...",
"Name": "\u540d\u79f0",
"Id": "\u6807\u8bc6\u7b26",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002",
"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
"Special characters...": "\u7279\u6b8a\u5b57\u7b26...",
"Source code": "\u6e90\u4ee3\u7801",
"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
"Language": "\u8bed\u8a00",
"Code sample...": "\u793a\u4f8b\u4ee3\u7801...",
"Color Picker": "\u9009\u8272\u5668",
"R": "R",
"G": "G",
"B": "B",
"Left to right": "\u4ece\u5de6\u5230\u53f3",
"Right to left": "\u4ece\u53f3\u5230\u5de6",
"Emoticons...": "\u8868\u60c5\u7b26\u53f7...",
"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027",
"Title": "\u6807\u9898",
"Keywords": "\u5173\u952e\u8bcd",
"Description": "\u63cf\u8ff0",
"Robots": "\u673a\u5668\u4eba",
"Author": "\u4f5c\u8005",
"Encoding": "\u7f16\u7801",
"Fullscreen": "\u5168\u5c4f",
"Action": "\u64cd\u4f5c",
"Shortcut": "\u5feb\u6377\u952e",
"Help": "\u5e2e\u52a9",
"Address": "\u5730\u5740",
"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f",
"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f",
"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84",
"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355",
"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):",
"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a",
"Learn more...": "\u4e86\u89e3\u66f4\u591a...",
"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}",
"Plugins": "\u63d2\u4ef6",
"Handy Shortcuts": "\u5feb\u6377\u952e",
"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
"Image description": "\u56fe\u7247\u63cf\u8ff0",
"Source": "\u5730\u5740",
"Dimensions": "\u5927\u5c0f",
"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
"General": "\u666e\u901a",
"Advanced": "\u9ad8\u7ea7",
"Style": "\u6837\u5f0f",
"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
"Border": "\u8fb9\u6846",
"Insert image": "\u63d2\u5165\u56fe\u7247",
"Image...": "\u56fe\u7247...",
"Image list": "\u56fe\u7247\u5217\u8868",
"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
"Edit image": "\u7f16\u8f91\u56fe\u7247",
"Image options": "\u56fe\u7247\u9009\u9879",
"Zoom in": "\u653e\u5927",
"Zoom out": "\u7f29\u5c0f",
"Crop": "\u88c1\u526a",
"Resize": "\u8c03\u6574\u5927\u5c0f",
"Orientation": "\u65b9\u5411",
"Brightness": "\u4eae\u5ea6",
"Sharpen": "\u9510\u5316",
"Contrast": "\u5bf9\u6bd4\u5ea6",
"Color levels": "\u989c\u8272\u5c42\u6b21",
"Gamma": "\u4f3d\u9a6c\u503c",
"Invert": "\u53cd\u8f6c",
"Apply": "\u5e94\u7528",
"Back": "\u540e\u9000",
"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
"Text to display": "\u663e\u793a\u6587\u5b57",
"Url": "\u5730\u5740",
"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...",
"Current window": "\u5f53\u524d\u7a97\u53e3",
"None": "\u65e0",
"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
"Remove link": "\u5220\u9664\u94fe\u63a5",
"Anchors": "\u951a\u70b9",
"Link...": "\u94fe\u63a5...",
"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f",
"Link list": "\u94fe\u63a5\u5217\u8868",
"Insert video": "\u63d2\u5165\u89c6\u9891",
"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
"Alternative source": "\u955c\u50cf",
"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740",
"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)",
"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
"Embed": "\u5185\u5d4c",
"Media...": "\u591a\u5a92\u4f53...",
"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
"Page break": "\u5206\u9875\u7b26",
"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
"Preview": "\u9884\u89c8",
"Print...": "\u6253\u5370...",
"Save": "\u4fdd\u5b58",
"Find": "\u67e5\u627e",
"Replace with": "\u66ff\u6362\u4e3a",
"Replace": "\u66ff\u6362",
"Replace all": "\u5168\u90e8\u66ff\u6362",
"Previous": "\u4e0a\u4e00\u4e2a",
"Next": "\u4e0b\u4e00\u4e2a",
"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...",
"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
"Find whole words only": "\u5168\u5b57\u5339\u914d",
"Spell check": "\u62fc\u5199\u68c0\u67e5",
"Ignore": "\u5ffd\u7565",
"Ignore all": "\u5168\u90e8\u5ffd\u7565",
"Finish": "\u5b8c\u6210",
"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
"Insert table": "\u63d2\u5165\u8868\u683c",
"Table properties": "\u8868\u683c\u5c5e\u6027",
"Delete table": "\u5220\u9664\u8868\u683c",
"Cell": "\u5355\u5143\u683c",
"Row": "\u884c",
"Column": "\u5217",
"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
"Delete row": "\u5220\u9664\u884c",
"Row properties": "\u884c\u5c5e\u6027",
"Cut row": "\u526a\u5207\u884c",
"Copy row": "\u590d\u5236\u884c",
"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
"Delete column": "\u5220\u9664\u5217",
"Cols": "\u5217",
"Rows": "\u884c",
"Width": "\u5bbd",
"Height": "\u9ad8",
"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
"Show caption": "\u663e\u793a\u6807\u9898",
"Left": "\u5de6\u5bf9\u9f50",
"Center": "\u5c45\u4e2d",
"Right": "\u53f3\u5bf9\u9f50",
"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
"Scope": "\u8303\u56f4",
"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
"H Align": "\u6c34\u5e73\u5bf9\u9f50",
"V Align": "\u5782\u76f4\u5bf9\u9f50",
"Top": "\u9876\u90e8\u5bf9\u9f50",
"Middle": "\u5782\u76f4\u5c45\u4e2d",
"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
"Header cell": "\u8868\u5934\u5355\u5143\u683c",
"Row group": "\u884c\u7ec4",
"Column group": "\u5217\u7ec4",
"Row type": "\u884c\u7c7b\u578b",
"Header": "\u8868\u5934",
"Body": "\u8868\u4f53",
"Footer": "\u8868\u5c3e",
"Border color": "\u8fb9\u6846\u989c\u8272",
"Insert template...": "\u63d2\u5165\u6a21\u677f...",
"Templates": "\u6a21\u677f",
"Template": "\u6a21\u677f",
"Text color": "\u6587\u5b57\u989c\u8272",
"Background color": "\u80cc\u666f\u8272",
"Custom...": "\u81ea\u5b9a\u4e49...",
"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
"No color": "\u65e0",
"Remove color": "\u79fb\u9664\u989c\u8272",
"Table of Contents": "\u5185\u5bb9\u5217\u8868",
"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
"Word count": "\u5b57\u6570",
"Words: {0}": "\u5b57\u6570\uff1a{0}",
"{0} words": "{0} \u5b57",
"File": "\u6587\u4ef6",
"Edit": "\u7f16\u8f91",
"Insert": "\u63d2\u5165",
"View": "\u89c6\u56fe",
"Format": "\u683c\u5f0f",
"Table": "\u8868\u683c",
"Tools": "\u5de5\u5177",
"Powered by {0}": "\u7531{0}\u9a71\u52a8",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
"Image title": "\u56fe\u7247\u6807\u9898",
"Border width": "\u8fb9\u6846\u5bbd\u5ea6",
"Border style": "\u8fb9\u6846\u6837\u5f0f",
"Error": "\u9519\u8bef",
"Warn": "\u8b66\u544a",
"Valid": "\u6709\u6548",
"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846",
"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002",
"System Font": "\u7cfb\u7edf\u5b57\u4f53",
"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}",
"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}",
"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}",
"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}",
"example": "\u793a\u4f8b",
"Search": "\u641c\u7d22",
"All": "\u5168\u90e8",
"Currency": "\u8d27\u5e01",
"Text": "\u6587\u5b57",
"Quotations": "\u5f15\u7528",
"Mathematical": "\u6570\u5b66",
"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145",
"Symbols": "\u7b26\u53f7",
"Arrows": "\u7bad\u5934",
"User Defined": "\u81ea\u5b9a\u4e49",
"dollar sign": "\u7f8e\u5143\u7b26\u53f7",
"currency sign": "\u8d27\u5e01\u7b26\u53f7",
"euro-currency sign": "\u6b27\u5143\u7b26\u53f7",
"colon sign": "\u5192\u53f7",
"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7",
"french franc sign": "\u6cd5\u90ce\u7b26\u53f7",
"lira sign": "\u91cc\u62c9\u7b26\u53f7",
"mill sign": "\u5bc6\u5c14\u7b26\u53f7",
"naira sign": "\u5948\u62c9\u7b26\u53f7",
"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7",
"rupee sign": "\u5362\u6bd4\u7b26\u53f7",
"won sign": "\u97e9\u5143\u7b26\u53f7",
"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7",
"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7",
"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7",
"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7",
"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7",
"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7",
"peso sign": "\u6bd4\u7d22\u7b26\u53f7",
"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7",
"austral sign": "\u6fb3\u5143\u7b26\u53f7",
"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7",
"cedi sign": "\u585e\u5730\u7b26\u53f7",
"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7",
"spesmilo sign": "spesmilo\u7b26\u53f7",
"tenge sign": "\u575a\u6208\u7b26\u53f7",
"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4",
"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9",
"nordic mark sign": "\u5317\u6b27\u9a6c\u514b",
"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7",
"ruble sign": "\u5362\u5e03\u7b26\u53f7",
"yen character": "\u65e5\u5143\u5b57\u6837",
"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837",
"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09",
"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09",
"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...",
"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7",
"People": "\u4eba\u7c7b",
"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136",
"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1",
"Activity": "\u6d3b\u52a8",
"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9",
"Objects": "\u7269\u4ef6",
"Flags": "\u65d7\u5e1c",
"Characters": "\u5b57\u7b26",
"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)",
"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002",
"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002",
"Update": "\u66f4\u65b0",
"Color swatch": "\u989c\u8272\u6837\u672c",
"Turquoise": "\u9752\u7eff\u8272",
"Green": "\u7eff\u8272",
"Blue": "\u84dd\u8272",
"Purple": "\u7d2b\u8272",
"Navy Blue": "\u6d77\u519b\u84dd",
"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272",
"Dark Green": "\u6df1\u7eff\u8272",
"Medium Blue": "\u4e2d\u84dd\u8272",
"Medium Purple": "\u4e2d\u7d2b\u8272",
"Midnight Blue": "\u6df1\u84dd\u8272",
"Yellow": "\u9ec4\u8272",
"Orange": "\u6a59\u8272",
"Red": "\u7ea2\u8272",
"Light Gray": "\u6d45\u7070\u8272",
"Gray": "\u7070\u8272",
"Dark Yellow": "\u6697\u9ec4\u8272",
"Dark Orange": "\u6df1\u6a59\u8272",
"Dark Red": "\u6df1\u7ea2\u8272",
"Medium Gray": "\u4e2d\u7070\u8272",
"Dark Gray": "\u6df1\u7070\u8272",
"Black": "\u9ed1\u8272",
"White": "\u767d\u8272",
"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f",
"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846",
"history": "\u5386\u53f2",
"styles": "\u6837\u5f0f",
"formatting": "\u683c\u5f0f\u5316",
"alignment": "\u5bf9\u9f50",
"indentation": "\u7f29\u8fdb",
"permanent pen": "\u8bb0\u53f7\u7b14",
"comments": "\u5907\u6ce8",
"Anchor": "\u951a\u70b9",
"Special character": "\u7279\u6b8a\u7b26\u53f7",
"Code sample": "\u4ee3\u7801\u793a\u4f8b",
"Color": "\u989c\u8272",
"Emoticons": "\u8868\u60c5",
"Document properties": "\u6587\u6863\u5c5e\u6027",
"Image": "\u56fe\u7247",
"Insert link": "\u63d2\u5165\u94fe\u63a5",
"Target": "\u6253\u5f00\u65b9\u5f0f",
"Link": "\u94fe\u63a5",
"Poster": "\u5c01\u9762",
"Media": "\u5a92\u4f53",
"Print": "\u6253\u5370",
"Prev": "\u4e0a\u4e00\u4e2a",
"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
"Whole words": "\u5168\u5b57\u5339\u914d",
"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
"Caption": "\u6807\u9898",
"Insert template": "\u63d2\u5165\u6a21\u677f"
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}

@ -0,0 +1,31 @@
<script lang="ts" setup>
import 'dayjs/locale/zh-cn'
import { App, ConfigProvider } from 'ant-design-vue'
import { storeToRefs } from 'pinia'
import { computed } from 'vue'
import { AppProvider } from '@/components/Application'
import { useTitle } from '@/hooks/web/useTitle'
import { useLocale } from '@/locales/useLocale'
import { useAppStore } from '@/store/modules/app'
// support Multi-language
const { getAntdLocale } = useLocale()
const appStore = useAppStore()
const { themeConfig } = storeToRefs(appStore)
const componentSize = computed(() => appStore.getComponentSize)
// Listening to page changes and dynamically changing site titles
useTitle()
</script>
<template>
<ConfigProvider :locale="getAntdLocale" :theme="themeConfig" :component-size="componentSize">
<App class="h-full w-full">
<AppProvider>
<RouterView />
</AppProvider>
</App>
</ConfigProvider>
</template>

@ -0,0 +1,91 @@
import type { TentantNameVO } from './model/loginModel'
import { defHttp } from '@/utils/http/axios'
import { getRefreshToken } from '@/utils/auth'
enum Api {
Login = '/system/auth/login',
RefreshToken = '/system/auth/refresh-token?refreshToken=',
GetTenantIdByName = '/system/tenant/get-id-by-name?name=',
GetTenantIdByUserName = '/system/tenant/get-tenantId-by-userName?name=',
LoginOut = '/system/auth/logout',
GetUserInfo = '/system/auth/get-permission-info',
GetCaptcha = '/system/captcha/get',
CheckCaptcha = '/system/captcha/check',
}
// 刷新访问令牌
export function refreshToken() {
const refreshToken: string = getRefreshToken()
return defHttp.post({ url: Api.RefreshToken + refreshToken })
}
// 使用租户名,获得租户编号
export function getTenantIdByName(name: string) {
return defHttp.get<TentantNameVO>({ url: Api.GetTenantIdByName + name })
}
// 使用租户名,获得租户编号
export function getTenantIdByUserName(name: string) {
return defHttp.get<TentantNameVO>({ url: Api.GetTenantIdByUserName + name })
}
// 登出
export function loginOut() {
return defHttp.delete({ url: Api.LoginOut })
}
// 获取用户权限信息
export function getUserInfo() {
return defHttp.get({ url: Api.GetUserInfo })
}
// 获取登录验证码
export function sendSmsCode(mobile, scene) {
return defHttp.post({
url: '/system/auth/send-sms-code',
data: {
mobile,
scene,
},
})
}
// 获取验证图片 以及token
export function getCaptcha(data) {
return defHttp.post({ url: Api.GetCaptcha, data }, { isReturnNativeResponse: true })
}
// 滑动或者点选验证
export function checkCaptcha(data) {
return defHttp.post({ url: Api.CheckCaptcha, data }, { isReturnNativeResponse: true })
}
// ========== OAUTH 2.0 相关 ==========
export function getAuthorize(clientId) {
return defHttp.get({ url: `/system/oauth2/authorize?clientId=${clientId}` })
}
export function authorize(responseType, clientId, redirectUri, state, autoApprove, checkedScopes, uncheckedScopes) {
// 构建 scopes
const scopes = {}
for (const scope of checkedScopes)
scopes[scope] = true
for (const scope of uncheckedScopes)
scopes[scope] = false
// 发起请求
return defHttp.post({
url: '/system/oauth2/authorize',
headers: {
'Content-type': 'application/x-www-form-urlencoded',
},
params: {
response_type: responseType,
client_id: clientId,
redirect_uri: redirectUri,
state,
auto_approve: autoApprove,
scope: JSON.stringify(scopes),
},
})
}

@ -0,0 +1,9 @@
export interface UserLoginVO {
username: string
password: string
captchaVerification: string
}
export interface TentantNameVO {
id: number
}

@ -0,0 +1,12 @@
import type { RouteMeta } from 'vue-router'
export interface RouteItem {
path: string
component: any
meta: RouteMeta
name?: string
alias?: string | string[]
redirect?: string
caseSensitive?: boolean
children?: RouteItem[]
}

@ -0,0 +1,5 @@
export interface UploadApiResult {
message: string
code: number
url: string
}

@ -0,0 +1,45 @@
import type { RouteItem } from './menuModel'
/**
* @description: Login interface parameters
*/
export interface LoginParams {
username: string
password: string
captchaVerification: string
}
/**
* @description: SmsLogin interface parameters
*/
export interface SmsLoginParams {
mobile: number
code: number
}
/**
* @description: Login interface return value
*/
export interface LoginResultModel {
userId: string | number
accessToken: string
refreshToken: string
expiresTime: number
}
/**
* @description: Get user information return value
*/
export interface GetUserInfoModel {
roles: string[]
permissions: string[]
menus: RouteItem[]
// 用户id
user: userModel
}
export interface userModel {
id: string | number
avatar: string
nickname: string
}

@ -0,0 +1,128 @@
import { ContentTypeEnum } from '@/enums/httpEnum'
import { defHttp } from '@/utils/http/axios'
export interface ProfileDept {
id: number
name: string
}
export interface ProfileRole {
id: number
name: string
}
export interface ProfilePost {
id: number
name: string
}
export interface SocialUser {
id: number
type: number
openid: string
token: string
rawTokenInfo: string
nickname: string
avatar: string
rawUserInfo: string
code: string
state: string
}
export interface ProfileVO {
id: number
username: string
nickname: string
dept: ProfileDept
roles: ProfileRole[]
posts: ProfilePost[]
socialUsers: SocialUser[]
email: string
mobile: string
sex: number
avatar: string
status: number
remark: string
loginIp: string
loginDate: Date
createTime: Date
}
export interface UserProfileUpdateReqVO {
nickname: string
email: string
mobile: string
sex: number
}
enum Api {
getUserProfileApi = '/system/user/profile/get',
putUserProfileApi = '/system/user/profile/update',
uploadAvatarApi = '/system/user/profile/update-avatar',
updateUserPwdApi = '/system/user/profile/update-password',
socialBindApi = '/system/social-user/bind',
socialUnbindApi = '/system/social-user/unbind',
}
/**
* @description: getUserProfileApi
*/
export function getUserProfileApi() {
return defHttp.get({ url: Api.getUserProfileApi })
}
/**
* @description: updateUserProfileApi
*/
export function updateUserProfileApi(data: UserProfileUpdateReqVO) {
return defHttp.put({ url: Api.putUserProfileApi, data })
}
// 用户密码重置
export function updateUserPwdApi(oldPassword: string, newPassword: string) {
return defHttp.put({
url: Api.updateUserPwdApi,
data: {
oldPassword,
newPassword,
},
})
}
// 用户头像上传
export function uploadAvatarApi(data) {
return defHttp.put({
url: Api.uploadAvatarApi,
headers: {
'Content-type': ContentTypeEnum.FORM_DATA,
'ignoreCancelToken': true,
},
data,
})
}
// 社交绑定,使用 code 授权码
export function socialBind(type, code, state) {
return defHttp.post({
url: Api.socialBindApi,
data: {
type,
code,
state,
},
})
}
// 取消社交绑定
export function socialUnbind(type, openid) {
return defHttp.delete({
url: Api.socialUnbindApi,
data: {
type,
openid,
},
})
}
// 社交授权的跳转
export function socialAuthRedirect(type, redirectUri) {
return defHttp.get({
url: `/system/auth/social-auth-redirect?type=${type}&redirectUri=${redirectUri}`,
})
}

@ -0,0 +1,20 @@
import type { AxiosProgressEvent } from 'axios'
import type { UploadApiResult } from './model/uploadModel'
import { defHttp } from '@/utils/http/axios'
import type { UploadFileParams } from '@/types/axios'
import { useGlobSetting } from '@/hooks/setting'
const { uploadUrl = '' } = useGlobSetting()
/**
* @description: Upload interface
*/
export function uploadApi(params: UploadFileParams, onUploadProgress: (progressEvent: AxiosProgressEvent) => void) {
return defHttp.uploadFile<UploadApiResult>(
{
url: uploadUrl,
onUploadProgress,
},
params,
)
}

@ -0,0 +1,36 @@
import type { GetUserInfoModel, LoginParams, LoginResultModel, SmsLoginParams } from './model/userModel'
import { defHttp } from '@/utils/http/axios'
import type { ErrorMessageMode } from '@/types/axios'
enum Api {
Login = '/system/auth/login',
Logout = '/system/auth/logout',
SmsLogin = '/system/auth/sms-login',
GetUserInfo = '/system/auth/get-permission-info',
}
/**
* @description: user login api
*/
export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal') {
return defHttp.post<LoginResultModel>({ url: Api.Login, params }, { errorMessageMode: mode })
}
/**
* @description: user smslogin api
*/
export function smsLogin(params: SmsLoginParams, mode: ErrorMessageMode = 'modal') {
return defHttp.post<LoginResultModel>({ url: Api.SmsLogin, params }, { errorMessageMode: mode })
}
/**
* @description: getUserInfo
*/
export function getUserInfo() {
return defHttp.get<GetUserInfoModel>({ url: Api.GetUserInfo }, { errorMessageMode: 'none' })
}
export function doLogout() {
return defHttp.post({ url: Api.Logout })
}

@ -0,0 +1,5 @@
import { defHttp } from '@/utils/http/axios'
export function getActivityList(params) {
return defHttp.get({ url: '/bpm/activity/list', params })
}

@ -0,0 +1,13 @@
import { defHttp } from '@/utils/http/axios'
export function getProcessDefinitionPage(params) {
return defHttp.get({ url: '/bpm/process-definition/page', params })
}
export function getProcessDefinitionList(params) {
return defHttp.get({ url: '/bpm/process-definition/list', params })
}
export function getProcessDefinitionBpmnXML(id) {
return defHttp.get({ url: `/bpm/process-definition/get-bpmn-xml?id=${id}` })
}

@ -0,0 +1,41 @@
import { defHttp } from '@/utils/http/axios'
export interface FormVO {
id: number
name: string
conf: string
fields: string[]
status: number
remark: string
createTime: string
}
// 创建工作流的表单定义
export function createForm(data: FormVO) {
return defHttp.post({ url: '/bpm/form/create', data })
}
// 更新工作流的表单定义
export function updateForm(data: FormVO) {
return defHttp.put({ url: '/bpm/form/update', data })
}
// 删除工作流的表单定义
export function deleteForm(id: number) {
return defHttp.delete({ url: `/bpm/form/delete?id=${id}` })
}
// 获得工作流的表单定义
export function getForm(id: number) {
return defHttp.get({ url: `/bpm/form/get?id=${id}` })
}
// 获得工作流的表单定义分页
export function getFormPage(params) {
return defHttp.get({ url: '/bpm/form/page', params })
}
// 获得动态表单的精简列表
export function getSimpleForms() {
return defHttp.get({ url: '/bpm/form/list-all-simple' })
}

@ -0,0 +1,27 @@
import { defHttp } from '@/utils/http/axios'
export interface LeaveVO {
id: number
result: number
type: number
reason: string
processInstanceId: string
startTime: string
endTime: string
createTime: string
}
// 创建请假申请
export function createLeave(data: LeaveVO) {
return defHttp.post({ url: '/bpm/oa/leave/create', data })
}
// 获得请假申请
export function getLeave(id: number) {
return defHttp.get({ url: `/bpm/oa/leave/get?id=${id}` })
}
// 获得请假申请分页
export function getLeavePage(params) {
return defHttp.get({ url: '/bpm/oa/leave/page', params })
}

@ -0,0 +1,62 @@
import { defHttp } from '@/utils/http/axios'
export interface ProcessDefinitionVO {
id: string
version: number
deploymentTIme: string
suspensionState: number
}
export interface ModelVO {
id: number
formName: string
key: string
name: string
description: string
category: string
formType: number
formId: number
formCustomCreatePath: string
formCustomViewPath: string
processDefinition: ProcessDefinitionVO
status: number
remark: string
createTime: string
}
export function getModelPage(params) {
return defHttp.get({ url: '/bpm/model/page', params })
}
export function getModel(id: number) {
return defHttp.get({ url: `/bpm/model/get?id=${id}` })
}
export function updateModel(data: ModelVO) {
return defHttp.put({ url: '/bpm/model/update', data })
}
// 任务状态修改
export function updateModelState(id: number, state: number) {
const data = {
id,
state,
}
return defHttp.put({ url: '/bpm/model/update-state', data })
}
export function createModel(data: ModelVO) {
return defHttp.post({ url: '/bpm/model/create', data })
}
export function deleteModel(id: number) {
return defHttp.delete({ url: `/bpm/model/delete?id=${id}` })
}
export function deployModel(id: number) {
return defHttp.post({ url: `/bpm/model/deploy?id=${id}` })
}
export function importModel(data) {
return defHttp.post({ url: '/bpm/model/import', data })
}

@ -0,0 +1,21 @@
import { defHttp } from '@/utils/http/axios'
export function getMyProcessInstancePage(params) {
return defHttp.get({ url: '/bpm/process-instance/my-page', params })
}
export function createProcessInstance(data) {
return defHttp.post({ url: '/bpm/process-instance/create', data })
}
export function cancelProcessInstance(id: number, reason: string) {
const data = {
id,
reason,
}
return defHttp.delete({ url: '/bpm/process-instance/cancel', data })
}
export function getProcessInstance(id: number) {
return defHttp.get({ url: `/bpm/process-instance/get?id=${id}` })
}

@ -0,0 +1,39 @@
import { defHttp } from '@/utils/http/axios'
export function getTodoTaskPage(params) {
return defHttp.get({ url: '/bpm/task/todo-page', params })
}
export function getDoneTaskPage(params) {
return defHttp.get({ url: '/bpm/task/done-page', params })
}
export function completeTask(data) {
return defHttp.put({ url: '/bpm/task/complete', data })
}
export function approveTask(data) {
return defHttp.put({ url: '/bpm/task/approve', data })
}
export function rejectTask(data) {
return defHttp.put({ url: '/bpm/task/reject', data })
}
export function backTask(data) {
return defHttp.put({ url: '/bpm/task/back', data })
}
export function updateTaskAssignee(data) {
return defHttp.put({ url: '/bpm/task/update-assignee', data })
}
export function getTaskListByProcessInstanceId(processInstanceId) {
return defHttp.get({
url: `/bpm/task/list-by-process-instance-id?processInstanceId=${processInstanceId}`,
})
}
// 导出任务
export async function exportTask(params) {
return await defHttp.download({ url: '/bpm/task/export', params })
}

@ -0,0 +1,23 @@
import { defHttp } from '@/utils/http/axios'
export interface TaskAssignVO {
id: number
modelId: string
processDefinitionId: string
taskDefinitionKey: string
taskDefinitionName: string
options: string[]
type: number
}
export function getTaskAssignRuleList(params) {
return defHttp.get({ url: '/bpm/task-assign-rule/list', params })
}
export function createTaskAssignRule(data: TaskAssignVO) {
return defHttp.post({ url: '/bpm/task-assign-rule/create', data })
}
export function updateTaskAssignRule(data: TaskAssignVO) {
return defHttp.put({ url: '/bpm/task-assign-rule/update', data })
}

@ -0,0 +1,41 @@
import { defHttp } from '@/utils/http/axios'
export interface UserGroupVO {
id: number
name: string
description: string
memberUserIds: number[]
status: number
remark: string
createTime: string
}
// 创建用户组
export function createUserGroup(data: UserGroupVO) {
return defHttp.post({ url: '/bpm/user-group/create', data })
}
// 更新用户组
export function updateUserGroup(data: UserGroupVO) {
return defHttp.put({ url: '/bpm/user-group/update', data })
}
// 删除用户组
export function deleteUserGroup(id: number) {
return defHttp.delete({ url: `/bpm/user-group/delete?id=${id}` })
}
// 获得用户组
export function getUserGroup(id: number) {
return defHttp.get({ url: `/bpm/user-group/get?id=${id}` })
}
// 获得用户组分页
export function getUserGroupPage(params) {
return defHttp.get({ url: '/bpm/user-group/page', params })
}
// 获取用户组精简信息列表
export function listSimpleUserGroups() {
return defHttp.get({ url: '/bpm/user-group/list-all-simple' })
}

@ -0,0 +1,50 @@
import { defHttp } from '@/utils/http/axios'
export interface ApiAccessLogVO {
id: number
traceId: string
userId: number
userType: number
applicationName: string
requestMethod: string
requestParams: string
requestUrl: string
userIp: string
userAgent: string
beginTime: Date
endTIme: Date
duration: number
resultCode: number
resultMsg: string
createTime: Date
}
export interface ApiAccessLogPageReqVO extends PageParam {
userId?: number
userType?: number
applicationName?: string
requestUrl?: string
beginTime?: Date[]
duration?: number
resultCode?: number
}
export interface ApiAccessLogExportReqVO {
userId?: number
userType?: number
applicationName?: string
requestUrl?: string
beginTime?: Date[]
duration?: number
resultCode?: number
}
// 查询列表API 访问日志
export function getApiAccessLogPage(params: ApiAccessLogPageReqVO) {
return defHttp.get({ url: '/infra/api-access-log/page', params })
}
// 导出API 访问日志
export function exportApiAccessLog(params: ApiAccessLogExportReqVO) {
return defHttp.download({ url: '/infra/api-access-log/export-excel', params }, '访问日志.xls')
}

@ -0,0 +1,69 @@
import { defHttp } from '@/utils/http/axios'
export interface ApiErrorLogVO {
id: number
traceId: string
userId: number
userType: number
applicationName: string
requestMethod: string
requestParams: string
requestUrl: string
userIp: string
userAgent: string
exceptionTime: Date
exceptionName: string
exceptionMessage: string
exceptionRootCauseMessage: string
exceptionStackTrace: string
exceptionClassName: string
exceptionFileName: string
exceptionMethodName: string
exceptionLineNumber: number
processUserId: number
processStatus: number
processTime: Date
resultCode: number
createTime: Date
}
export interface ApiErrorLogPageReqVO extends PageParam {
userId?: number
userType?: number
applicationName?: string
requestUrl?: string
exceptionTime?: Date[]
processStatus: number
}
export interface ApiErrorLogExportReqVO {
userId?: number
userType?: number
applicationName?: string
requestUrl?: string
exceptionTime?: Date[]
processStatus: number
}
// 查询列表API 访问日志
export function getApiErrorLogPage(params: ApiErrorLogPageReqVO) {
return defHttp.get({ url: '/infra/api-error-log/page', params })
}
// 更新 API 错误日志的处理状态
export function updateApiErrorLogProcess(id: number, processStatus: number) {
return defHttp.put({
url: `/infra/api-error-log/update-status?id=${id}&processStatus=${processStatus}`,
})
}
// 导出API 错误日志
export function exportApiErrorLog(params: ApiErrorLogExportReqVO) {
return defHttp.download(
{
url: '/infra/api-error-log/export-excel',
params,
},
'错误日志.xls',
)
}

@ -0,0 +1,57 @@
import type { CodegenCreateListReqVO, CodegenUpdateReqVO } from './types'
import { defHttp } from '@/utils/http/axios'
// 查询列表代码生成表定义
export function getCodegenTablePage(params) {
return defHttp.get({ url: '/infra/codegen/table/page', params })
}
// 查询详情代码生成表定义
export function getCodegenTable(id: number) {
return defHttp.get({ url: `/infra/codegen/detail?tableId=${id}` })
}
// 新增代码生成表定义
export function createCodegenTable(data: CodegenCreateListReqVO) {
return defHttp.post({ url: '/infra/codegen/create', data })
}
// 修改代码生成表定义
export function updateCodegenTable(data: CodegenUpdateReqVO) {
return defHttp.put({ url: '/infra/codegen/update', data })
}
// 基于数据库的表结构,同步数据库的表和字段定义
export function syncCodegenFromDB(id: number) {
return defHttp.put({ url: `/infra/codegen/sync-from-db?tableId=${id}` })
}
// 基于 SQL 建表语句,同步数据库的表和字段定义
export function syncCodegenFromSQL(id: number, sql: string) {
return defHttp.put({ url: `/infra/codegen/sync-from-sql?tableId=${id}&sql=${sql}` })
}
// 预览生成代码
export function previewCodegen(id: number) {
return defHttp.get({ url: `/infra/codegen/preview?tableId=${id}` })
}
// 下载生成代码
export function downloadCodegen(data) {
return defHttp.download({ url: `/infra/codegen/download?tableId=${data.id}` }, `${data.tableName}.zip`)
}
// 获得表定义
export function getSchemaTableList(params) {
return defHttp.get({ url: '/infra/codegen/db/table/list', params })
}
// 基于数据库的表结构,创建代码生成器的表定义
export function createCodegenList(data) {
return defHttp.post({ url: '/infra/codegen/create-list', data })
}
// 删除代码生成表定义
export function deleteCodegenTable(id: number) {
return defHttp.delete({ url: `/infra/codegen/delete?tableId=${id}` })
}

@ -0,0 +1,61 @@
export interface CodegenTableVO {
id: number
tableId: number
isParentMenuIdValid: boolean
dataSourceConfigId: number
scene: number
tableName: string
tableComment: string
remark: string
moduleName: string
businessName: string
className: string
classComment: string
author: string
createTime: Date
updateTime: Date
templateType: number
parentMenuId: number
}
export interface CodegenColumnVO {
id: number
tableId: number
columnName: string
dataType: string
columnComment: string
nullable: number
primaryKey: number
autoIncrement: string
ordinalPosition: number
javaType: string
javaField: string
dictType: string
example: string
createOperation: number
updateOperation: number
listOperation: number
listOperationCondition: string
listOperationResult: number
htmlType: string
}
export interface DatabaseTableVO {
name: string
comment: string
}
export interface CodegenDetailVO {
table: CodegenTableVO
columns: CodegenColumnVO[]
}
export interface CodegenPreviewVO {
filePath: string
code: string
}
export interface CodegenUpdateReqVO {
table: CodegenTableVO
columns: CodegenColumnVO[]
}
export interface CodegenCreateListReqVO {
dataSourceConfigId: number
tableNames: string[]
}

@ -0,0 +1,62 @@
import { defHttp } from '@/utils/http/axios'
export interface ConfigVO {
id: number
category: string
name: string
key: string
value: string
type: number
visible: boolean
remark: string
createTime: Date
}
export interface ConfigPageReqVO extends PageParam {
name?: string
key?: string
type?: number
createTime?: Date[]
}
export interface ConfigExportReqVO {
name?: string
key?: string
type?: number
createTime?: Date[]
}
// 查询参数列表
export function getConfigPage(params: ConfigPageReqVO) {
return defHttp.get({ url: '/infra/config/page', params })
}
// 查询参数详情
export function getConfig(id: number) {
return defHttp.get({ url: `/infra/config/get?id=${id}` })
}
// 根据参数键名查询参数值
export function getConfigKey(configKey: string) {
return defHttp.get({ url: `/infra/config/get-value-by-key?key=${configKey}` })
}
// 新增参数
export function createConfig(data: ConfigVO) {
return defHttp.post({ url: '/infra/config/create', data })
}
// 修改参数
export function updateConfig(data: ConfigVO) {
return defHttp.put({ url: '/infra/config/update', data })
}
// 删除参数
export function deleteConfig(id: number) {
return defHttp.delete({ url: `/infra/config/delete?id=${id}` })
}
// 导出参数
export function exportConfig(params: ConfigExportReqVO) {
return defHttp.download({ url: '/infra/config/export', params }, '参数.xls')
}

@ -0,0 +1,35 @@
import { defHttp } from '@/utils/http/axios'
export interface DataSourceConfigVO {
id: number
name: string
url: string
username: string
password: string
createTime: Date
}
// 查询数据源配置列表
export function getDataSourceConfigList() {
return defHttp.get({ url: '/infra/data-source-config/list' })
}
// 查询数据源配置详情
export function getDataSourceConfig(id: number) {
return defHttp.get({ url: `/infra/data-source-config/get?id=${id}` })
}
// 新增数据源配置
export function createDataSourceConfig(data: DataSourceConfigVO) {
return defHttp.post({ url: '/infra/data-source-config/create', data })
}
// 修改数据源配置
export function updateDataSourceConfig(data: DataSourceConfigVO) {
return defHttp.put({ url: '/infra/data-source-config/update', data })
}
// 删除数据源配置
export function deleteDataSourceConfig(id: number) {
return defHttp.delete({ url: `/infra/data-source-config/delete?id=${id}` })
}

@ -0,0 +1,16 @@
import { defHttp } from '@/utils/http/axios'
// 导出Html
export function exportHtml() {
return defHttp.get({ url: '/infra/db-doc/export-html', responseType: 'blob' })
}
// 导出Word
export function exportWord() {
return defHttp.get({ url: '/infra/db-doc/export-word', responseType: 'blob' })
}
// 导出Markdown
export function exportMarkdown() {
return defHttp.get({ url: '/infra/db-doc/export-markdown', responseType: 'blob' })
}

@ -0,0 +1,28 @@
import { defHttp } from '@/utils/http/axios'
export interface FileVO {
id: number
configId: number
path: string
name: string
url: string
size: string
type: string
createTime: Date
}
export interface FilePageReqVO extends PageParam {
path?: string
type?: string
createTime?: Date[]
}
// 查询文件列表
export function getFilePage(params: FilePageReqVO) {
return defHttp.get({ url: '/infra/file/page', params })
}
// 删除文件
export function deleteFile(id: number) {
return defHttp.delete({ url: `/infra/file/delete?id=${id}` })
}

@ -0,0 +1,66 @@
import { defHttp } from '@/utils/http/axios'
export interface FileClientConfig {
basePath: string
host?: string
port?: number
username?: string
password?: string
mode?: string
endpoint?: string
bucket?: string
accessKey?: string
accessSecret?: string
domain: string
}
export interface FileConfigVO {
id: number
name: string
storage: number
master: boolean
visible: boolean
config: FileClientConfig
remark: string
createTime: Date
}
export interface FileConfigPageReqVO extends PageParam {
name?: string
storage?: number
createTime?: Date[]
}
// 查询文件配置列表
export function getFileConfigPage(params: FileConfigPageReqVO) {
return defHttp.get({ url: '/infra/file-config/page', params })
}
// 查询文件配置详情
export function getFileConfig(id: number) {
return defHttp.get({ url: `/infra/file-config/get?id=${id}` })
}
// 更新文件配置为主配置
export function updateFileConfigMaster(id: number) {
return defHttp.put({ url: `/infra/file-config/update-master?id=${id}` })
}
// 新增文件配置
export function createFileConfig(data: FileConfigVO) {
return defHttp.post({ url: '/infra/file-config/create', data })
}
// 修改文件配置
export function updateFileConfig(data: FileConfigVO) {
return defHttp.put({ url: '/infra/file-config/update', data })
}
// 删除文件配置
export function deleteFileConfig(id: number) {
return defHttp.delete({ url: `/infra/file-config/delete?id=${id}` })
}
// 测试文件配置
export function testFileConfig(id: number) {
return defHttp.get({ url: `/infra/file-config/test?id=${id}` })
}

@ -0,0 +1,71 @@
import { defHttp } from '@/utils/http/axios'
export interface JobVO {
id: number
name: string
status: number
handlerName: string
handlerParam: string
cronExpression: string
retryCount: number
retryInterval: number
monitorTimeout: number
createTime: Date
}
export interface JobPageReqVO extends PageParam {
name?: string
status?: number
handlerName?: string
}
export interface JobExportReqVO {
name?: string
status?: number
handlerName?: string
}
// 任务列表
export function getJobPage(params: JobPageReqVO) {
return defHttp.get({ url: '/infra/job/page', params })
}
// 任务详情
export function getJob(id: number) {
return defHttp.get({ url: `/infra/job/get?id=${id}` })
}
// 新增任务
export function createJob(data: JobVO) {
return defHttp.post({ url: '/infra/job/create', data })
}
// 修改定时任务调度
export function updateJob(data: JobVO) {
return defHttp.put({ url: '/infra/job/update', data })
}
// 删除定时任务调度
export function deleteJob(id: number) {
return defHttp.delete({ url: `/infra/job/delete?id=${id}` })
}
// 导出定时任务调度
export function exportJob(params: JobExportReqVO) {
return defHttp.download({ url: '/infra/job/export-excel', params }, '定时任务.xls')
}
// 任务状态修改
export function updateJobStatus(id: number, status: number) {
return defHttp.put({ url: `/infra/job/update-status?id=${id}&status=${status}` })
}
// 定时任务立即执行一次
export function runJob(id: number) {
return defHttp.put({ url: `/infra/job/trigger?id=${id}` })
}
// 获得定时任务的下 n 次执行时间
export function getJobNextTimes(id: number) {
return defHttp.get({ url: `/infra/job/get_next_times?id=${id}` })
}

@ -0,0 +1,46 @@
import { defHttp } from '@/utils/http/axios'
export interface JobLogVO {
id: number
jobId: number
handlerName: string
handlerParam: string
cronExpression: string
executeIndex: string
beginTime: string
endTime: string
duration: string
status: number
createTime: string
}
export interface JobLogPageReqVO extends PageParam {
jobId?: number
handlerName?: string
beginTime?: string
endTime?: string
status?: number
}
export interface JobLogExportReqVO {
jobId?: number
handlerName?: string
beginTime?: string
endTime?: string
status?: number
}
// 任务日志列表
export function getJobLogPage(params: JobLogPageReqVO) {
return defHttp.get({ url: '/infra/job-log/page', params })
}
// 任务日志详情
export function getJobLog(id: number) {
return defHttp.get({ url: `/infra/job-log/get?id=${id}` })
}
// 导出定时任务日志
export function exportJobLog(params: JobLogExportReqVO) {
return defHttp.download({ url: '/infra/job-log/export-excel', params }, '定时任务日志.xls')
}

@ -0,0 +1,8 @@
import { defHttp } from '@/utils/http/axios'
/**
* redis
*/
export function getCache() {
return defHttp.get({ url: '/infra/redis/get-monitor-info' })
}

@ -0,0 +1,185 @@
export interface RedisMonitorInfoVO {
info: RedisInfoVO
dbSize: number
commandStats: RedisCommandStatsVO[]
}
export interface RedisInfoVO {
io_threaded_reads_processed: string
tracking_clients: string
uptime_in_seconds: string
cluster_connections: string
current_cow_size: string
maxmemory_human: string
aof_last_cow_size: string
master_replid2: string
mem_replication_backlog: string
aof_rewrite_scheduled: string
total_net_input_bytes: string
rss_overhead_ratio: string
hz: string
current_cow_size_age: string
redis_build_id: string
errorstat_BUSYGROUP: string
aof_last_bgrewrite_status: string
multiplexing_api: string
client_recent_max_output_buffer: string
allocator_resident: string
mem_fragmentation_bytes: string
aof_current_size: string
repl_backlog_first_byte_offset: string
tracking_total_prefixes: string
redis_mode: string
redis_git_dirty: string
aof_delayed_fsync: string
allocator_rss_bytes: string
repl_backlog_histlen: string
io_threads_active: string
rss_overhead_bytes: string
total_system_memory: string
loading: string
evicted_keys: string
maxclients: string
cluster_enabled: string
redis_version: string
repl_backlog_active: string
mem_aof_buffer: string
allocator_frag_bytes: string
io_threaded_writes_processed: string
instantaneous_ops_per_sec: string
used_memory_human: string
total_error_replies: string
role: string
maxmemory: string
used_memory_lua: string
rdb_current_bgsave_time_sec: string
used_memory_startup: string
used_cpu_sys_main_thread: string
lazyfree_pending_objects: string
aof_pending_bio_fsync: string
used_memory_dataset_perc: string
allocator_frag_ratio: string
arch_bits: string
used_cpu_user_main_thread: string
mem_clients_normal: string
expired_time_cap_reached_count: string
unexpected_error_replies: string
mem_fragmentation_ratio: string
aof_last_rewrite_time_sec: string
master_replid: string
aof_rewrite_in_progress: string
lru_clock: string
maxmemory_policy: string
run_id: string
latest_fork_usec: string
tracking_total_items: string
total_commands_processed: string
expired_keys: string
errorstat_ERR: string
used_memory: string
module_fork_in_progress: string
errorstat_WRONGPASS: string
aof_buffer_length: string
dump_payload_sanitizations: string
mem_clients_slaves: string
keyspace_misses: string
server_time_usec: string
executable: string
lazyfreed_objects: string
db0: string
used_memory_peak_human: string
keyspace_hits: string
rdb_last_cow_size: string
aof_pending_rewrite: string
used_memory_overhead: string
active_defrag_hits: string
tcp_port: string
uptime_in_days: string
used_memory_peak_perc: string
current_save_keys_processed: string
blocked_clients: string
total_reads_processed: string
expire_cycle_cpu_milliseconds: string
sync_partial_err: string
used_memory_scripts_human: string
aof_current_rewrite_time_sec: string
aof_enabled: string
process_supervised: string
master_repl_offset: string
used_memory_dataset: string
used_cpu_user: string
rdb_last_bgsave_status: string
tracking_total_keys: string
atomicvar_api: string
allocator_rss_ratio: string
client_recent_max_input_buffer: string
clients_in_timeout_table: string
aof_last_write_status: string
mem_allocator: string
used_memory_scripts: string
used_memory_peak: string
process_id: string
master_failover_state: string
errorstat_NOAUTH: string
used_cpu_sys: string
repl_backlog_size: string
connected_slaves: string
current_save_keys_total: string
gcc_version: string
total_system_memory_human: string
sync_full: string
connected_clients: string
module_fork_last_cow_size: string
total_writes_processed: string
allocator_active: string
total_net_output_bytes: string
pubsub_channels: string
current_fork_perc: string
active_defrag_key_hits: string
rdb_changes_since_last_save: string
instantaneous_input_kbps: string
used_memory_rss_human: string
configured_hz: string
expired_stale_perc: string
active_defrag_misses: string
used_cpu_sys_children: string
number_of_cached_scripts: string
sync_partial_ok: string
used_memory_lua_human: string
rdb_last_save_time: string
pubsub_patterns: string
slave_expires_tracked_keys: string
redis_git_sha1: string
used_memory_rss: string
rdb_last_bgsave_time_sec: string
os: string
mem_not_counted_for_evict: string
active_defrag_running: string
rejected_connections: string
aof_rewrite_buffer_length: string
total_forks: string
active_defrag_key_misses: string
allocator_allocated: string
aof_base_size: string
instantaneous_output_kbps: string
second_repl_offset: string
rdb_bgsave_in_progress: string
used_cpu_user_children: string
total_connections_received: string
migrate_cached_sockets: string
}
export interface RedisCommandStatsVO {
command: string
calls: number
usec: number
}
export interface RedisKeyInfo {
keyTemplate: string
keyType: string
valueType: string
timeoutType: number
timeout: number
memo: string
}

@ -0,0 +1,15 @@
import { defHttp } from '@/utils/http/axios'
export interface AddressVO {
id: number
name: string
mobile: string
areaId: number
detailAddress: string
defaultStatus: boolean
}
// 查询用户收件地址列表
export function getAddressList(params) {
return defHttp.get({ url: '/member/address/list', params })
}

@ -0,0 +1,38 @@
import { defHttp } from '@/utils/http/axios'
export interface GroupVO {
id: number
name: string
remark: string
status: number
}
// 查询用户分组列表
export function getGroupPage(params: any) {
return defHttp.get({ url: '/member/group/page', params })
}
// 查询用户分组详情
export function getGroup(id: number) {
return defHttp.get({ url: `/member/group/get?id=${id}` })
}
// 新增用户分组
export function createGroup(data: GroupVO) {
return defHttp.post({ url: '/member/group/create', data })
}
// 查询用户分组 - 精简信息列表
export function getSimpleGroupList() {
return defHttp.get({ url: '/member/group/list-all-simple' })
}
// 修改用户分组
export function updateGroup(data: GroupVO) {
return defHttp.put({ url: '/member/group/update', data })
}
// 删除用户分组
export function deleteGroup(id: number) {
return defHttp.delete({ url: `/member/group/delete?id=${id}` })
}

@ -0,0 +1,42 @@
import { defHttp } from '@/utils/http/axios'
export interface LevelVO {
id: number
name: string
experience: number
value: number
discountPercent: number
icon: string
bgUrl: string
status: number
}
// 查询会员等级列表
export function getLevelList(params) {
return defHttp.get({ url: '/member/level/list', params })
}
// 查询会员等级详情
export function getLevel(id: number) {
return defHttp.get({ url: `/member/level/get?id=${id}` })
}
// 查询会员等级 - 精简信息列表
export function getSimpleLevelList() {
return defHttp.get({ url: '/member/level/list-all-simple' })
}
// 新增会员等级
export function createLevel(data: LevelVO) {
return defHttp.post({ url: '/member/level/create', data })
}
// 修改会员等级
export function updateLevel(data: LevelVO) {
return defHttp.put({ url: '/member/level/update', data })
}
// 删除会员等级
export function deleteLevel(id: number) {
return defHttp.delete({ url: `/member/level/delete?id=${id}` })
}

@ -0,0 +1,19 @@
import { defHttp } from '@/utils/http/axios'
export interface ConfigVO {
id: number
tradeDeductEnable: number
tradeDeductUnitPrice: number
tradeDeductMaxPrice: number
tradeGivePoint: number
}
// 查询积分设置详情
export function getConfig() {
return defHttp.get({ url: '/member/point/config/get' })
}
// 新增修改积分设置
export function saveConfig(data: ConfigVO) {
return defHttp.put({ url: '/member/point/config/save', data })
}

@ -0,0 +1,21 @@
import { defHttp } from '@/utils/http/axios'
export interface RecordVO {
id: number
bizId: string
bizType: string
title: string
description: string
point: number
totalPoint: number
status: number
userId: number
freezingTime: Date
thawingTime: Date
createDate: Date
}
// 查询用户积分记录列表
export function getRecordPage(params) {
return defHttp.get({ url: '/member/point/record/page', params })
}

@ -0,0 +1,33 @@
import { defHttp } from '@/utils/http/axios'
export interface SignInConfigVO {
id: number
day: number | null
point: number | null
enable: boolean | null
}
// 查询积分签到规则列表
export function getSignInConfigList() {
return defHttp.get({ url: '/member/point/sign-in-config/list' })
}
// 查询积分签到规则详情
export function getSignInConfig(id: number) {
return defHttp.get({ url: `/member/point/sign-in-config/get?id=${id}` })
}
// 新增积分签到规则
export function createSignInConfig(data: SignInConfigVO) {
return defHttp.post({ url: '/member/point/sign-in-config/create', data })
}
// 修改积分签到规则
export function updateSignInConfig(data: SignInConfigVO) {
return defHttp.put({ url: '/member/point/sign-in-config/update', data })
}
// 删除积分签到规则
export function deleteSignInConfig(id: number) {
return defHttp.delete({ url: `/member/point/sign-in-config/delete?id=${id}` })
}

@ -0,0 +1,13 @@
import { defHttp } from '@/utils/http/axios'
export interface SignInRecordVO {
id: number
userId: number
day: number
point: number
}
// 查询用户签到积分列表
export function getSignInRecordPage(params) {
return defHttp.get({ url: '/member/point/sign-in-record/page', params })
}

@ -0,0 +1,36 @@
import { defHttp } from '@/utils/http/axios'
export interface TagVO {
id: number
name: string
}
// 查询会员标签列表
export function getMemberTagPage(params) {
return defHttp.get({ url: '/member/tag/page', params })
}
// 查询会员标签详情
export function getMemberTag(id: number) {
return defHttp.get({ url: `/member/tag/get?id=${id}` })
}
// 查询会员标签 - 精简信息列表
export function getSimpleTagList() {
return defHttp.get({ url: '/member/tag/list-all-simple' })
}
// 新增会员标签
export function createMemberTag(data: TagVO) {
return defHttp.post({ url: '/member/tag/create', data })
}
// 修改会员标签
export function updateMemberTag(data: TagVO) {
return defHttp.put({ url: '/member/tag/update', data })
}
// 删除会员标签
export function deleteMemberTag(id: number) {
return defHttp.delete({ url: `/member/tag/delete?id=${id}` })
}

@ -0,0 +1,39 @@
import { defHttp } from '@/utils/http/axios'
export interface UserVO {
id: number
mobile: string
password: string
status: number
registerIp: string
loginIp: string
loginDate: Date
nickname: string
avatar: string
name: string
sex: number
areaId: number
birthday: Date
mark: string
createTime: Date
}
// 查询会员用户列表
export function getUserPage(params) {
return defHttp.get({ url: '/member/user/page', params })
}
// 查询会员用户详情
export function getUser(id: number) {
return defHttp.get({ url: `/member/user/get?id=${id}` })
}
// 修改会员用户
export function updateUser(data: UserVO) {
return defHttp.put({ url: '/member/user/update', data })
}
// 修改会员用户等级
export function updateUserLevel(data: any) {
return defHttp.put({ url: '/member/user/update-level', data })
}

@ -0,0 +1,46 @@
import { defHttp } from '@/utils/http/axios'
export interface AccountVO {
id?: number
name: string
}
// 创建公众号账号
export function createAccount(data) {
return defHttp.post({ url: '/mp/account/create', data })
}
// 更新公众号账号
export function updateAccount(data) {
return defHttp.put({ url: '/mp/account/update', data })
}
// 删除公众号账号
export function deleteAccount(id) {
return defHttp.delete({ url: `/mp/account/delete?id=${id}`, method: 'delete' })
}
// 获得公众号账号
export function getAccount(id) {
return defHttp.get({ url: `/mp/account/get?id=${id}` })
}
// 获得公众号账号分页
export function getAccountPage(params) {
return defHttp.get({ url: '/mp/account/page', params })
}
// 获取公众号账号精简信息列表
export function getSimpleAccounts() {
return defHttp.get({ url: '/mp/account/list-all-simple' })
}
// 生成公众号二维码
export function generateAccountQrCode(id) {
return defHttp.put({ url: `/mp/account/generate-qr-code?id=${id}` })
}
// 清空公众号 API 配额
export function clearAccountQuota(id) {
return defHttp.put({ url: `/mp/account/clear-quota?id=${id}` })
}

@ -0,0 +1,26 @@
import { defHttp } from '@/utils/http/axios'
// 创建公众号的自动回复
export function createAutoReply(data) {
return defHttp.post({ url: '/mp/auto-reply/create', data })
}
// 更新公众号的自动回复
export function updateAutoReply(data) {
return defHttp.put({ url: '/mp/auto-reply/update', data })
}
// 删除公众号的自动回复
export function deleteAutoReply(id) {
return defHttp.delete({ url: `/mp/auto-reply/delete?id=${id}` })
}
// 获得公众号的自动回复
export function getAutoReply(id) {
return defHttp.get({ url: `/mp/auto-reply/get?id=${id}` })
}
// 获得公众号的自动回复分页
export function getAutoReplyPage(params) {
return defHttp.get({ url: '/mp/auto-reply/page', params })
}

@ -0,0 +1,26 @@
import { defHttp } from '@/utils/http/axios'
// 获得公众号草稿分页
export function getDraftPage(params) {
return defHttp.get({ url: '/mp/draft/page', params })
}
// 创建公众号草稿
export function createDraft(accountId, articles) {
return defHttp.post({
url: `/mp/draft/create?accountId=${accountId}`,
data: {
articles,
},
})
}
// 更新公众号草稿
export function updateDraft(accountId, mediaId, articles) {
return defHttp.put({ url: `/mp/draft/update?accountId=${accountId}&mediaId=${mediaId}`, data: articles })
}
// 删除公众号草稿
export function deleteDraft(accountId, mediaId) {
return defHttp.delete({ url: `/mp/draft/delete?accountId=${accountId}&mediaId=${mediaId}` })
}

@ -0,0 +1,16 @@
import { defHttp } from '@/utils/http/axios'
// 获得公众号素材分页
export function getFreePublishPage(params) {
return defHttp.get({ url: '/mp/free-publish/page', params })
}
// 删除公众号素材
export function deleteFreePublish(accountId, articleId) {
return defHttp.delete({ url: `/mp/free-publish/delete?accountId=${accountId}&&articleId=${articleId}` })
}
// 发布公众号素材
export function submitFreePublish(accountId, mediaId) {
return defHttp.post({ url: `/mp/free-publish/submit?accountId=${accountId}&&mediaId=${mediaId}` })
}

@ -0,0 +1,11 @@
import { defHttp } from '@/utils/http/axios'
// 获得公众号素材分页
export function getMaterialPage(params) {
return defHttp.get({ url: '/mp/material/page', params })
}
// 删除公众号永久素材
export function deletePermanentMaterial(id) {
return defHttp.delete({ url: `/mp/material/delete-permanent?id=${id}` })
}

@ -0,0 +1,22 @@
import { defHttp } from '@/utils/http/axios'
// 获得公众号菜单列表
export function getMenuList(accountId) {
return defHttp.get({ url: `/mp/menu/list?accountId=${accountId}` })
}
// 保存公众号菜单
export function saveMenu(accountId, menus) {
return defHttp.post({
url: '/mp/menu/save',
data: {
accountId,
menus,
},
})
}
// 删除公众号菜单
export function deleteMenu(accountId) {
return defHttp.delete({ url: `/mp/menu/delete?accountId=${accountId}` })
}

@ -0,0 +1,11 @@
import { defHttp } from '@/utils/http/axios'
// 获得公众号消息分页
export function getMessagePage(params) {
return defHttp.get({ url: '/mp/message/page', params })
}
// 给粉丝发送消息
export function sendMessage(data) {
return defHttp.post({ url: '/mp/message/send', data })
}

@ -0,0 +1,21 @@
import { defHttp } from '@/utils/http/axios'
// 更新公众号粉丝
export function updateUser(data) {
return defHttp.put({ url: '/mp/user/update', data })
}
// 获得公众号粉丝
export function getUser(id) {
return defHttp.get({ url: `/mp/user/get?id=${id}` })
}
// 获得公众号粉丝分页
export function getUserPage(params) {
return defHttp.get({ url: '/mp/user/page', params })
}
// 同步公众号粉丝
export function syncUser(accountId) {
return defHttp.post({ url: `/mp/user/sync?accountId=${accountId}` })
}

@ -0,0 +1,21 @@
import { defHttp } from '@/utils/http/axios'
// 获取消息发送概况数据
export function getUpstreamMessage(params) {
return defHttp.get({ url: '/mp/statistics/upstream-message', params })
}
// 用户增减数据
export function getUserSummary(params) {
return defHttp.get({ url: '/mp/statistics/user-summary', params })
}
// 获得用户累计数据
export function getUserCumulate(params) {
return defHttp.get({ url: '/mp/statistics/user-cumulate', params })
}
// 获得接口分析数据
export function getInterfaceSummary(params) {
return defHttp.get({ url: '/mp/statistics/interface-summary', params })
}

@ -0,0 +1,36 @@
import { defHttp } from '@/utils/http/axios'
// 创建公众号标签
export function createTag(data) {
return defHttp.post({ url: '/mp/tag/create', data })
}
// 更新公众号标签
export function updateTag(data) {
return defHttp.put({ url: '/mp/tag/update', data })
}
// 删除公众号标签
export function deleteTag(id) {
return defHttp.delete({ url: `/mp/tag/delete?id=${id}` })
}
// 获得公众号标签
export function getTag(id) {
return defHttp.get({ url: `/mp/tag/get?id=${id}` })
}
// 获得公众号标签分页
export function getTagPage(params) {
return defHttp.get({ url: '/mp/tag/page', params })
}
// 获取公众号标签精简信息列表
export function getSimpleTags() {
return defHttp.get({ url: '/mp/tag/list-all-simple' })
}
// 同步公众号标签
export function syncTag(accountId) {
return defHttp.post({ url: `/mp/tag/sync?accountId=${accountId}` })
}

@ -0,0 +1,63 @@
import { defHttp } from '@/utils/http/axios'
export interface AppVO {
id: number
name: string
status: number
remark: string
payNotifyUrl: string
refundNotifyUrl: string
merchantId: number
merchantName: string
createTime: Date
}
export interface AppPageReqVO extends PageParam {
name?: string
status?: number
remark?: string
payNotifyUrl?: string
refundNotifyUrl?: string
merchantName?: string
createTime?: Date[]
}
export interface AppUpdateStatusReqVO {
id: number
status: number
}
// 查询列表支付应用
export function getAppPage(params: AppPageReqVO) {
return defHttp.get({ url: '/pay/app/page', params })
}
// 查询详情支付应用
export function getApp(id: number) {
return defHttp.get({ url: `/pay/app/get?id=${id}` })
}
// 新增支付应用
export function createApp(data: AppVO) {
return defHttp.post({ url: '/pay/app/create', data })
}
// 修改支付应用
export function updateApp(data: AppVO) {
return defHttp.put({ url: '/pay/app/update', data })
}
// 支付应用信息状态修改
export function changeAppStatus(data: AppUpdateStatusReqVO) {
return defHttp.put({ url: '/pay/app/update-status', data })
}
// 删除支付应用
export function deleteApp(id: number) {
return defHttp.delete({ url: `/pay/app/delete?id=${id}` })
}
// 获得支付应用列表
export function getAppList() {
return defHttp.get({ url: '/pay/app/list' })
}

@ -0,0 +1,69 @@
import { defHttp } from '@/utils/http/axios'
export interface ChannelVO {
id: number
code: string
config: string
status: number
remark: string
feeRate: number
merchantId: number
appId: number
createTime: Date
}
export interface ChannelPageReqVO extends PageParam {
code?: string
status?: number
remark?: string
feeRate?: number
merchantId?: number
appId?: number
config?: string
createTime?: Date[]
}
export interface ChannelExportReqVO {
code?: string
status?: number
remark?: string
feeRate?: number
merchantId?: number
appId?: number
config?: string
createTime?: Date[]
}
// 查询列表支付渠道
export function getChannelPage(params: PageParam) {
return defHttp.get({ url: '/pay/channel/page', params })
}
// 查询详情支付渠道
export function getChannel(appId: string, code: string) {
const params = {
appId,
code,
}
return defHttp.get({ url: '/pay/channel/get', params })
}
// 新增支付渠道
export function createChannel(data: ChannelVO) {
return defHttp.post({ url: '/pay/channel/create', data })
}
// 修改支付渠道
export function updateChannel(data: ChannelVO) {
return defHttp.put({ url: '/pay/channel/update', data })
}
// 删除支付渠道
export function deleteChannel(id: number) {
return defHttp.delete({ url: `/pay/channel/delete?id=${id}` })
}
// 导出支付渠道
export function exportChannel(params) {
return defHttp.download({ url: '/pay/channel/export-excel', params }, '支付渠道.xls')
}

@ -0,0 +1,21 @@
import { defHttp } from '@/utils/http/axios'
// 获得示例订单分页
export function getDemoOrderPage(params) {
return defHttp.get({ url: '/pay/demo-order/page', params })
}
// 获得示例订单
export function getDemoOrder(id: number) {
return defHttp.get({ url: `/pay/demo-order/get?id=${id}` })
}
// 创建示例订单
export function createDemoOrder(data) {
return defHttp.post({ url: '/pay/demo-order/create', data })
}
// 退款示例订单
export function refundDemoOrder(id: number) {
return defHttp.put({ url: `/pay/demo-order/refund?id=${id}` })
}

@ -0,0 +1,11 @@
import { defHttp } from '@/utils/http/axios'
// 获得支付通知明细
export function getNotifyTaskDetail(id) {
return defHttp.get({ url: `/pay/notify/get-detail?id=${id}` })
}
// 获得支付通知分页
export function getNotifyTaskPage(params) {
return defHttp.get({ url: '/pay/notify/page', params })
}

@ -0,0 +1,104 @@
import { defHttp } from '@/utils/http/axios'
export interface OrderVO {
id: number
merchantId: number
appId: number
channelId: number
channelCode: string
merchantOrderId: string
subject: string
body: string
notifyUrl: string
notifyStatus: number
amount: number
channelFeeRate: number
channelFeeAmount: number
status: number
userIp: string
expireTime: Date
successTime: Date
notifyTime: Date
successExtensionId: number
refundStatus: number
refundTimes: number
refundAmount: number
channelUserId: string
channelOrderNo: string
createTime: Date
}
export interface OrderPageReqVO extends PageParam {
merchantId?: number
appId?: number
channelId?: number
channelCode?: string
merchantOrderId?: string
subject?: string
body?: string
notifyUrl?: string
notifyStatus?: number
amount?: number
channelFeeRate?: number
channelFeeAmount?: number
status?: number
expireTime?: Date[]
successTime?: Date[]
notifyTime?: Date[]
successExtensionId?: number
refundStatus?: number
refundTimes?: number
channelUserId?: string
channelOrderNo?: string
createTime?: Date[]
}
export interface OrderExportReqVO {
merchantId?: number
appId?: number
channelId?: number
channelCode?: string
merchantOrderId?: string
subject?: string
body?: string
notifyUrl?: string
notifyStatus?: number
amount?: number
channelFeeRate?: number
channelFeeAmount?: number
status?: number
expireTime?: Date[]
successTime?: Date[]
notifyTime?: Date[]
successExtensionId?: number
refundStatus?: number
refundTimes?: number
channelUserId?: string
channelOrderNo?: string
createTime?: Date[]
}
// 查询列表支付订单
export function getOrderPage(params: OrderPageReqVO) {
return defHttp.get({ url: '/pay/order/page', params })
}
// 查询详情支付订单
export function getOrder(id: number) {
return defHttp.get({ url: `/pay/order/get?id=${id}` })
}
// 获得支付订单的明细
export function getOrderDetail(id: number) {
return defHttp.get({ url: `/pay/order/get-detail?id=${id}` })
}
// 提交支付订单
export function submitOrder(data: any) {
return defHttp.post({ url: '/pay/order/submit', data })
}
// 导出支付订单
export function exportOrder(params: OrderExportReqVO) {
return defHttp.download({ url: '/pay/order/export-excel', params })
}

@ -0,0 +1,116 @@
import { defHttp } from '@/utils/http/axios'
export interface RefundVO {
id: number
merchantId: number
appId: number
channelId: number
channelCode: string
orderId: string
tradeNo: string
merchantOrderId: string
merchantRefundNo: string
notifyUrl: string
notifyStatus: number
status: number
type: number
payAmount: number
refundAmount: number
reason: string
userIp: string
channelOrderNo: string
channelRefundNo: string
channelErrorCode: string
channelErrorMsg: string
channelExtras: string
expireTime: Date
successTime: Date
notifyTime: Date
createTime: Date
}
export interface RefundPageReqVO extends PageParam {
merchantId?: number
appId?: number
channelId?: number
channelCode?: string
orderId?: string
tradeNo?: string
merchantOrderId?: string
merchantRefundNo?: string
notifyUrl?: string
notifyStatus?: number
status?: number
type?: number
payAmount?: number
refundAmount?: number
reason?: string
userIp?: string
channelOrderNo?: string
channelRefundNo?: string
channelErrorCode?: string
channelErrorMsg?: string
channelExtras?: string
expireTime?: Date[]
successTime?: Date[]
notifyTime?: Date[]
createTime?: Date[]
}
export interface PayRefundExportReqVO {
merchantId?: number
appId?: number
channelId?: number
channelCode?: string
orderId?: string
tradeNo?: string
merchantOrderId?: string
merchantRefundNo?: string
notifyUrl?: string
notifyStatus?: number
status?: number
type?: number
payAmount?: number
refundAmount?: number
reason?: string
userIp?: string
channelOrderNo?: string
channelRefundNo?: string
channelErrorCode?: string
channelErrorMsg?: string
channelExtras?: string
expireTime?: Date[]
successTime?: Date[]
notifyTime?: Date[]
createTime?: Date[]
}
// 查询列表退款订单
export function getRefundPage(params: RefundPageReqVO) {
return defHttp.get({ url: '/pay/refund/page', params })
}
// 查询详情退款订单
export function getRefund(id: number) {
return defHttp.get({ url: `/pay/refund/get?id=${id}` })
}
// 新增退款订单
export function createRefund(data: RefundVO) {
return defHttp.post({ url: '/pay/refund/create', data })
}
// 修改退款订单
export function updateRefund(data: RefundVO) {
return defHttp.put({ url: '/pay/refund/update', data })
}
// 删除退款订单
export function deleteRefund(id: number) {
return defHttp.delete({ url: `/pay/refund/delete?id=${id}` })
}
// 导出退款订单
export function exportRefund(params: PayRefundExportReqVO) {
return defHttp.download({ url: '/pay/refund/export-excel', params }, '退款订单.xls')
}

@ -0,0 +1,11 @@
import { defHttp } from '@/utils/http/axios'
// 获得地区树
export function getAreaTree() {
return defHttp.get({ url: '/system/area/tree' })
}
// 获得 IP 对应的地区名
export function getAreaByIp(ip: string) {
return defHttp.get({ url: `/system/area/get-by-ip?ip=${ip}` })
}

@ -0,0 +1,48 @@
import { defHttp } from '@/utils/http/axios'
export interface DeptVO {
id?: number
name: string
parentId: number
status: number
sort: number
leaderUserId: number
phone: string
email: string
createTime: Date
}
export interface DeptPageReqVO {
name?: string
status?: number
}
// 查询部门(精简)列表
export function listSimpleDept() {
return defHttp.get({ url: '/system/dept/list-all-simple' })
}
// 查询部门列表
export function getDeptPage(params: DeptPageReqVO) {
return defHttp.get({ url: '/system/dept/list', params })
}
// 查询部门详情
export function getDept(id: number) {
return defHttp.get({ url: `/system/dept/get?id=${id}` })
}
// 新增部门
export function createDept(data: DeptVO) {
return defHttp.post({ url: '/system/dept/create', data })
}
// 修改部门
export function updateDept(params: DeptVO) {
return defHttp.put({ url: '/system/dept/update', data: params })
}
// 删除部门
export function deleteDept(id: number) {
return defHttp.delete({ url: `/system/dept/delete?id=${id}` })
}

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

Loading…
Cancel
Save