代码提交

main
xiangcongshuai 4 days ago
commit f375cb8868

@ -0,0 +1,21 @@
node_modules
.DS_Store
dist
dist-ssr
*.local
.eslintcache
report.html
yarn.lock
npm-debug.log*
.pnpm-error.log*
.pnpm-debug.log
tests/**/coverage/
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
tsconfig.tsbuildinfo

@ -0,0 +1,14 @@
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false

@ -0,0 +1,5 @@
# 平台本地运行端口号
VITE_PORT = 8848
# 是否隐藏首页 隐藏 true 不隐藏 false 勿删除VITE_HIDE_HOME只需在.env文件配置
VITE_HIDE_HOME = false

@ -0,0 +1,11 @@
# 平台本地运行端口号
VITE_PORT = 8848
# 开发环境读取配置文件路径
VITE_PUBLIC_PATH = ./
# 开发环境路由历史模式Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数"
VITE_ROUTER_HISTORY = "hash"
# 开发环境后端地址
VITE_APP_BASE_URL = 'http://192.168.10.13:8000'

@ -0,0 +1,13 @@
# 线上环境平台打包路径
VITE_PUBLIC_PATH = ./
# 线上环境路由历史模式Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数"
VITE_ROUTER_HISTORY = "hash"
# 是否在打包时使用cdn替换本地库 替换 true 不替换 false
VITE_CDN = false
# 是否启用gzip压缩或brotli压缩分两种情况删除原始文件和不删除原始文件
# 压缩时不删除原始文件的配置gzip、brotli、both同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 压缩时删除原始文件的配置gzip-clear、brotli-clear、both-clear同时开启 gzip 与 brotli 压缩、none不开启压缩默认
VITE_COMPRESSION = "none"

@ -0,0 +1,16 @@
# 预发布也需要生产环境的行为
# https://cn.vitejs.dev/guide/env-and-mode.html#modes
# NODE_ENV = development
VITE_PUBLIC_PATH = ./
# 预发布环境路由历史模式Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数"
VITE_ROUTER_HISTORY = "hash"
# 是否在打包时使用cdn替换本地库 替换 true 不替换 false
VITE_CDN = true
# 是否启用gzip压缩或brotli压缩分两种情况删除原始文件和不删除原始文件
# 压缩时不删除原始文件的配置gzip、brotli、both同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 压缩时删除原始文件的配置gzip-clear、brotli-clear、both-clear同时开启 gzip 与 brotli 压缩、none不开启压缩默认
VITE_COMPRESSION = "none"

@ -0,0 +1,11 @@
public
dist
*.d.ts
/src/assets
package.json
.eslintrc.js
.prettierrc.js
commitlint.config.js
postcss.config.js
tailwind.config.js
stylelint.config.js

@ -0,0 +1,121 @@
module.exports = {
root: true,
env: {
node: true
},
globals: {
// Ref sugar (take 2)
$: "readonly",
$$: "readonly",
$ref: "readonly",
$shallowRef: "readonly",
$computed: "readonly",
// index.d.ts
// global.d.ts
Fn: "readonly",
PromiseFn: "readonly",
RefType: "readonly",
LabelValueOptions: "readonly",
EmitType: "readonly",
TargetContext: "readonly",
ComponentElRef: "readonly",
ComponentRef: "readonly",
ElRef: "readonly",
global: "readonly",
ForDataType: "readonly",
ComponentRoutes: "readonly",
// script setup
defineProps: "readonly",
defineEmits: "readonly",
defineExpose: "readonly",
withDefaults: "readonly",
DC: false
},
extends: [
"plugin:vue/vue3-essential",
"eslint:recommended",
"@vue/typescript/recommended",
"@vue/prettier",
"@vue/eslint-config-typescript"
],
parser: "vue-eslint-parser",
parserOptions: {
parser: "@typescript-eslint/parser",
ecmaVersion: 2020,
sourceType: "module",
jsxPragma: "React",
ecmaFeatures: {
jsx: true
}
},
overrides: [
{
files: ["*.ts", "*.vue"],
rules: {
"no-undef": "off"
}
},
{
files: ["*.vue"],
parser: "vue-eslint-parser",
parserOptions: {
parser: "@typescript-eslint/parser",
extraFileExtensions: [".vue"],
ecmaVersion: "latest",
ecmaFeatures: {
jsx: true
}
},
rules: {
"no-undef": "off"
}
}
],
rules: {
"vue/no-v-html": "off",
"vue/require-default-prop": "off",
"vue/require-explicit-emits": "off",
"vue/multi-word-component-names": "off",
"@typescript-eslint/no-explicit-any": "off", // any
"no-debugger": "off",
"@typescript-eslint/explicit-module-boundary-types": "off", // setup()
"@typescript-eslint/ban-types": "off",
"@typescript-eslint/ban-ts-comment": "off",
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-non-null-assertion": "off",
"vue/html-self-closing": [
"error",
{
html: {
void: "always",
normal: "always",
component: "always"
},
svg: "always",
math: "always"
}
],
"@typescript-eslint/no-unused-vars": [
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_"
}
],
"no-unused-vars": [
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_"
}
],
"prettier/prettier": [
"error",
{
endOfLine: "auto"
}
]
}
};

14
.gitignore vendored

@ -0,0 +1,14 @@
# ---> Vue
# gitignore template for Vue.js projects
#
# Recommended template: Node.gitignore
# TODO: where does this rule come from?
docs/_book
# TODO: where does this rule come from?
test/
node_modules
dist

@ -0,0 +1,11 @@
{
"default": true,
"MD003": false,
"MD033": false,
"MD013": false,
"MD001": false,
"MD025": false,
"MD024": false,
"MD007": { "indent": 4 },
"no-hard-tabs": false
}

@ -0,0 +1,6 @@
shamefully-hoist=true
strict-peer-dependencies=false
shell-emulator=true
electron_mirror=https://npmmirror.com/mirrors/electron/
electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/
winCodeSign_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/winCodeSign/

@ -0,0 +1,6 @@
module.exports = {
bracketSpacing: true,
singleQuote: false,
arrowParens: "avoid",
trailingComma: "none"
};

@ -0,0 +1,4 @@
/dist/*
/public/*
public/*
src/style/reset.scss

@ -0,0 +1,3 @@
{
"recommendations": ["dbaeumer.vscode-eslint"]
}

@ -0,0 +1,39 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Main Process",
"type": "node",
"request": "launch",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite",
"windows": {
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd"
},
"runtimeArgs": ["--sourcemap"],
"env": {
"REMOTE_DEBUGGING_PORT": "9222"
}
},
{
"name": "Debug Renderer Process",
"port": 9222,
"request": "attach",
"type": "chrome",
"webRoot": "${workspaceFolder}/src/renderer",
"timeout": 60000,
"presentation": {
"hidden": true
}
}
],
"compounds": [
{
"name": "Debug All",
"configurations": ["Debug Main Process", "Debug Renderer Process"],
"presentation": {
"order": 1
}
}
]
}

@ -0,0 +1,17 @@
{
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"eslint.validate": ["javascript", "typescript", "vue"]
}

@ -0,0 +1,20 @@
FROM node:16-alpine as build-stage
WORKDIR /app
RUN corepack enable
RUN corepack prepare pnpm@7.32.1 --activate
RUN npm config set registry https://registry.npmmirror.com
COPY .npmrc package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

@ -0,0 +1,3 @@
# interro_robot_web
demo前端

@ -0,0 +1,51 @@
import { Plugin as importToCDN } from "vite-plugin-cdn-import";
/**
* @description `cdn`使cdn .env.production VITE_CDN true
* cdnhttps://www.bootcdn.cn当然你也可以选择 https://unpkg.com 或者 https://www.jsdelivr.com
* mockjscdnmockjs使
* 使jscsscdn
*/
export const cdn = importToCDN({
//prodUrl解释 name: 对应下面modules的nameversion: 自动读取本地package.json中dependencies依赖中对应包的版本号path: 对应下面modules的path当然也可写完整路径会替换prodUrl
prodUrl: "https://cdn.bootcdn.net/ajax/libs/{name}/{version}/{path}",
modules: [
{
name: "vue",
var: "Vue",
path: "vue.global.prod.min.js"
},
{
name: "vue-router",
var: "VueRouter",
path: "vue-router.global.min.js"
},
// 项目中没有直接安装vue-demi但是pinia用到了所以需要在引入pinia前引入vue-demihttps://github.com/vuejs/pinia/blob/v2/packages/pinia/package.json#L77
{
name: "vue-demi",
var: "VueDemi",
path: "index.iife.min.js"
},
{
name: "pinia",
var: "Pinia",
path: "pinia.iife.min.js"
},
{
name: "element-plus",
var: "ElementPlus",
path: "index.full.min.js",
css: "index.min.css"
},
{
name: "axios",
var: "axios",
path: "axios.min.js"
},
{
name: "dayjs",
var: "dayjs",
path: "dayjs.min.js"
}
]
});

@ -0,0 +1,63 @@
import type { Plugin } from "vite";
import { isArray } from "@pureadmin/utils";
import compressPlugin from "vite-plugin-compression";
export const configCompressPlugin = (
compress: ViteCompression
): Plugin | Plugin[] => {
if (compress === "none") return null;
const gz = {
// 生成的压缩包后缀
ext: ".gz",
// 体积大于threshold才会被压缩
threshold: 0,
// 默认压缩.js|mjs|json|css|html后缀文件设置成true压缩全部文件
filter: () => true,
// 压缩后是否删除原始文件
deleteOriginFile: false
};
const br = {
ext: ".br",
algorithm: "brotliCompress",
threshold: 0,
filter: () => true,
deleteOriginFile: false
};
const codeList = [
{ k: "gzip", v: gz },
{ k: "brotli", v: br },
{ k: "both", v: [gz, br] }
];
const plugins: Plugin[] = [];
codeList.forEach(item => {
if (compress.includes(item.k)) {
if (compress.includes("clear")) {
if (isArray(item.v)) {
item.v.forEach(vItem => {
plugins.push(
compressPlugin(Object.assign(vItem, { deleteOriginFile: true }))
);
});
} else {
plugins.push(
compressPlugin(Object.assign(item.v, { deleteOriginFile: true }))
);
}
} else {
if (isArray(item.v)) {
item.v.forEach(vItem => {
plugins.push(compressPlugin(vItem));
});
} else {
plugins.push(compressPlugin(item.v));
}
}
}
});
return plugins;
};

@ -0,0 +1,31 @@
/** 处理环境变量 */
const warpperEnv = (envConf: Recordable): ViteEnv => {
/** 此处为默认值 */
const ret: ViteEnv = {
VITE_PORT: 8848,
VITE_PUBLIC_PATH: "",
VITE_ROUTER_HISTORY: "",
VITE_CDN: false,
VITE_HIDE_HOME: "false",
VITE_COMPRESSION: "none"
};
for (const envName of Object.keys(envConf)) {
let realName = envConf[envName].replace(/\\n/g, "\n");
realName =
realName === "true" ? true : realName === "false" ? false : realName;
if (envName === "VITE_PORT") {
realName = Number(realName);
}
ret[envName] = realName;
if (typeof realName === "string") {
process.env[envName] = realName;
} else if (typeof realName === "object") {
process.env[envName] = JSON.stringify(realName);
}
}
return ret;
};
export { warpperEnv };

@ -0,0 +1,45 @@
import type { Plugin } from "vite";
import dayjs, { Dayjs } from "dayjs";
import utils from "@pureadmin/utils";
import duration from "dayjs/plugin/duration";
import { green, blue, bold } from "picocolors";
dayjs.extend(duration);
export function viteBuildInfo(): Plugin {
let config: { command: string };
let startTime: Dayjs;
let endTime: Dayjs;
let outDir: string;
return {
name: "vite:buildInfo",
configResolved(resolvedConfig) {
config = resolvedConfig;
outDir = resolvedConfig.build?.outDir ?? "dist";
},
buildStart() {
console.log(bold(green(`👏欢迎使用${blue("[admin]")}`)));
if (config.command === "build") {
startTime = dayjs(new Date());
}
},
closeBundle() {
if (config.command === "build") {
endTime = dayjs(new Date());
utils.getPackageSize({
folder: outDir,
callback: (size: string) => {
console.log(
bold(
green(
`🎉恭喜打包完成(总用时${dayjs
.duration(endTime.diff(startTime))
.format("mm分ss秒")}${size}`
)
)
);
}
});
}
}
};
}

@ -0,0 +1,32 @@
/**
* `vite.config.ts` `optimizeDeps.include`
* `vite` include esm node_modules/.vite
* includevite 使 node_modules/.vite
* 使 src/main.ts include vite node_modules/.vite
*/
const include = [
"qs",
"mitt",
"dayjs",
"axios",
"pinia",
"js-cookie",
"sortablejs",
"pinyin-pro",
"@vueuse/core",
"@pureadmin/utils",
"responsive-storage"
];
/**
*
* `@iconify-icons/` `exclude` 使
*/
const exclude = [
"@iconify-icons/ep",
"@iconify-icons/ri",
"@pureadmin/theme/dist/browser-utils",
"@iconify-icons/ant-design"
];
export { include, exclude };

@ -0,0 +1,56 @@
import { cdn } from "./cdn";
import vue from "@vitejs/plugin-vue";
import { viteBuildInfo } from "./info";
import svgLoader from "vite-svg-loader";
import vueJsx from "@vitejs/plugin-vue-jsx";
import { viteMockServe } from "vite-plugin-mock";
import { configCompressPlugin } from "./compress";
// import ElementPlus from "unplugin-element-plus/vite";
import { visualizer } from "rollup-plugin-visualizer";
import removeConsole from "vite-plugin-remove-console";
import {themePreprocessorPlugin} from "@pureadmin/theme";
import { genScssMultipleScopeVars } from "../src/layout/theme";
export function getPluginsList(
command: string,
VITE_CDN: boolean,
VITE_COMPRESSION: ViteCompression
) {
const prodMock = true;
const lifecycle = process.env.npm_lifecycle_event;
return [
vue(),
// jsx、tsx语法支持
vueJsx(),
VITE_CDN ? cdn : null,
configCompressPlugin(VITE_COMPRESSION),
// 线上环境删除console
removeConsole({ external: ["src/assets/iconfont/iconfont.js"] }),
viteBuildInfo(),
// 自定义主题
themePreprocessorPlugin({
scss: {
multipleScopeVars: genScssMultipleScopeVars(),
extract: true
}
}),
// svg组件化支持
svgLoader(),
// ElementPlus({}),
// mock支持
viteMockServe({
mockPath: "mock",
localEnabled: command === "serve",
prodEnabled: command !== "serve" && prodMock,
injectCode: `
import { setupProdMockServer } from './mockProdServer';
setupProdMockServer();
`,
logger: false
}),
// 打包分析
lifecycle === "report"
? visualizer({ open: true, brotliSize: true, filename: "report.html" })
: null
];
}

@ -0,0 +1,32 @@
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"],
"type-enum": [
2,
"always",
[
"feat",
"fix",
"perf",
"style",
"docs",
"test",
"refactor",
"build",
"ci",
"chore",
"revert",
"wip",
"workflow",
"types",
"release"
]
]
}
};

@ -0,0 +1,88 @@
<!DOCTYPE html>
<html lang="en">
<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>智能小助手</title>
<link rel="icon" href="/favicon.ico" />
<script>
window.process = {};
</script>
</head>
<body>
<div id="app">
<style>
html,
body,
#app {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
overflow: hidden;
}
.loader,
.loader::before,
.loader::after {
width: 2.5em;
height: 2.5em;
border-radius: 50%;
animation: load-animation 1.8s infinite ease-in-out;
animation-fill-mode: both;
}
.loader {
position: relative;
top: 0;
margin: 80px auto;
font-size: 10px;
color: #406eeb;
text-indent: -9999em;
transform: translateZ(0);
transform: translate(-50%, 0);
animation-delay: -0.16s;
}
.loader::before,
.loader::after {
position: absolute;
top: 0;
content: "";
}
.loader::before {
left: -3.5em;
animation-delay: -0.32s;
}
.loader::after {
left: 3.5em;
}
@keyframes load-animation {
0%,
80%,
100% {
box-shadow: 0 2.5em 0 -1.3em;
}
40% {
box-shadow: 0 2.5em 0 0;
}
}
</style>
<div class="loader"></div>
</div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

@ -0,0 +1,94 @@
// 模拟后端动态生成路由
import { MockMethod } from "vite-plugin-mock";
/**
* roles "admin""common"
* admin
* common
*/
const inquiryManagementRouter = {
path: "/inquiryManagement",
meta: {
title: "问诊管理",
icon: "projectIcon",
rank: 11
},
children: [
{
path: "/inquiryManagement/bodyInspect",
name: "BodyInspect",
meta: {
title: "体格检查",
roles: ["admin", "common"]
}
},
{
path: "/inquiryManagement/supportInspect",
name: "SupportInspect",
meta: {
title: "辅助检查",
roles: ["admin", "common"]
}
},
{
path: "/inquiryManagement/disposalPlan",
name: "DisposalPlan",
meta: {
title: "处置计划",
roles: ["admin", "common"]
}
}
]
};
const caseManagement = {
path: "/caseManagement",
redirect: "/caseManagement/list",
meta: {
title: "病历管理",
icon: "projectIcon",
rank: 11
},
children: [
{
path: "/caseManagement/diseaseType",
name: "DiseaseType",
meta: {
title: "疾病分类",
roles: ["admin", "common"]
}
},
{
path: "/caseManagement/list",
name: "CaseManagement",
meta: {
title: "病历管理",
showLink: true,
roles: ["admin", "common"]
}
},
{
path: "/caseManagement/add",
name: "caseManagementAdd",
meta: {
title: "新建病历",
showLink: false,
roles: ["admin", "common"]
}
}
]
};
export default [
{
url: "/getAsyncRoutes",
method: "get",
response: () => {
return {
success: true,
code: 200,
data: [inquiryManagementRouter, caseManagement]
};
}
}
] as MockMethod[];

@ -0,0 +1,66 @@
// 根据角色动态生成路由
import { MockMethod } from "vite-plugin-mock";
export default [
{
url: "/login",
method: "post",
response: ({ body }) => {
if (body.username === "admin" && body.password === "admin123") {
return {
success: true,
data: {
username: "admin",
// 一个用户可能有多个角色
roles: ["admin"],
accessToken: "eyJhbGciOiJIUzUxMiJ9.admin",
refreshToken: "eyJhbGciOiJIUzUxMiJ9.adminRefresh",
expires: "2023/10/30 00:00:00"
}
};
} else if (body.username === "common" && body.password === "common123") {
return {
success: true,
data: {
username: "common",
// 一个用户可能有多个角色
roles: ["common"],
accessToken: "eyJhbGciOiJIUzUxMiJ9.common",
refreshToken: "eyJhbGciOiJIUzUxMiJ9.commonRefresh",
expires: "2023/10/30 00:00:00"
}
};
} else {
return {
success: false,
msg: "用户名密码错误"
};
}
// if (body.username === "admin") {
// return {
// success: true,
// data: {
// username: "admin",
// // 一个用户可能有多个角色
// roles: ["admin"],
// accessToken: "eyJhbGciOiJIUzUxMiJ9.admin",
// refreshToken: "eyJhbGciOiJIUzUxMiJ9.adminRefresh",
// expires: "2023/10/30 00:00:00"
// }
// };
// } else {
// return {
// success: true,
// data: {
// username: "common",
// // 一个用户可能有多个角色
// roles: ["common"],
// accessToken: "eyJhbGciOiJIUzUxMiJ9.common",
// refreshToken: "eyJhbGciOiJIUzUxMiJ9.commonRefresh",
// expires: "2023/10/30 00:00:00"
// }
// };
// }
}
}
] as MockMethod[];

@ -0,0 +1,27 @@
import { MockMethod } from "vite-plugin-mock";
// 模拟刷新token接口
export default [
{
url: "/refreshToken",
method: "post",
response: ({ body }) => {
if (body.refreshToken) {
return {
success: true,
data: {
accessToken: "eyJhbGciOiJIUzUxMiJ9.newAdmin",
refreshToken: "eyJhbGciOiJIUzUxMiJ9.newAdminRefresh",
// `expires`选择这种日期格式是为了方便调试,后端直接设置时间戳或许更方便(每次都应该递增)。如果后端返回的是时间戳格式,前端开发请来到这个目录`src/utils/auth.ts`,把第`38`行的代码换成expires = data.expires即可。
expires: "2023/10/30 23:59:59"
}
};
} else {
return {
success: false,
data: {}
};
}
}
}
] as MockMethod[];

24542
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,191 @@
{
"name": "live-digital-avatar",
"version": "1.0.0",
"type": "commonjs",
"main": "electron/main.js",
"private": true,
"scripts": {
"dev": "NODE_OPTIONS=--max-old-space-size=4096 vite",
"serve": "pnpm dev",
"build": "vite build",
"build:staging": "rimraf dist && vite build --mode staging",
"report": "rimraf dist && vite build",
"preview": "vite preview",
"preview:build": "pnpm build && vite preview",
"typecheck": "tsc --noEmit && vue-tsc --noEmit --skipLibCheck",
"svgo": "svgo -f src/assets/svg -o src/assets/svg",
"cloc": "NODE_OPTIONS=--max-old-space-size=4096 cloc . --exclude-dir=node_modules --exclude-lang=YAML",
"clean:cache": "rimraf node_modules && rimraf .eslintcache && pnpm install",
"lint:eslint": "eslint . --fix",
"lint:prettier": "prettier --write \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"",
"lint:stylelint": "stylelint \"**/*.{html,vue,css,scss}\" --fix --cache --cache-location node_modules/.cache/stylelint/",
"lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js",
"lint:pretty": "pretty-quick --staged",
"lint": "pnpm lint:eslint && pnpm lint:prettier && pnpm lint:stylelint",
"prepare": "husky install",
"preinstall": "npx only-allow pnpm",
"electron:serve": "concurrently -k \"vite\" \"wait-on http://192.168.10.25:8080/live-digital-avatar-manage && electron .\"",
"electron:build": "vite build && electron-builder"
},
"build": {
"appId": "com.example.myapp",
"productName": "My Electron App",
"directories": {
"output": "dist-electron"
},
"files": [
"dist/**/*",
"electron/**/*",
"node_modules/**/*",
"package.json"
],
"win": {
"target": [
"nsis",
"portable"
],
"icon": "public/icon.ico",
"verifyUpdateCodeSignature": false,
"signAndEditExecutable": false,
"requestedExecutionLevel": "asInvoker"
},
"nsis": {
"oneClick": false,
"allowToChangeInstallationDirectory": true,
"installerIcon": "public/icon1.ico",
"uninstallerIcon": "public/icon2.ico",
"createDesktopShortcut": true,
"createStartMenuShortcut": true
}
},
"browserslist": [
"> 1%",
"not ie 11",
"not op_mini all"
],
"dependencies": {
"@microsoft/fetch-event-source": "^2.0.1",
"@pureadmin/descriptions": "^1.1.1",
"@pureadmin/table": "^2.3.2",
"@pureadmin/utils": "^1.9.6",
"@vueuse/core": "^10.2.0",
"@vueuse/motion": "^2.0.0",
"@wangeditor/editor-for-vue": "^5.1.12",
"animate.css": "^4.1.1",
"ant-design-x-vue": "^1.1.1",
"axios": "^1.4.0",
"buffer": "^6.0.3",
"dayjs": "^1.11.8",
"element-plus": "2.3.6",
"fetch-event-source": "1.0.0-alpha.2",
"hls.js": "^1.6.7",
"http-proxy": "^1.18.1",
"i": "^0.3.7",
"js-audio-recorder": "^1.0.7",
"js-cookie": "^3.0.5",
"lodash.debounce": "^4.0.8",
"mitt": "^3.0.0",
"nprogress": "^0.2.0",
"path": "^0.12.7",
"pinia": "^2.1.4",
"pinyin-pro": "^3.15.2",
"qs": "^6.11.2",
"responsive-storage": "^2.2.0",
"sortablejs": "^1.15.0",
"uuid": "^9.0.1",
"vue": "^3.3.4",
"vue-router": "^4.2.2",
"vue-types": "^5.1.0",
"vue3-seamless-scroll": "^2.0.1",
"wangeditor": "^4.7.15"
},
"devDependencies": {
"@commitlint/cli": "^17.6.6",
"@commitlint/config-conventional": "^17.6.6",
"@iconify-icons/ant-design": "^1.2.7",
"@iconify-icons/ep": "^1.2.12",
"@iconify-icons/icon-park-outline": "^1.2.11",
"@iconify-icons/ri": "^1.2.9",
"@iconify/vue": "^4.1.1",
"@pureadmin/theme": "^3.1.0",
"@types/js-cookie": "^3.0.3",
"@types/mockjs": "^1.0.7",
"@types/node": "^20.3.1",
"@types/nprogress": "0.2.0",
"@types/qs": "^6.9.7",
"@types/sortablejs": "^1.15.1",
"@typescript-eslint/eslint-plugin": "^5.60.0",
"@typescript-eslint/parser": "^5.60.0",
"@vitejs/plugin-vue": "^4.2.3",
"@vitejs/plugin-vue-jsx": "^3.0.1",
"@vue/eslint-config-prettier": "^7.1.0",
"@vue/eslint-config-typescript": "^11.0.3",
"autoprefixer": "^10.4.14",
"cloc": "^2.11.0",
"concurrently": "^9.1.2",
"cssnano": "^6.0.1",
"electron": "^36.4.0",
"electron-builder": "^26.0.12",
"eslint": "^8.43.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-vue": "^9.15.1",
"husky": "^8.0.3",
"lint-staged": "^13.2.2",
"markdown-it": "^14.1.0",
"markdown-it-highlightjs": "^4.2.0",
"picocolors": "^1.0.0",
"postcss": "^8.4.24",
"postcss-html": "^1.5.0",
"postcss-import": "^15.1.0",
"postcss-scss": "^4.0.6",
"prettier": "^2.8.8",
"pretty-quick": "^3.1.3",
"rimraf": "^5.0.1",
"rollup-plugin-visualizer": "^5.9.2",
"sass": "^1.63.6",
"sass-loader": "^13.3.2",
"stylelint": "^15.9.0",
"stylelint-config-html": "^1.1.0",
"stylelint-config-recess-order": "^4.2.0",
"stylelint-config-recommended": "^12.0.0",
"stylelint-config-recommended-scss": "^12.0.0",
"stylelint-config-recommended-vue": "^1.4.0",
"stylelint-config-standard": "^33.0.0",
"stylelint-config-standard-scss": "^9.0.0",
"stylelint-order": "^6.0.3",
"stylelint-prettier": "^3.0.0",
"stylelint-scss": "^5.0.1",
"svgo": "^3.0.2",
"tailwindcss": "^3.3.2",
"terser": "^5.18.1",
"typescript": "5.0.4",
"unplugin-vue-components": "^28.5.0",
"vite": "^4.3.9",
"vite-plugin-cdn-import": "^0.3.5",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-mock": "2.9.6",
"vite-plugin-remove-console": "^2.1.1",
"vite-svg-loader": "^4.0.0",
"vue-eslint-parser": "^9.3.1",
"vue-tsc": "^1.8.1",
"wait-on": "^8.0.3"
},
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": [
"rollup",
"webpack",
"core-js"
]
},
"overrides": {
"brace-expansion": "2.0.2"
},
"allowedDeprecatedVersions": {
"sourcemap-codec": "*",
"w3c-hr-time": "*",
"stable": "*"
}
},
"license": "MIT"
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,9 @@
module.exports = {
plugins: {
"postcss-import": {},
"tailwindcss/nesting": {},
tailwindcss: {},
autoprefixer: {},
...(process.env.NODE_ENV === "production" ? { cssnano: {} } : {})
}
};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

@ -0,0 +1,11 @@
<svg width="30" height="32" viewBox="0 0 30 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M29.262 16.7252L23.5229 11.0259L20.9578 8.47347C20.9217 8.43538 20.8781 8.40503 20.8298 8.38428C20.7815 8.36354 20.7294 8.35284 20.6767 8.35284C20.6241 8.35284 20.572 8.36354 20.5237 8.38428C20.4753 8.40503 20.4318 8.43538 20.3956 8.47347L9.11646 19.6972C9.0244 19.7875 8.90027 19.8382 8.77094 19.8382C8.6416 19.8382 8.51747 19.7875 8.42542 19.6972L6.08291 17.3662C5.99207 17.2746 5.94114 17.151 5.94114 17.0224C5.94114 16.8937 5.99207 16.7701 6.08291 16.6785L15.4529 7.3546C15.5254 7.27699 15.5656 7.17499 15.5656 7.06906C15.5656 6.96313 15.5254 6.86112 15.4529 6.78351L12.9816 4.3826C12.9455 4.3445 12.9019 4.31415 12.8536 4.29341C12.8052 4.27267 12.7531 4.26196 12.7005 4.26196C12.6479 4.26196 12.5958 4.27267 12.5474 4.29341C12.4991 4.31415 12.4555 4.3445 12.4194 4.3826L0.121232 16.6203C0.0829476 16.6562 0.0524462 16.6996 0.0315998 16.7477C0.0107533 16.7958 0 16.8476 0 16.9C0 16.9524 0.0107533 17.0042 0.0315998 17.0523C0.0524462 17.1004 0.0829476 17.1437 0.121232 17.1797L5.83695 22.8906L8.40199 25.4314C8.47999 25.5035 8.5825 25.5435 8.68895 25.5435C8.7954 25.5435 8.89791 25.5035 8.97591 25.4314L20.2551 14.2077C20.2997 14.1633 20.3526 14.1281 20.4109 14.104C20.4692 14.08 20.5317 14.0676 20.5947 14.0676C20.6578 14.0676 20.7203 14.08 20.7786 14.104C20.8369 14.1281 20.8898 14.1633 20.9344 14.2077L23.2769 16.5387C23.3245 16.5813 23.3626 16.6334 23.3887 16.6916C23.4148 16.7499 23.4283 16.8129 23.4283 16.8767C23.4283 16.9404 23.4148 17.0035 23.3887 17.0617C23.3626 17.1199 23.3245 17.172 23.2769 17.2147L11.9977 28.45C11.9234 28.5243 11.8816 28.6249 11.8816 28.7297C11.8816 28.8346 11.9234 28.9352 11.9977 29.0094L14.4339 31.422C14.4701 31.4601 14.5136 31.4904 14.562 31.5112C14.6103 31.5319 14.6624 31.5426 14.715 31.5426C14.7677 31.5426 14.8198 31.5319 14.8681 31.5112C14.9164 31.4904 14.96 31.4601 14.9961 31.422L29.262 17.2962C29.3345 17.2186 29.3747 17.1166 29.3747 17.0107C29.3747 16.9048 29.3345 16.8028 29.262 16.7252Z" fill="url(#paint0_linear_562_16235)"/>
<path d="M17.7134 1.99314L13.86 2.79733C13.839 2.80347 13.8199 2.81483 13.8045 2.83035C13.7892 2.84587 13.778 2.86504 13.7722 2.88603C13.7663 2.90703 13.7659 2.92917 13.771 2.95035C13.7762 2.97154 13.7866 2.99108 13.8015 3.00712L16.8467 6.02574C16.8572 6.04261 16.8719 6.05653 16.8893 6.06618C16.9067 6.07583 16.9263 6.0809 16.9463 6.0809C16.9662 6.0809 16.9858 6.07583 17.0032 6.06618C17.0207 6.05653 17.0353 6.04261 17.0458 6.02574L17.8657 2.19128C17.884 2.16893 17.8942 2.14109 17.8947 2.11226C17.8951 2.08343 17.8858 2.05529 17.8682 2.03238C17.8506 2.00948 17.8257 1.99315 17.7977 1.98603C17.7696 1.97891 17.7399 1.98141 17.7134 1.99314Z" fill="#C50F08"/>
<path d="M19.5056 0.0356277L14.5278 1.35263C14.4812 1.36466 14.4387 1.3889 14.4047 1.42283C14.3707 1.45675 14.3464 1.49912 14.3345 1.54553C14.3225 1.59193 14.3233 1.64068 14.3367 1.6867C14.3501 1.73271 14.3756 1.77431 14.4107 1.80717L18.0533 5.43185C18.0849 5.46742 18.1258 5.49356 18.1715 5.50735C18.2171 5.52115 18.2657 5.52205 18.3119 5.50996C18.358 5.49788 18.3999 5.47328 18.4328 5.43891C18.4657 5.40454 18.4884 5.36175 18.4983 5.3153L19.8921 0.361966C19.9116 0.310297 19.9145 0.253924 19.9005 0.200539C19.8865 0.147153 19.8564 0.0993544 19.8141 0.0636642C19.7718 0.027974 19.7195 0.00612861 19.6643 0.00111125C19.6091 -0.00390611 19.5537 0.00814786 19.5056 0.0356277Z" fill="#FAEC18"/>
<defs>
<linearGradient id="paint0_linear_562_16235" x1="12.2203" y1="25.3498" x2="17.9654" y2="5.36981" gradientUnits="userSpaceOnUse">
<stop stop-color="#3785B7"/>
<stop offset="0.69" stop-color="#2F3E8F"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

@ -0,0 +1,22 @@
{
"Version": "1.0.0",
"Title": "Admin",
"FixedHeader": true,
"HiddenSideBar": false,
"MultiTagsCache": false,
"KeepAlive": false,
"Layout": "vertical",
"Theme": "default",
"DarkMode": false,
"Grey": false,
"Weak": false,
"HideTabs": true,
"SidebarStatus": true,
"EpThemeColor": "#4287ff",
"ShowLogo": true,
"ShowModel": "smart",
"MenuArrowIconNoTransition": true,
"CachingAsyncRoutes": false,
"TooltipEffect": "light",
"ResponsiveStorageNameSpace": "responsive-"
}

@ -0,0 +1,58 @@
<template>
<el-config-provider :locale="currentLocale">
<div v-if="isLoginPage">
<router-view />
</div>
<div class="page-main" v-else>
<Navbar />
<div class="main-content">
<Sidebar />
<router-view style="flex: 1" />
</div>
</div>
<ReDialog />
</el-config-provider>
</template>
<script lang="ts">
import { defineComponent, computed } from "vue";
import { ElConfigProvider } from "element-plus";
import zhCn from "element-plus/lib/locale/lang/zh-cn";
import { useRoute } from "vue-router";
import { ReDialog } from "@/components/ReDialog";
//
import Navbar from "@/components/Navbar/index.vue";
import Sidebar from "@/components/Sidebar/index.vue";
export default defineComponent({
name: "app",
components: {
[ElConfigProvider.name]: ElConfigProvider,
ReDialog,
Navbar,
Sidebar
},
setup() {
const route = useRoute();
//
const isLoginPage = computed(() =>
["/login", "/live"].includes(route.path)
);
return { currentLocale: zhCn, isLoginPage };
}
});
</script>
<style lang="scss" scoped>
.page-main {
width: 100%;
height: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
.main-content {
display: flex;
flex: 1;
}
}
</style>

@ -0,0 +1,9 @@
import { http } from "@/utils/http";
/** ,ID
*/
export const chatKnowledgeQA = (data?: object) => {
return http.request("get", "/chat/knowledgeQA", {
params: data
});
};

@ -0,0 +1,24 @@
import { http } from "@/utils/http";
type Result = {
success: boolean;
data?: {
/** 列表数据 */
list: Array<any>;
};
};
/** 卡片列表 */
export const getCardList = (data?: object) => {
return http.request<Result>("post", "/getCardList", { data });
};
/** 版本日志 */
export const getReleases = () => {
return http.request<Result>("get", "/releases");
};
/** 平台算法库 */
export const getAlgorithmList = (data?: object) => {
return http.request<Result>("post", "/algorithmList", { data });
};

@ -0,0 +1,10 @@
import { http } from "@/utils/http";
type Result = {
success: boolean;
data: Array<any>;
};
export const getAsyncRoutes = () => {
return http.request<Result>("get", "/getAsyncRoutes");
};

@ -0,0 +1,166 @@
import { http } from "@/utils/http";
/** 创建新的会话 */
export const createNewSession = (data?: object) => {
return http.request("post", "/intro-robot/session/createNewSession", {
data
});
};
/**
*/
export const querySessionPage = (data?: object) => {
return http.request("get", "/intro-robot/session/querySessionPage", {
params: data
});
};
export const deleteSession = (data?: object) => {
return http.request("post", "/intro-robot/session/deleteSession", {
data
});
};
/** ,ID
*/
export const queryAjBeforeCreatSession = (data?: object) => {
return http.request("get", "/intro-robot/session/queryAjBeforeCreatSession", {
params: data
});
};
/** 机器人对话服务(文字) */
export const textTalkRobot = (data?: object) => {
return http.request("post", "/intro-robot/robot/textTalkRobot", {
data
});
};
/** 机器人对话服务(语音) */
export const videoTalkRobot = (data?: object) => {
return http.request(
"post",
"/speech-demo-service/chat/talk",
{ data },
{ headers: { "Content-Type": "multipart/form-data" } }
);
};
/**
*/
export const talkList = (data?: object) => {
return http.request("get", "/intro-robot/robot/talkList", {
params: data
});
};
/**
*/
export const querySuspectInfo = (data?: object) => {
return http.request("get", "/intro-robot/robot/querySuspectInfo", {
params: data
});
};
// 查询会话历史记录列表(结束时评分选择使用,非对话框内容)
export const querySessionHistory = (data?: object) => {
return http.request("get", "/intro-robot/session/querySessionHistory", {
params: data
});
};
/** 结束会话 */
export const finishSession = (data?: object) => {
return http.request("post", "/intro-robot/session/finishSession", {
data
});
};
/**
*/
export const findSessionParam = (data?: object) => {
return http.request("get", "/intro-robot/sessionParam/findSessionParam", {
params: data
});
};
/** 保存会话参数 */
export const sessionParamSave = (data?: object) => {
return http.request("post", "/intro-robot/sessionParam/save", {
data
});
};
/** 测试*/
// export const chatStream = (data?: object) => {
// return http.request(
// "post",
// "/speech-demo-service/chat/stream",
// { data },
// { headers: { "Content-Type": "multipart/form-data" } }
// );
// }
export const chatStream = (data?: object) => {
return http.request("get", "speech-demo-service/chat/stream", {
params: data
});
};
export const uploadFile = (data?: object) => {
return http.request(
"post",
"/speech-demo-service/chat/asr",
{ data },
{ headers: { "Content-Type": "multipart/form-data" } }
);
};
// 对话列表接口
export const queryTalkList = (data?: object) => {
return http.request("get", "/speech-demo-service/chat/talkList", {
params: data
});
};
/**
*/
export const queryMessages = (data?: object) => {
return http.request("get", "/api/messages", {
params: data
});
};
export const audioToText = (data?: object) => {
return http.request(
"post",
"/api/audio-to-text",
{ data },
{
headers: {
"Content-Type": "multipart/form-data"
}
}
);
};
export const newAudioToText = (data?: object) => {
return http.request("post", "/asr/paddlespeech/asr", { data });
};
/** 文本转语音 */
export const textToAudio = (data?: object) => {
return http.request(
"post",
"/api/text-to-audio",
{
data
},
{ responseType: "blob" }
);
};
/** 文本转语音 */
export const getVoice = (data?: object) => {
return http.request(
"post",
"/tts/TTS_service",
{
data
},
{ responseType: "blob" }
);
};

@ -0,0 +1,39 @@
import { http } from "@/utils/http";
export type UserResult = {
success: boolean;
data: {
/** 用户名 */
userAccount: string;
/** `token` */
accessToken: string;
};
};
export type RefreshTokenResult = {
success: boolean;
data: {
/** `token` */
accessToken: string;
/** 用于调用刷新`accessToken`的接口时所需的`token` */
refreshToken: string;
/** `accessToken`的过期时间(格式'xxxx/xx/xx xx:xx:xx' */
expires: Date;
};
};
/** 登录 */
export const getLogin = (data?: object) => {
return http.request<UserResult>(
"post",
"/live-digital-avatar-manage/auth/login",
{
data
}
);
};
/** 刷新token */
export const refreshTokenApi = (data?: object) => {
return http.request<RefreshTokenResult>("post", "/refreshToken", { data });
};

@ -0,0 +1,22 @@
import { http } from "@/utils/http";
/** 查询字典树 */
export const queryCommonDictTree = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/commonDic/queryCommonDictTree",
{
params: data
}
);
};
/** 上传文件*/
export const uploadFile = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/fileManage/uploadFile",
{ data },
{ headers: { "Content-Type": "multipart/form-data" } }
);
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

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

Loading…
Cancel
Save