Files
yunhai-agent-front/vite.config.ts
T
lijing 4e6725aa1b
build / build (push) Successful in 1m53s
feat(profession): 发布专业发展记录表单对齐模块页,支持栏目动态字段
参照 ProfessionView/src/views/profession/RecordEdit.vue(权威契约)逐字段重写:

- 正文字段名由 content 改为 remark;按模块页补齐「年级段 / 学科 / 是否公开 / 栏目动态字段 / 添加附件」
- 新增「栏目动态字段」机制:这组字段由**栏目的后台配置**决定,后端构建期无法枚举 ⇒
  后端只下发「去哪儿取」(含 {{占位符}} 依赖映射),前端带用户登录态取回后就地渲染;
  提交时按模块页口径打包成 contents = JSON.stringify([{fieldId,value}])
- 支持七种栏目字段类型:text(多行转 textarea) / number / date / radio / checkbox / select / province_city(级联)
- 分区渲染在「正文内容」之前,与模块页一致;取不到字段定义时保留下拉并给「重新加载」
- 单行文本控件补 maxlength 与 placeholder(原先只有 textarea 认 placeholder)
- vite dev 补 /profession 代理,让「路径拼错」在本地就暴露
2026-10-13 18:11:03 +08:00

139 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { UserConfig, defineConfig } from "vite";
import { createHtmlPlugin } from "vite-plugin-html";
import vue from "@vitejs/plugin-vue";
import path, { resolve } from "path";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import ViteAutoImport from "unplugin-auto-import/vite";
import UnoCSS from "@unocss/vite";
import presetUno from "@unocss/preset-uno";
import presetRemToPx from "@unocss/preset-rem-to-px";
export default defineConfig((): UserConfig => {
// 构建产物直出 dist/ 根(CI 打 zip 取 dist 根,projman 校验要求 zip 根直接是 index.html)
const outDir = "dist";
return {
plugins: [
vue(),
createSvgIconsPlugin({
iconDirs: [resolve(process.cwd(), "src/assets/icons")],
symbolId: "icon-[dir]-[name]",
inject: "body-last",
customDomId: "__svg__icons__dom__",
}),
ViteAutoImport({
imports: [
"vue",
"vue-router",
{
"view-ui-plus": ["Button", "Input", "Message", "Avatar", "Tag", "Tooltip"],
},
{
from: "alova/client",
imports: ["useRequest", "useWatcher", "useForm"],
},
],
dts: "./src/auto-imports.d.ts",
dirs: ["src/api/module"],
}),
createHtmlPlugin({
minify: true,
pages: [
{
entry: "src/main.ts",
template: "index.html",
filename: "index.html",
injectOptions: {
data: {
title: "智能助手",
injectScript: ``,
},
},
},
],
}),
UnoCSS({
presets: [
presetUno(),
presetRemToPx({ baseFontSize: 4 }),
],
shortcuts: {
"flex-center": "flex items-center justify-center",
card: "bg-white rounded-8px shadow-md p-16px",
"text-ellipsis": "truncate",
},
theme: {
fontSize: {
xs: "12px",
sm: "14px",
base: "16px",
lg: "18px",
xl: "20px",
"2xl": "24px",
},
},
}),
],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
server: {
host: "localhost",
port: 8080,
proxy: {
// 同源代理:serviceHost 留空时前端走 /api/...,由这里转发到本地 AgentService(8093),
// 规避后端 CAS 过滤器对 /api/* 不回 CORS 头导致的浏览器直连跨域拦截。
// 如需连测试环境:target 换成 http://base.yunhaixingtong.com/agent
"/api": {
target: "http://localhost:8093",
changeOrigin: true,
},
// 业务模块前缀:模块的**路由前缀与模块 key 不一定同名** —— 请假的 key 是
// `homeleave` 而真实前缀是 `/home-leave`。后端下发的 optionCall / 附件 uploadPath
// 都会带上真实前缀,本地一并代理到 mock,好让「路径拼错」这类问题在本地就暴露
// (请假的佐证材料就曾因为拼成 /homeleave/api/base/FileUpload 而 404,直到上线才发现)。
"/home-leave": { target: "http://localhost:8093", changeOrigin: true },
"/campusnotice": { target: "http://localhost:8093", changeOrigin: true },
"/dormnotice": { target: "http://localhost:8093", changeOrigin: true },
"/familyactivity": { target: "http://localhost:8093", changeOrigin: true },
"/coursehomework": { target: "http://localhost:8093", changeOrigin: true },
// 教师专业发展:前缀与模块 key 同名(profession),但按同一条铁律显式列出,
// 免得以后改了 key 又出现「本地测不出、上线 404」。
"/profession": { target: "http://localhost:8093", changeOrigin: true },
},
},
base: "./",
build: {
target: "modules",
outDir,
assetsDir: "assets",
sourcemap: false,
minify: "esbuild",
chunkSizeWarningLimit: 1000,
cssTarget: "chrome61",
rollupOptions: {
input: {
main: resolve("index.html"),
},
output: {
chunkFileNames: "static/js/[name]-[hash].js",
entryFileNames: "static/js/[name]-[hash].js",
assetFileNames: (assetInfo: any) => {
if (assetInfo.type === "asset" && /\.(jpe?g|png|gif|svg)$/i.test(assetInfo.name)) {
return "static/img/[name].[hash][ext]";
}
if (assetInfo.type === "asset" && /\.(ttf|woff|woff2|eot)$/i.test(assetInfo.name)) {
return "static/fonts/[name].[hash][ext]";
}
return "static/[ext]/[name]-[hash].[ext]";
},
},
},
},
};
});