index.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. /**
  2. * 测试数据 Fixtures
  3. * 提供各模块的模拟数据
  4. */
  5. import type { AdminInfo, LoginResponse, MachineDTO, CameraInfoDTO, ChannelInfoDTO, DashboardStatsDTO } from '@/types'
  6. // ==================== 用户/认证数据 ====================
  7. export const mockAdminInfo: AdminInfo = {
  8. id: 1,
  9. username: 'admin',
  10. nickname: '管理员',
  11. role: 'admin',
  12. lastLoginAt: '2024-01-01T00:00:00Z'
  13. }
  14. export const mockLoginResponse: LoginResponse = {
  15. token: 'mock-jwt-token-12345',
  16. tokenType: 'Bearer',
  17. expiresIn: 3600,
  18. refreshToken: 'mock-refresh-token-67890',
  19. admin: mockAdminInfo
  20. }
  21. export const mockUsers = [
  22. { ...mockAdminInfo },
  23. {
  24. id: 2,
  25. username: 'operator1',
  26. nickname: '操作员1',
  27. role: 'operator',
  28. lastLoginAt: '2024-01-02T00:00:00Z'
  29. },
  30. {
  31. id: 3,
  32. username: 'viewer1',
  33. nickname: '观察员1',
  34. role: 'viewer',
  35. lastLoginAt: '2024-01-03T00:00:00Z'
  36. }
  37. ]
  38. // ==================== 机器数据 ====================
  39. export const mockMachines: MachineDTO[] = [
  40. {
  41. id: 1,
  42. machineId: 'machine-001',
  43. name: '一号机',
  44. location: '一楼大厅',
  45. description: '主入口监控',
  46. enabled: true,
  47. cameraCount: 3,
  48. createdAt: '2024-01-01 00:00:00',
  49. updatedAt: '2024-01-01 00:00:00'
  50. },
  51. {
  52. id: 2,
  53. machineId: 'machine-002',
  54. name: '二号机',
  55. location: '二楼走廊',
  56. description: '走廊监控',
  57. enabled: true,
  58. cameraCount: 2,
  59. createdAt: '2024-01-02 00:00:00',
  60. updatedAt: '2024-01-02 00:00:00'
  61. },
  62. {
  63. id: 3,
  64. machineId: 'machine-003',
  65. name: '三号机',
  66. location: '停车场',
  67. description: '停车场监控',
  68. enabled: false,
  69. cameraCount: 4,
  70. createdAt: '2024-01-03 00:00:00',
  71. updatedAt: '2024-01-03 00:00:00'
  72. }
  73. ]
  74. // ==================== 通道数据 ====================
  75. export const mockChannels: ChannelInfoDTO[] = [
  76. {
  77. id: 1,
  78. channelId: 'ch-001',
  79. name: '通道1-主视角',
  80. rtspUrl: 'rtsp://192.168.1.100:554/stream1',
  81. defaultView: true,
  82. status: 'ONLINE'
  83. },
  84. {
  85. id: 2,
  86. channelId: 'ch-002',
  87. name: '通道2-侧视角',
  88. rtspUrl: 'rtsp://192.168.1.100:554/stream2',
  89. defaultView: false,
  90. status: 'ONLINE'
  91. },
  92. {
  93. id: 3,
  94. channelId: 'ch-003',
  95. name: '通道3-广角',
  96. rtspUrl: 'rtsp://192.168.1.100:554/stream3',
  97. defaultView: false,
  98. status: 'OFFLINE'
  99. }
  100. ]
  101. // ==================== 摄像头数据 ====================
  102. export const mockCameras: CameraInfoDTO[] = [
  103. {
  104. id: 1,
  105. cameraId: 'cam-001',
  106. name: '大厅摄像头1',
  107. ip: '192.168.1.100',
  108. port: 80,
  109. username: 'admin',
  110. brand: 'hikvision',
  111. capability: 'ptz_enabled',
  112. status: 'ONLINE',
  113. machineId: 'machine-001',
  114. machineName: '一号机',
  115. enabled: true,
  116. channels: [mockChannels[0], mockChannels[1]],
  117. createdAt: '2024-01-01 00:00:00',
  118. updatedAt: '2024-01-01 00:00:00'
  119. },
  120. {
  121. id: 2,
  122. cameraId: 'cam-002',
  123. name: '大厅摄像头2',
  124. ip: '192.168.1.101',
  125. port: 80,
  126. username: 'admin',
  127. brand: 'dahua',
  128. capability: 'switch_only',
  129. status: 'ONLINE',
  130. machineId: 'machine-001',
  131. machineName: '一号机',
  132. enabled: true,
  133. channels: [mockChannels[2]],
  134. createdAt: '2024-01-02 00:00:00',
  135. updatedAt: '2024-01-02 00:00:00'
  136. },
  137. {
  138. id: 3,
  139. cameraId: 'cam-003',
  140. name: '走廊摄像头',
  141. ip: '192.168.1.102',
  142. port: 80,
  143. username: 'admin',
  144. brand: 'hikvision',
  145. capability: 'ptz_enabled',
  146. status: 'OFFLINE',
  147. machineId: 'machine-002',
  148. machineName: '二号机',
  149. enabled: false,
  150. channels: [],
  151. createdAt: '2024-01-03 00:00:00',
  152. updatedAt: '2024-01-03 00:00:00'
  153. }
  154. ]
  155. // ==================== 统计数据 ====================
  156. export const mockDashboardStats: DashboardStatsDTO = {
  157. machineTotal: 3,
  158. machineEnabled: 2,
  159. cameraTotal: 9,
  160. cameraOnline: 7,
  161. cameraOffline: 2,
  162. channelTotal: 18
  163. }
  164. // ==================== API 响应包装 ====================
  165. /**
  166. * 包装单个数据响应 (IBaseResponse<T>)
  167. */
  168. export function wrapResponse<T>(data: T, success = true, errMessage?: string) {
  169. return {
  170. success,
  171. data,
  172. errCode: success ? undefined : 'ERROR',
  173. errMessage: success ? undefined : errMessage
  174. }
  175. }
  176. /**
  177. * 包装分页列表响应 (IPageResponse<T>) - 新版分页格式
  178. */
  179. export function wrapPageResponse<T>(list: T[], page = 1, size = 20) {
  180. const total = list.length
  181. const totalPages = Math.ceil(total / size)
  182. return {
  183. success: true,
  184. data: {
  185. list,
  186. page,
  187. size,
  188. total,
  189. totalPages,
  190. hasNext: page < totalPages,
  191. hasPrevious: page > 1
  192. }
  193. }
  194. }
  195. /**
  196. * 包装数组列表响应 (IListResponse<T>) - 不分页
  197. */
  198. export function wrapArrayResponse<T>(list: T[]) {
  199. return {
  200. success: true,
  201. data: list
  202. }
  203. }
  204. /**
  205. * @deprecated 使用 wrapPageResponse 代替
  206. */
  207. export function wrapListResponse<T>(list: T[], total?: number) {
  208. return {
  209. success: true,
  210. data: {
  211. list,
  212. total: String(total ?? list.length)
  213. }
  214. }
  215. }
  216. /**
  217. * 包装错误响应
  218. */
  219. export function wrapErrorResponse(errMessage: string, errCode = 'ERROR') {
  220. return {
  221. success: false,
  222. errCode,
  223. errMessage,
  224. data: undefined
  225. }
  226. }