diff --git a/.workbuddy/memory/CHANGELOG.md b/.workbuddy/memory/CHANGELOG.md index f28151c..2f77900 100644 --- a/.workbuddy/memory/CHANGELOG.md +++ b/.workbuddy/memory/CHANGELOG.md @@ -1,6 +1,10 @@ # admin.xpcool.com 变更记录 > 倒序:最新在上。格式:YYYY-MM-DD | 类型 | 摘要 +2026-08-27 | CHG | 业务页逐个美化:system/admin、role、menu、log、login-log 五个页面统一加页面标题(wb-page-head)并将筛选区与表格各自包入 t-card(圆角轻投影,复用 theme.css),仅改 template 布局、脚本/逻辑零改动;theme.css 补 .wb-page-head/.wb-page-title/.wb-page-sub/.wb-filter-card 共享样式 +2026-08-27 | CHG | 操作日志列表页全面增强(前端):api/system.ts 的 LogItem 增加 adminUsername/ipLocation/errorMessage/userAgent、getSystemLogList 扩展为完整 LogQuery(时间范围/账号/IP/归属地/方法/结果/耗时上下限/排序);views/system/log/index.vue 重写——顶部多维筛选(t-date-range-picker + 各 input/select + 耗时范围 + 排序)+ 表格新列(操作账号/IP归属地/错误信息/UA)+ method/statusCode 彩色 tag、耗时≥1000ms 标红;对齐后端 POST /api/service/admin/system/log 增强接口;typecheck 通过 +2026-08-27 | CHG | 全局主题美化 + 工作台重做:新增 src/styles/theme.css(靛蓝#4f5bff→紫#7c3aed 品牌色 !important 强制生效、更大圆角、轻投影、非纯白纵深背景、主按钮渐变、纤细滚动条、暗色模式适配),bootstrap.ts 末尾 import 接入;工作台 page 重做为渐变英雄头+玻璃统计卡+图标快捷宫格(内联 SVG,无新依赖),保留既有数据聚合与容错 +2026-08-27 | CHG | 看房可视化扩充:dashboard 加楼盘地图(map-panel.vue 腾讯地图 GL JS 散点 + 点击信息窗,key 占位 YOUR_TENCENT_MAP_KEY 待申请,合规用腾讯地图 + inline SVG 图标);数据明细页由占位改成交记录列表(api/house.ts 加 getTransactionList + TransactionItem);typecheck 通过 2026-08-26 | CFG | 安装 TDesign MCP(~/.workbuddy/mcp.json 新增 tdesign-mcp-server: `npx -y tdesign-mcp-server@latest`,v0.2.4 启动验证通过);约定:后续后台界面开发优先用 TDesign MCP 查官方文档(get-component-docs 等) 2026-08-26 | FIX+CHG | 修复前端编译错误(access.ts layoutMap 重复声明致 vite Transform PARSE_ERROR);菜单管理树形改用 tdesign 官方方案:`t-enhanced-table`(t-table 不支持 tree)+ tree{childrenKey/treeNodeColumnIndex/defaultExpandAll/indent} + 异步数据后 `ref.expandAll()`(defaultExpandAll 仅首次渲染生效)——替代先前扁平化+缩进的自造方案 2026-08-26 | CFG | 新增 .gitea/workflows/deploy.yml(Gitea act_runner 自动部署):push main/dev → 下载 node22 二进制(npmmirror,覆盖镜像 node20,pnpm11 需 node:sqlite)→ corepack pnpm@11.16.0 → pnpm install → 直接 vite build(避开 turbo 卡死)→ cp dist 到 /data/www/admin.xpcool.com/;YAML 已校验 diff --git a/apps/web-tdesign/src/api/core/user.ts b/apps/web-tdesign/src/api/core/user.ts index 1d1f88a..9d3dded 100644 --- a/apps/web-tdesign/src/api/core/user.ts +++ b/apps/web-tdesign/src/api/core/user.ts @@ -23,7 +23,7 @@ export async function getUserInfoApi(): Promise { return { avatar: '', desc: '', - homePath: '/system/role', + homePath: '/workbench', realName: data.nickname ?? data.username, roles: data.roles ?? [], token: '', diff --git a/apps/web-tdesign/src/api/house.ts b/apps/web-tdesign/src/api/house.ts index e0f3af4..f32e7c1 100644 --- a/apps/web-tdesign/src/api/house.ts +++ b/apps/web-tdesign/src/api/house.ts @@ -25,10 +25,10 @@ export interface CommunityListResp { } export function getCommunityList(data: { - page: number; - size: number; keyword?: string; + page: number; region?: string; + size: number; }) { return requestClient.post( '/api/service/admin/house/community/list', @@ -132,8 +132,8 @@ export function deleteListing(id: number) { } export function batchMarkListing(data: { - ids: number[]; field: string; + ids: number[]; value: number; }) { return requestClient.post<{ affected: number }>( @@ -185,9 +185,9 @@ export function getDashboardOverview(data: { region?: string }) { } export function getMapPoints(data: { - region?: string; - priceMin?: number; priceMax?: number; + priceMin?: number; + region?: string; status?: number; }) { return requestClient.post<{ points: MapPoint[] }>( @@ -198,8 +198,8 @@ export function getMapPoints(data: { export function getPriceTrend(data: { communityId?: number; - region?: string; limit?: number; + region?: string; }) { return requestClient.post<{ trend: TrendPoint[] }>( '/api/service/admin/house/dashboard/price-trend', @@ -212,3 +212,58 @@ export function getAggregateRegion() { '/api/service/admin/house/dashboard/aggregate-region', ); } + +// ---------- 成交记录(/api/service/admin/house/transaction) ---------- +export interface TransactionItem { + id: number; + communityId: number; + communityName: string; + layout: string; + area: number; + dealPrice: number; + dealUnitPrice: number; + listDays: number; + dealDate: string; + source: string; +} + +export function getTransactionList(data: { + keyword?: string; + page: number; + region?: string; + size: number; +}) { + return requestClient.post<{ list: TransactionItem[]; total: number }>( + '/api/service/admin/house/transaction/list', + data, + ); +} + +// ---------- 新房预售证(/api/service/admin/house/presale) ---------- +export interface PresaleItem { + id: number; + presaleNo: string; + communityName: string; + developer: string; + region: string; + address: string; + buildingNo: string; + houseCount: number; + area: number; + purpose: string; + issueDate: string; + source: string; +} + +export function getPresaleList(data: { + keyword?: string; + page: number; + purpose?: string; + region?: string; + size: number; +}) { + return requestClient.post<{ list: PresaleItem[]; total: number }>( + '/api/service/admin/house/presale/list', + data, + ); +} diff --git a/apps/web-tdesign/src/api/recruitment.ts b/apps/web-tdesign/src/api/recruitment.ts new file mode 100644 index 0000000..c5b427a --- /dev/null +++ b/apps/web-tdesign/src/api/recruitment.ts @@ -0,0 +1,214 @@ +// 招聘考试聚合模块 API 客户端。 +// 接口规范:全部 POST;URL 不含任何参数(查询/路径参数均禁止);入参一律走 body。 +import { requestClient } from '#/api/request'; + +// ---------- 分类 / 状态枚举(与后端 CategoryNameMap/StatusNameMap 保持一致) ---------- +export const CATEGORY_OPTIONS = [ + { label: '公务员', value: 1 }, + { label: '事业单位', value: 2 }, + { label: '国企', value: 3 }, + { label: '央企', value: 4 }, + { label: '私企', value: 5 }, + { label: '其他', value: 6 }, +]; + +export const STATUS_OPTIONS = [ + { label: '全部', value: -1 }, + { label: '有效', value: 0 }, + { label: '已更正', value: 1 }, + { label: '已失效', value: 2 }, +]; + +// 贵州地区(默认贵阳)。 +export const REGION_OPTIONS = [ + '贵阳', + '遵义', + '六盘水', + '安顺', + '毕节', + '铜仁', + '黔西南', + '黔东南', + '黔南', + '贵安新区', +].map((r) => ({ label: r, value: r })); + +// ---------- 数据类型 ---------- +export interface RecruitmentItem { + id: number; + title: string; + sourceId: number; + sourceName: string; + orgId: number; + orgName: string; + category: number; + categoryName: string; + region: string; + publishDate: string; + deadline: string; + examDate: string; + url: string; + content: string; + attachments: string; + status: number; + statusName: string; + groupKey: string; + createdAt: string; +} + +export interface RecruitmentListResp { + list: RecruitmentItem[]; + total: number; +} + +export interface CategoryAggItem { + category: number; + categoryName: string; + count: number; +} + +export interface RegionAggItem { + region: string; + count: number; +} + +export interface TrendPointItem { + date: string; + count: number; +} + +export interface RecruitmentStatsResp { + total: number; + todayNew: number; + weekNew: number; + byCategory: CategoryAggItem[]; + byRegion: RegionAggItem[]; + recentTrend: TrendPointItem[]; +} + +export interface SourceItem { + id: number; + name: string; + baseUrl: string; + sourceType: number; + category: number; + region: string; + enabled: number; + lastSuccessAt: string; + failCount: number; + lastSummary: string; +} + +export interface SubscriptionItem { + id: number; + name: string; + deviceKey: string; + regions: string[]; + categories: number[]; + onlyNew: number; + pushTime: string; + enabled: number; +} + +// ---------- 列表 & 详情 ---------- +export interface RecruitmentQuery { + page: number; + size: number; + region?: string; + category?: number; + keyword?: string; + status?: number; + dateFrom?: string; + dateTo?: string; + orgName?: string; + sourceId?: number; + onlyNewToday?: boolean; +} + +export function getRecruitmentList(data: RecruitmentQuery) { + return requestClient.post( + '/api/service/admin/recruitment/info/list', + data, + ); +} + +export function getRecruitmentDetail(data: { id: number }) { + return requestClient.post<{ info: RecruitmentItem }>( + '/api/service/admin/recruitment/info/detail', + data, + ); +} + +// ---------- 看板 & 趋势 ---------- +export function getRecruitmentStats(data: { region?: string }) { + return requestClient.post( + '/api/service/admin/recruitment/stats', + data, + ); +} + +export function getRecruitmentTrend(data: { + category?: number; + days?: number; + region?: string; +}) { + return requestClient.post<{ trend: TrendPointItem[] }>( + '/api/service/admin/recruitment/trend', + data, + ); +} + +// ---------- 数据源 & 抓取 ---------- +export function getSourceList() { + return requestClient.post<{ list: SourceItem[] }>( + '/api/service/admin/recruitment/source/list', + ); +} + +export function triggerCrawl(data: { force?: boolean; sourceId?: number; }) { + return requestClient.post<{ summary: string; triggered: number; }>( + '/api/service/admin/recruitment/crawl/trigger', + data, + ); +} + +// ---------- 推送订阅 ---------- +export function getSubscriptionList() { + return requestClient.post<{ list: SubscriptionItem[] }>( + '/api/service/admin/recruitment/subscription/list', + ); +} + +export function saveSubscription(data: { + categories?: number[]; + deviceKey: string; + enabled?: number; + id?: number; + name: string; + onlyNew?: number; + pushTime?: string; + regions?: string[]; +}) { + return requestClient.post<{ id: number }>( + '/api/service/admin/recruitment/subscription/save', + data, + ); +} + +export function deleteSubscription(data: { id: number }) { + return requestClient.post( + '/api/service/admin/recruitment/subscription/delete', + data, + ); +} + +export function testPush(data: { + body?: string; + subscriptionId?: number; + title?: string; +}) { + return requestClient.post<{ message: string; result: boolean; }>( + '/api/service/admin/recruitment/push/test', + data, + ); +} diff --git a/apps/web-tdesign/src/api/system.ts b/apps/web-tdesign/src/api/system.ts index c80e71c..e59eab0 100644 --- a/apps/web-tdesign/src/api/system.ts +++ b/apps/web-tdesign/src/api/system.ts @@ -17,9 +17,9 @@ export interface AdminListResp { } export function getAdminList(data: { + keyword?: string; page: number; size: number; - keyword?: string; }) { return requestClient.post( '/api/service/admin/admin/list', @@ -28,10 +28,10 @@ export function getAdminList(data: { } export function createAdmin(data: { - username: string; - password: string; nickname: string; + password: string; roleIds: number[]; + username: string; }) { return requestClient.post<{ id: number }>( '/api/service/admin/admin/create', @@ -41,7 +41,7 @@ export function createAdmin(data: { export function updateAdmin( id: number, - data: { nickname: string; status: number; roleIds: number[] }, + data: { nickname: string; roleIds: number[]; status: number; }, ) { return requestClient.post(`/api/service/admin/admin/update/${id}`, data); } @@ -72,9 +72,9 @@ export interface RoleListResp { } export function getRoleList(data: { + keyword?: string; page: number; size: number; - keyword?: string; }) { return requestClient.post( '/api/service/admin/system/role/list', @@ -84,9 +84,9 @@ export function getRoleList(data: { export function createRole(data: { code: string; + menuIds: number[]; name: string; status: number; - menuIds: number[]; }) { return requestClient.post<{ id: number }>( '/api/service/admin/system/role/create', @@ -96,9 +96,12 @@ export function createRole(data: { export function updateRole( id: number, - data: { name: string; status: number; menuIds: number[] }, + data: { menuIds: number[]; name: string; status: number; }, ) { - return requestClient.post(`/api/service/admin/system/role/update/${id}`, data); + return requestClient.post( + `/api/service/admin/system/role/update/${id}`, + data, + ); } export function deleteRole(id: number) { @@ -135,7 +138,10 @@ export function createMenu(data: Partial) { } export function updateMenu(id: number, data: Partial) { - return requestClient.post(`/api/service/admin/system/menu/update/${id}`, data); + return requestClient.post( + `/api/service/admin/system/menu/update/${id}`, + data, + ); } export function deleteMenu(id: number) { @@ -143,17 +149,22 @@ export function deleteMenu(id: number) { } // ---------- 操作日志(/api/service/admin/system/log) ---------- +// 注意:接口规范为全部 POST、URL 不带参数、入参走 body。 export interface LogItem { id: number; adminId: number; - permission: string; - method: string; - path: string; - ip: string; - param: string; - durationMs: number; - statusCode: number; - createdAt: string; + adminUsername: string; // 操作账号(写入时冗余落库,免 JOIN) + permission: string; // 权限标识 + method: string; // HTTP 方法 + path: string; // 请求路径 + ip: string; // 来源 IP + ipLocation: string; // IP 归属地(如「中国 江苏省 苏州市 电信」) + param: string; // 请求参数(已脱敏) + durationMs: number; // 耗时(ms) + statusCode: number; // HTTP 状态码 + errorMessage: string; // 失败原因(响应非 2xx 时填充) + userAgent: string; // 浏览器 UA + createdAt: string; // 操作时间 } export interface LogListResp { @@ -161,13 +172,27 @@ export interface LogListResp { total: number; } -/** 操作日志分页查询(keyword 匹配权限码/路径/IP) */ -export function getSystemLogList(data: { +// 操作日志分页查询参数;覆盖时间、账号、IP、归属地、方法、结果、耗时、排序等维度。 +export interface LogQuery { page: number; size: number; - keyword?: string; - adminId?: number; -}) { + adminId?: number; // 按管理员ID精确过滤 + username?: string; // 按账号模糊过滤 + ip?: string; // 按来源 IP 模糊过滤 + ipLocation?: string; // 按 IP 归属地模糊过滤 + method?: string; // 按 HTTP 方法精确过滤(GET/POST/PUT/DELETE) + status?: number; // 0 全部 / 1 成功(2xx) / 2 失败(非2xx) + keyword?: string; // 权限码/路径/IP 关键字 + startTime?: string; // 起始时间 yyyy-MM-dd HH:mm:ss + endTime?: string; // 结束时间 yyyy-MM-dd HH:mm:ss + minDuration?: number; // 耗时下限(ms),0 不限 + maxDuration?: number; // 耗时上限(ms),0 不限 + orderBy?: string; // createdAt(默认) | durationMs + orderDir?: string; // desc(默认) | asc +} + +/** 操作日志分页查询 */ +export function getSystemLogList(data: LogQuery) { return requestClient.post('/api/service/admin/system/log', data); } @@ -191,8 +216,8 @@ export interface LoginLogListResp { export function getLoginLogList(data: { page: number; size: number; - username?: string; status?: number; + username?: string; }) { return requestClient.post( '/api/service/admin/system/login-log', diff --git a/apps/web-tdesign/src/bootstrap.ts b/apps/web-tdesign/src/bootstrap.ts index 9b24a7b..8bec036 100644 --- a/apps/web-tdesign/src/bootstrap.ts +++ b/apps/web-tdesign/src/bootstrap.ts @@ -18,6 +18,8 @@ import { router } from './router'; // 引入组件库的少量全局样式变量 import 'tdesign-vue-next/es/style/index.css'; +// 引入全局主题美化(品牌色/圆角/阴影/背景纵深),须置于上方样式之后 +import '#/styles/theme.css'; async function bootstrap(namespace: string) { // 初始化组件适配器 diff --git a/apps/web-tdesign/src/styles/theme.css b/apps/web-tdesign/src/styles/theme.css new file mode 100644 index 0000000..be5ff2e --- /dev/null +++ b/apps/web-tdesign/src/styles/theme.css @@ -0,0 +1,199 @@ +/** + * 全局主题美化 + * 设计语言:靛蓝(indigo)主色 + 紫(violet)渐变点缀;柔和圆角;轻投影;有纵深的浅色背景。 + * 说明:Vben 的 useTDesignDesignTokens 会用 JS 把品牌色写到 documentElement 上, + * 普通 :root 规则会被内联样式压过;因此对关键 --td-* 变量加 !important 强制生效。 + */ + +:root { + /* —— 品牌主色(靛蓝 #4f5bff → 紫 #7c3aed 渐变体系) —— */ + --td-brand-color: #4f5bff !important; + --td-brand-color-hover: #6b75ff !important; + --td-brand-color-active: #3a45e0 !important; + --td-brand-color-disabled: #c2c7ff !important; + --td-brand-color-light: #eef0ff !important; + --td-brand-color-light-hover: #e0e3ff !important; + --td-brand-color-light-active: #d6daff !important; + + /* —— 圆角:更现代、更柔 —— */ + --td-radius-small: 6px !important; + --td-radius-medium: 10px !important; + --td-radius-large: 14px !important; + --td-radius-round: 999px !important; + --td-radius-circle: 50% !important; + + /* —— 投影:更轻、更有层次 —— */ + --td-shadow-1: 0 1px 2px rgb(16 24 40 / 4%), + 0 1px 3px rgb(16 24 40 / 6%) !important; + --td-shadow-2: 0 2px 4px rgb(16 24 40 / 4%), + 0 8px 24px rgb(16 24 40 / 6%) !important; + --td-shadow-3: 0 4px 8px rgb(16 24 40 / 5%), + 0 16px 40px rgb(16 24 40 / 8%) !important; + + /* —— 边框:更淡 —— */ + --td-component-stroke: #eef0f5 !important; + --td-border-level-1-color: #eef0f5 !important; + --td-bg-color-page: #f5f7fb !important; +} + +/* 页面整体:不再纯白,带极淡的冷色纵深 */ +html { + font-family: 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', + 'Noto Sans SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + text-rendering: optimizelegibility; +} + +body { + background-color: #f5f7fb; + background-image: radial-gradient( + 1200px 600px at 100% -10%, + rgb(79 91 255 / 6%), + transparent 60% + ), + radial-gradient( + 900px 500px at -10% 110%, + rgb(124 58 237 / 5%), + transparent 55% + ); + background-attachment: fixed; +} + +/* 内容区卡片化:让所有 TDesign 卡片更精致 */ +.t-card { + overflow: hidden; + border-color: var(--td-border-level-1-color); + border-radius: var(--td-radius-large); + box-shadow: var(--td-shadow-2); +} + +.t-card__header { + padding: 16px 20px; + border-bottom: 1px solid var(--td-border-level-1-color); +} + +.t-card__title { + font-size: 15px; + font-weight: 600; + color: #1d2129; +} + +.t-card__body { + padding: 16px 20px; +} + +/* 表格更透气 */ +.t-table { + --td-table-bg-color: transparent; +} + +.t-table__header th { + font-weight: 600; + color: #4e5969; + background-color: #fafbff !important; +} + +/* 主按钮:带品牌渐变,更出彩 */ +.t-button--theme-primary:not(.t-button--variant-outline):not( + .t-button--variant-text + ):not(.t-button--variant-dashed) { + background: linear-gradient(135deg, #4f5bff 0%, #7c3aed 100%); + border: none; + box-shadow: 0 4px 12px rgb(79 91 255 / 28%); + transition: transform 0.12s ease, box-shadow 0.12s ease, filter 0.12s ease; +} + +.t-button--theme-primary:not(.t-button--variant-outline):not( + .t-button--variant-text + ):not(.t-button--variant-dashed):hover { + box-shadow: 0 6px 16px rgb(79 91 255 / 36%); + filter: brightness(1.05); + transform: translateY(-1px); +} + +.t-button--theme-primary:not(.t-button--variant-outline):not( + .t-button--variant-text + ):not(.t-button--variant-dashed):active { + transform: translateY(0); +} + +/* 滚动条:纤细、克制 */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-thumb { + background: rgb(29 33 41 / 18%); + border-radius: 999px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgb(29 33 41 / 30%); +} + +::-webkit-scrollbar-track { + background: transparent; +} + +/* 暗色模式:收敛背景纵深,保持卡片质感 */ +html[theme-mode='dark'] body { + background-color: #16171a; + background-image: radial-gradient( + 1200px 600px at 100% -10%, + rgb(79 91 255 / 12%), + transparent 60% + ), + radial-gradient( + 900px 500px at -10% 110%, + rgb(124 58 237 / 10%), + transparent 55% + ); +} + +html[theme-mode='dark'] .t-card { + border-color: rgb(255 255 255 / 8%); +} + +html[theme-mode='dark'] .t-card__header { + border-bottom-color: rgb(255 255 255 / 8%); +} + +html[theme-mode='dark'] .t-table__header th { + background-color: rgb(255 255 255 / 4%) !important; +} + +/* —— 业务页统一:页面标题 + 筛选/表格卡片 —— */ +.wb-page-head { + margin-bottom: 16px; +} + +.wb-page-title { + margin: 0; + font-size: 18px; + font-weight: 600; + color: #1d2129; +} + +.wb-page-sub { + margin: 4px 0 0; + font-size: 13px; + color: #86909c; +} + +.wb-filter-card { + margin-bottom: 16px; +} + +.wb-filter-card .t-card__body { + padding: 16px 20px; +} + +html[theme-mode='dark'] .wb-page-title { + color: rgb(255 255 255 / 90%); +} + +html[theme-mode='dark'] .wb-page-sub { + color: rgb(255 255 255 / 50%); +} diff --git a/apps/web-tdesign/src/views/dashboard/workbench/index.vue b/apps/web-tdesign/src/views/dashboard/workbench/index.vue new file mode 100644 index 0000000..a5121fb --- /dev/null +++ b/apps/web-tdesign/src/views/dashboard/workbench/index.vue @@ -0,0 +1,592 @@ + + + + + diff --git a/apps/web-tdesign/src/views/house/dashboard/index.vue b/apps/web-tdesign/src/views/house/dashboard/index.vue index bed114c..0371a1d 100644 --- a/apps/web-tdesign/src/views/house/dashboard/index.vue +++ b/apps/web-tdesign/src/views/house/dashboard/index.vue @@ -1,5 +1,6 @@ + + diff --git a/apps/web-tdesign/src/views/house/data/index.vue b/apps/web-tdesign/src/views/house/data/index.vue index 9666fd8..75c5871 100644 --- a/apps/web-tdesign/src/views/house/data/index.vue +++ b/apps/web-tdesign/src/views/house/data/index.vue @@ -1,18 +1,102 @@ diff --git a/apps/web-tdesign/src/views/house/presale/index.vue b/apps/web-tdesign/src/views/house/presale/index.vue new file mode 100644 index 0000000..fff7fe2 --- /dev/null +++ b/apps/web-tdesign/src/views/house/presale/index.vue @@ -0,0 +1,123 @@ + + + diff --git a/apps/web-tdesign/src/views/recruitment/crawler/index.vue b/apps/web-tdesign/src/views/recruitment/crawler/index.vue new file mode 100644 index 0000000..3ffa254 --- /dev/null +++ b/apps/web-tdesign/src/views/recruitment/crawler/index.vue @@ -0,0 +1,126 @@ + + + diff --git a/apps/web-tdesign/src/views/recruitment/dashboard/index.vue b/apps/web-tdesign/src/views/recruitment/dashboard/index.vue new file mode 100644 index 0000000..cf0de83 --- /dev/null +++ b/apps/web-tdesign/src/views/recruitment/dashboard/index.vue @@ -0,0 +1,147 @@ + + + diff --git a/apps/web-tdesign/src/views/recruitment/info/index.vue b/apps/web-tdesign/src/views/recruitment/info/index.vue new file mode 100644 index 0000000..fa765b8 --- /dev/null +++ b/apps/web-tdesign/src/views/recruitment/info/index.vue @@ -0,0 +1,256 @@ + + + diff --git a/apps/web-tdesign/src/views/recruitment/push/index.vue b/apps/web-tdesign/src/views/recruitment/push/index.vue new file mode 100644 index 0000000..3d340f8 --- /dev/null +++ b/apps/web-tdesign/src/views/recruitment/push/index.vue @@ -0,0 +1,268 @@ + + + diff --git a/apps/web-tdesign/src/views/system/admin/index.vue b/apps/web-tdesign/src/views/system/admin/index.vue index 28b8d74..9d4a836 100644 --- a/apps/web-tdesign/src/views/system/admin/index.vue +++ b/apps/web-tdesign/src/views/system/admin/index.vue @@ -23,7 +23,7 @@ const loading = ref(false); const list = ref([]); const roleOptions = ref<{ label: string; value: number }[]>([]); const dialogOpen = ref(false); -const editing = ref(null); +const editing = ref(null); const query = reactive({ page: 1, size: 10, keyword: '' }); const pagination = reactive({ current: 1, pageSize: 10, total: 0 }); @@ -56,7 +56,13 @@ async function loadRoles() { function openCreate() { editing.value = null; - Object.assign(form, { username: '', password: '', nickname: '', status: 1, roleIds: [] }); + Object.assign(form, { + username: '', + password: '', + nickname: '', + status: 1, + roleIds: [], + }); dialogOpen.value = true; } @@ -147,66 +153,83 @@ onMounted(() => {