From 8ab6107f257747c20904448418258a25c4820c87 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Tue, 20 Jan 2026 16:17:39 +0800 Subject: [PATCH 1/2] =?UTF-8?q?1=E8=BD=AE=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/src/main/resources/bootstrap.yml | 64 ++ .../auth/src/main/resources/bootstrap.yml | 64 ++ .../file/src/main/resources/bootstrap.yml | 64 ++ .../system/controller/GuestController.java | 15 +- .../system/mapper/user/TbGuestMapper.java | 6 +- .../system/src/main/resources/bootstrap.yml | 64 ++ .../controller/WorkcaseController.java | 10 +- .../workcase/service/WorkcaseServiceImpl.java | 2 + .../workcase/src/main/resources/bootstrap.yml | 64 ++ urbanLifelineWeb/package-lock.json | 26 +- .../packages/shared/src/api/sys/guest.ts | 2 +- .../packages/shared/vite.config.ts | 1 + .../packages/workcase/src/api/index.ts | 6 +- .../packages/workcase/src/types/shared.d.ts | 6 +- .../src/views/admin/workcase/WorkcaseView.vue | 166 ++- .../packages/workcase_wechat/api/sys/guest.ts | 11 + .../packages/workcase_wechat/config/index.ts | 11 +- .../pages/chatRoom/chatRoom/chatRoom.uvue | 348 ++++++- .../chatRoom/chatRoomList/chatRoomList.uvue | 960 +++++++++++++----- .../workcase_wechat/pages/index/index.scss | 256 +++-- .../workcase_wechat/pages/index/index.uvue | 306 +++--- .../pages/meeting/Meeting.uvue | 41 +- .../workcase/workcaseList/workcaseList.uvue | 706 ++++++++++--- 23 files changed, 2587 insertions(+), 612 deletions(-) create mode 100644 urbanLifelineServ/ai/src/main/resources/bootstrap.yml create mode 100644 urbanLifelineServ/auth/src/main/resources/bootstrap.yml create mode 100644 urbanLifelineServ/file/src/main/resources/bootstrap.yml create mode 100644 urbanLifelineServ/system/src/main/resources/bootstrap.yml create mode 100644 urbanLifelineServ/workcase/src/main/resources/bootstrap.yml diff --git a/urbanLifelineServ/ai/src/main/resources/bootstrap.yml b/urbanLifelineServ/ai/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..60998f2b --- /dev/null +++ b/urbanLifelineServ/ai/src/main/resources/bootstrap.yml @@ -0,0 +1,64 @@ +# ================================================ +# Urban Lifeline - 通用 Bootstrap 配置 +# 所有微服务共享的基础配置 +# ================================================ + +# ================== Spring Cloud Nacos ================== +spring: + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + namespace: ${NACOS_NAMESPACE:dev} + group: ${NACOS_GROUP:DEFAULT_GROUP} + + # ================== DataSource ================== + datasource: + url: ${DB_URL:jdbc:postgresql://127.0.0.1:5432/urban_lifeline} + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:postgres} + driver-class-name: org.postgresql.Driver + + # ================== Redis ================== + data: + redis: + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + database: ${REDIS_DATABASE:0} + password: ${REDIS_PASSWORD:123456} + +# ================== Security AES ================== +security: + aes: + # AES-256 密钥(Base64编码,必须与所有服务保持一致) + # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 + secret-key: ${AES_SECRET_KEY:MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=} + +# ================== Dubbo ================== +dubbo: + protocol: + name: dubbo + port: -1 + registry: + address: nacos://${NACOS_SERVER_ADDR:127.0.0.1:8848} + +# ================== MyBatis-Plus ================== +mybatis-plus: + mapper-locations: classpath:mapper/**/*.xml + type-aliases-package: org.xyzh.common.dto, org.xyzh.api + +# ================== SpringDoc 基础配置 ================== +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + +# ================== Logging ================== +logging: + config: classpath:log4j2.xml + charset: + console: UTF-8 + file: UTF-8 diff --git a/urbanLifelineServ/auth/src/main/resources/bootstrap.yml b/urbanLifelineServ/auth/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..60998f2b --- /dev/null +++ b/urbanLifelineServ/auth/src/main/resources/bootstrap.yml @@ -0,0 +1,64 @@ +# ================================================ +# Urban Lifeline - 通用 Bootstrap 配置 +# 所有微服务共享的基础配置 +# ================================================ + +# ================== Spring Cloud Nacos ================== +spring: + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + namespace: ${NACOS_NAMESPACE:dev} + group: ${NACOS_GROUP:DEFAULT_GROUP} + + # ================== DataSource ================== + datasource: + url: ${DB_URL:jdbc:postgresql://127.0.0.1:5432/urban_lifeline} + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:postgres} + driver-class-name: org.postgresql.Driver + + # ================== Redis ================== + data: + redis: + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + database: ${REDIS_DATABASE:0} + password: ${REDIS_PASSWORD:123456} + +# ================== Security AES ================== +security: + aes: + # AES-256 密钥(Base64编码,必须与所有服务保持一致) + # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 + secret-key: ${AES_SECRET_KEY:MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=} + +# ================== Dubbo ================== +dubbo: + protocol: + name: dubbo + port: -1 + registry: + address: nacos://${NACOS_SERVER_ADDR:127.0.0.1:8848} + +# ================== MyBatis-Plus ================== +mybatis-plus: + mapper-locations: classpath:mapper/**/*.xml + type-aliases-package: org.xyzh.common.dto, org.xyzh.api + +# ================== SpringDoc 基础配置 ================== +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + +# ================== Logging ================== +logging: + config: classpath:log4j2.xml + charset: + console: UTF-8 + file: UTF-8 diff --git a/urbanLifelineServ/file/src/main/resources/bootstrap.yml b/urbanLifelineServ/file/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..60998f2b --- /dev/null +++ b/urbanLifelineServ/file/src/main/resources/bootstrap.yml @@ -0,0 +1,64 @@ +# ================================================ +# Urban Lifeline - 通用 Bootstrap 配置 +# 所有微服务共享的基础配置 +# ================================================ + +# ================== Spring Cloud Nacos ================== +spring: + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + namespace: ${NACOS_NAMESPACE:dev} + group: ${NACOS_GROUP:DEFAULT_GROUP} + + # ================== DataSource ================== + datasource: + url: ${DB_URL:jdbc:postgresql://127.0.0.1:5432/urban_lifeline} + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:postgres} + driver-class-name: org.postgresql.Driver + + # ================== Redis ================== + data: + redis: + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + database: ${REDIS_DATABASE:0} + password: ${REDIS_PASSWORD:123456} + +# ================== Security AES ================== +security: + aes: + # AES-256 密钥(Base64编码,必须与所有服务保持一致) + # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 + secret-key: ${AES_SECRET_KEY:MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=} + +# ================== Dubbo ================== +dubbo: + protocol: + name: dubbo + port: -1 + registry: + address: nacos://${NACOS_SERVER_ADDR:127.0.0.1:8848} + +# ================== MyBatis-Plus ================== +mybatis-plus: + mapper-locations: classpath:mapper/**/*.xml + type-aliases-package: org.xyzh.common.dto, org.xyzh.api + +# ================== SpringDoc 基础配置 ================== +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + +# ================== Logging ================== +logging: + config: classpath:log4j2.xml + charset: + console: UTF-8 + file: UTF-8 diff --git a/urbanLifelineServ/system/src/main/java/org/xyzh/system/controller/GuestController.java b/urbanLifelineServ/system/src/main/java/org/xyzh/system/controller/GuestController.java index b3137c12..026fdaac 100644 --- a/urbanLifelineServ/system/src/main/java/org/xyzh/system/controller/GuestController.java +++ b/urbanLifelineServ/system/src/main/java/org/xyzh/system/controller/GuestController.java @@ -10,6 +10,7 @@ import com.alibaba.fastjson2.JSON; import org.apache.dubbo.config.annotation.DubboReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springdoc.core.annotations.ParameterObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; @@ -81,7 +82,7 @@ public class GuestController { @PostMapping - public ResultDomain createGuest(TbGuestDTO guest) { + public ResultDomain createGuest(@RequestBody TbGuestDTO guest) { ValidationUtils.validate(guest, Arrays.asList( ValidationUtils.requiredString("name", "姓名"), ValidationUtils.atLeastOne( @@ -93,7 +94,7 @@ public class GuestController { } @PutMapping - public ResultDomain updateGuest(TbGuestDTO guest) { + public ResultDomain updateGuest(@RequestBody TbGuestDTO guest) { ValidationUtils.validate(guest, Arrays.asList( ValidationUtils.requiredString("name", "姓名"), ValidationUtils.atLeastOne( @@ -104,8 +105,8 @@ public class GuestController { return guestService.updateGuest(guest); } - @DeleteMapping - public ResultDomain deleteGuest(@NotNull String userId) { + @DeleteMapping("/{userId}") + public ResultDomain deleteGuest(@PathVariable("userId") @NotNull String userId) { return guestService.deleteGuest(userId); } @@ -115,13 +116,13 @@ public class GuestController { } - @GetMapping("/list") - public ResultDomain listGuest(TbGuestDTO filter) { + @PostMapping("/list") + public ResultDomain listGuest(@RequestBody TbGuestDTO filter) { return guestService.selectGuestList(filter); } @PostMapping("/page") - public ResultDomain pageGuest(PageRequest pageRequest) { + public ResultDomain pageGuest(@RequestBody PageRequest pageRequest) { return guestService.selectGuestPage(pageRequest); } diff --git a/urbanLifelineServ/system/src/main/java/org/xyzh/system/mapper/user/TbGuestMapper.java b/urbanLifelineServ/system/src/main/java/org/xyzh/system/mapper/user/TbGuestMapper.java index 79b36b4c..04c4dfeb 100644 --- a/urbanLifelineServ/system/src/main/java/org/xyzh/system/mapper/user/TbGuestMapper.java +++ b/urbanLifelineServ/system/src/main/java/org/xyzh/system/mapper/user/TbGuestMapper.java @@ -3,6 +3,8 @@ package org.xyzh.system.mapper.user; import java.util.List; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.security.access.method.P; import org.xyzh.common.core.page.PageParam; import org.xyzh.common.dto.sys.TbGuestDTO; @@ -64,7 +66,7 @@ public interface TbGuestMapper extends BaseMapper{ * @author yslg * @since 2025-12-18 */ - List selectGuestList(TbGuestDTO guest); + List selectGuestList(@Param("filter") TbGuestDTO filter); /** * @description 查询来客分页列表 @@ -73,7 +75,7 @@ public interface TbGuestMapper extends BaseMapper{ * @author yslg * @since 2025-12-18 */ - List selectGuestPage(TbGuestDTO guest, PageParam pageParam); + List selectGuestPage(@Param("filter") TbGuestDTO guest, @Param("pageParam") PageParam pageParam); int countGuest(TbGuestDTO guest); } diff --git a/urbanLifelineServ/system/src/main/resources/bootstrap.yml b/urbanLifelineServ/system/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..60998f2b --- /dev/null +++ b/urbanLifelineServ/system/src/main/resources/bootstrap.yml @@ -0,0 +1,64 @@ +# ================================================ +# Urban Lifeline - 通用 Bootstrap 配置 +# 所有微服务共享的基础配置 +# ================================================ + +# ================== Spring Cloud Nacos ================== +spring: + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + namespace: ${NACOS_NAMESPACE:dev} + group: ${NACOS_GROUP:DEFAULT_GROUP} + + # ================== DataSource ================== + datasource: + url: ${DB_URL:jdbc:postgresql://127.0.0.1:5432/urban_lifeline} + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:postgres} + driver-class-name: org.postgresql.Driver + + # ================== Redis ================== + data: + redis: + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + database: ${REDIS_DATABASE:0} + password: ${REDIS_PASSWORD:123456} + +# ================== Security AES ================== +security: + aes: + # AES-256 密钥(Base64编码,必须与所有服务保持一致) + # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 + secret-key: ${AES_SECRET_KEY:MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=} + +# ================== Dubbo ================== +dubbo: + protocol: + name: dubbo + port: -1 + registry: + address: nacos://${NACOS_SERVER_ADDR:127.0.0.1:8848} + +# ================== MyBatis-Plus ================== +mybatis-plus: + mapper-locations: classpath:mapper/**/*.xml + type-aliases-package: org.xyzh.common.dto, org.xyzh.api + +# ================== SpringDoc 基础配置 ================== +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + +# ================== Logging ================== +logging: + config: classpath:log4j2.xml + charset: + console: UTF-8 + file: UTF-8 diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java index 1890b2ac..00c6a79e 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java @@ -62,7 +62,15 @@ public class WorkcaseController { if (!vr.isValid()) { return ResultDomain.failure(vr.getAllErrors()); } - return workcaseService.createWorkcase(workcase); + try{ + workcaseService.createWorkcase(workcase); + return ResultDomain.success("创建工单成功", workcase); + } catch (Exception e) { + if(e.getMessage().contains("tb_workcase_room_id_key")){ + return ResultDomain.failure("您已有未完成的工单,请勿重复提交"); + } + return ResultDomain.failure("创建工单失败: " + e.getMessage()); + } } @Operation(summary = "更新工单") diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java index ccb9b985..3c0e2312 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java @@ -20,6 +20,7 @@ import org.apache.hc.core5.http.io.entity.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; import org.xyzh.api.file.dto.TbSysFileDTO; import org.xyzh.api.workcase.dto.TbWorkcaseDTO; import org.xyzh.api.workcase.dto.TbWorkcaseDeviceDTO; @@ -76,6 +77,7 @@ public class WorkcaseServiceImpl implements WorkcaseService { // ====================== 工单管理 ====================== @Override + @Transactional public ResultDomain createWorkcase(TbWorkcaseDTO workcase) { logger.info("创建工单: userId={}, type={}, roomId={}", workcase.getUserId(), workcase.getType(), workcase.getRoomId()); diff --git a/urbanLifelineServ/workcase/src/main/resources/bootstrap.yml b/urbanLifelineServ/workcase/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..60998f2b --- /dev/null +++ b/urbanLifelineServ/workcase/src/main/resources/bootstrap.yml @@ -0,0 +1,64 @@ +# ================================================ +# Urban Lifeline - 通用 Bootstrap 配置 +# 所有微服务共享的基础配置 +# ================================================ + +# ================== Spring Cloud Nacos ================== +spring: + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + namespace: ${NACOS_NAMESPACE:dev} + group: ${NACOS_GROUP:DEFAULT_GROUP} + + # ================== DataSource ================== + datasource: + url: ${DB_URL:jdbc:postgresql://127.0.0.1:5432/urban_lifeline} + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:postgres} + driver-class-name: org.postgresql.Driver + + # ================== Redis ================== + data: + redis: + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + database: ${REDIS_DATABASE:0} + password: ${REDIS_PASSWORD:123456} + +# ================== Security AES ================== +security: + aes: + # AES-256 密钥(Base64编码,必须与所有服务保持一致) + # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 + secret-key: ${AES_SECRET_KEY:MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=} + +# ================== Dubbo ================== +dubbo: + protocol: + name: dubbo + port: -1 + registry: + address: nacos://${NACOS_SERVER_ADDR:127.0.0.1:8848} + +# ================== MyBatis-Plus ================== +mybatis-plus: + mapper-locations: classpath:mapper/**/*.xml + type-aliases-package: org.xyzh.common.dto, org.xyzh.api + +# ================== SpringDoc 基础配置 ================== +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + +# ================== Logging ================== +logging: + config: classpath:log4j2.xml + charset: + console: UTF-8 + file: UTF-8 diff --git a/urbanLifelineWeb/package-lock.json b/urbanLifelineWeb/package-lock.json index 344e4a22..902036f8 100644 --- a/urbanLifelineWeb/package-lock.json +++ b/urbanLifelineWeb/package-lock.json @@ -1847,12 +1847,6 @@ "resolved": "packages/workcase", "link": true }, - "node_modules/@vant/weapp": { - "version": "1.11.7", - "resolved": "https://registry.npmmirror.com/@vant/weapp/-/weapp-1.11.7.tgz", - "integrity": "sha512-Rwn9BBnb4kHSV4XmvBicwtd42J+amEUfnFDcXJsGNPNX4a9c/DoT6YLsm4X1wB2+sQbdiQsbFBLAvGRBxCkD8g==", - "license": "MIT" - }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.4", "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", @@ -5038,10 +5032,6 @@ "node": ">=16.0.0" } }, - "node_modules/taihao-service-miniprogram": { - "resolved": "packages/wechat_demo", - "link": true - }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -5509,12 +5499,14 @@ "@vueuse/core": "^11.3.0", "axios": "^1.7.9", "element-plus": "^2.12.0", + "lucide-vue-next": "^0.561.0", "pinia": "^2.2.8", "vue": "^3.5.13", "vue-router": "^4.5.0" }, "devDependencies": { - "@types/node": "^22.0.0", + "@module-federation/vite": "^1.9.3", + "@types/node": "^20.10.0", "@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue-jsx": "^4.1.1", "typescript": "^5.7.2", @@ -5522,6 +5514,16 @@ "vue-tsc": "^2.2.0" } }, + "packages/bidding/node_modules/@types/node": { + "version": "20.19.30", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.30.tgz", + "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "packages/platform": { "name": "@urbanlifeline/platform", "version": "1.0.0", @@ -5551,6 +5553,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.2", "@stomp/stompjs": "^7.2.1", + "axios": "^1.7.0", "cors": "^2.8.5", "element-plus": "^2.12.0", "express": "^4.18.2", @@ -7031,6 +7034,7 @@ "packages/wechat_demo": { "name": "taihao-service-miniprogram", "version": "1.0.0", + "extraneous": true, "dependencies": { "@vant/weapp": "^1.11.7" } diff --git a/urbanLifelineWeb/packages/shared/src/api/sys/guest.ts b/urbanLifelineWeb/packages/shared/src/api/sys/guest.ts index 7898a6f3..756fe422 100644 --- a/urbanLifelineWeb/packages/shared/src/api/sys/guest.ts +++ b/urbanLifelineWeb/packages/shared/src/api/sys/guest.ts @@ -47,7 +47,7 @@ export const guestAPI = { * 获取来客列表 */ async listGuest(filter?: TbGuestDTO): Promise> { - const response = await api.get(`${this.baseUrl}/list`, { params: filter }) + const response = await api.post(`${this.baseUrl}/list`, { params: filter }) return response.data }, diff --git a/urbanLifelineWeb/packages/shared/vite.config.ts b/urbanLifelineWeb/packages/shared/vite.config.ts index c1b48b9e..a3b16a7d 100644 --- a/urbanLifelineWeb/packages/shared/vite.config.ts +++ b/urbanLifelineWeb/packages/shared/vite.config.ts @@ -50,6 +50,7 @@ export default defineConfig({ './api/auth': './src/api/auth/auth.ts', './api/file': './src/api/file/file.ts', './api/ai': './src/api/ai/index.ts', + './api/sys/guest': './src/api/sys/guest.ts', // ========== Utils 工具模块 ========== './utils': './src/utils/index.ts', diff --git a/urbanLifelineWeb/packages/workcase/src/api/index.ts b/urbanLifelineWeb/packages/workcase/src/api/index.ts index 3466478b..43218e86 100644 --- a/urbanLifelineWeb/packages/workcase/src/api/index.ts +++ b/urbanLifelineWeb/packages/workcase/src/api/index.ts @@ -1 +1,5 @@ -export * from './workcase' \ No newline at end of file +export * from './workcase' + +// 从shared导入系统和聊天相关API +export { guestAPI as systemAPI } from 'shared/api/sys/guest' +export { workcaseChatAPI as chatAPI } from './workcase' \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/src/types/shared.d.ts b/urbanLifelineWeb/packages/workcase/src/types/shared.d.ts index 0e142e0b..924020b0 100644 --- a/urbanLifelineWeb/packages/workcase/src/types/shared.d.ts +++ b/urbanLifelineWeb/packages/workcase/src/types/shared.d.ts @@ -77,6 +77,10 @@ declare module 'shared/api/ai' { export const aiChatAPI: any } +declare module 'shared/api/sys/guest' { + export const guestAPI: any +} + // ============ types模块 ================== declare module 'shared/types' { // 基础类型 @@ -117,7 +121,7 @@ declare module 'shared/types' { export type { LoginParam, LoginDomain } from '../../../shared/src/types/auth' // 重新导出 sys - export type { SysUserVO, SysConfigVO, TbSysViewDTO } from '../../../shared/src/types/sys' + export type { SysUserVO, SysConfigVO, TbSysViewDTO, TbGuestDTO } from '../../../shared/src/types/sys' // 重新导出 file export type { TbSysFileDTO } from '../../../shared/src/types/file' diff --git a/urbanLifelineWeb/packages/workcase/src/views/admin/workcase/WorkcaseView.vue b/urbanLifelineWeb/packages/workcase/src/views/admin/workcase/WorkcaseView.vue index 285b5184..bf0e4f1e 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/admin/workcase/WorkcaseView.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/admin/workcase/WorkcaseView.vue @@ -1,11 +1,11 @@
@@ -97,18 +97,42 @@ - - - - - - - - - - - - + + + + + + + + + + + + @@ -131,6 +155,13 @@ + + + + + + + @@ -172,15 +203,16 @@ \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.scss b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.scss index 6e41a812..d1bbd414 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.scss +++ b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.scss @@ -7,7 +7,8 @@ position: relative; // 多种安全区域适配方式 padding-top: env(safe-area-inset-top); - padding-top: constant(safe-area-inset-top); /* 兼容iOS < 11.2 */ + padding-top: constant(safe-area-inset-top); + /* 兼容iOS < 11.2 */ box-sizing: border-box; } @@ -18,12 +19,12 @@ left: 0; right: 0; display: flex; - flex-direction: row; + flex-direction: row; align-items: center; padding: 0 16px; z-index: 100; box-sizing: border-box; - + // 小程序需要为右侧胶囊按钮留出空间 /* #ifdef MP-WEIXIN */ padding-right: 100px; @@ -83,7 +84,7 @@ // 退出按钮特殊样式 .logout-btn { background: rgba(255, 59, 48, 0.1); - + .btn-text { color: #ff3b30; } @@ -117,10 +118,25 @@ border: none !important; } -.r1 { width: 260px; height: 260px; } -.r2 { width: 200px; height: 200px; } -.r3 { width: 150px; height: 150px; } -.r4 { width: 110px; height: 110px; } +.r1 { + width: 260px; + height: 260px; +} + +.r2 { + width: 200px; + height: 200px; +} + +.r3 { + width: 150px; + height: 150px; +} + +.r4 { + width: 110px; + height: 110px; +} .robot { position: relative; @@ -128,10 +144,10 @@ width: 140px; height: 140px; /* 父容器加一层径向渐变背景,模拟外层模糊光晕 */ - background: radial-gradient(circle at center, - rgba(180, 220, 255, 0.5) 0%, - rgba(180, 220, 255, 0.25) 50%, - transparent 75%); + background: radial-gradient(circle at center, + rgba(180, 220, 255, 0.5) 0%, + rgba(180, 220, 255, 0.25) 50%, + transparent 75%); border-radius: 50%; display: flex; align-items: center; @@ -164,16 +180,30 @@ .float-tag { position: absolute; padding: 6px 12px; - background: transparent; /* 去掉背景色,和左侧一致 */ - border: none; /* 去掉边框 */ - border-radius: 0; /* 保持直角(如果需要圆角也可以改回16px) */ + background: transparent; + /* 去掉背景色,和左侧一致 */ + border: none; + /* 去掉边框 */ + border-radius: 0; + /* 保持直角(如果需要圆角也可以改回16px) */ font-size: 12px; color: #666; } -.t1 { right: 20px; top: 40px; } -.t2 { left: 20px; top: 80px; } -.t3 { right: 30px; bottom: 50px; } +.t1 { + right: 20px; + top: 40px; +} + +.t2 { + left: 20px; + top: 80px; +} + +.t3 { + right: 30px; + bottom: 50px; +} .greeting { text-align: left; @@ -199,7 +229,7 @@ background: #fff; padding: 12px 16px; border-radius: 12px; - margin: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); } @@ -373,63 +403,86 @@ padding-left: 48px; } -// 底部操作区域 +// 底部操作区域(如果没有定义,需要添加) .bottom-area { - position: fixed; - bottom: 0; - left: 0; - right: 0; - // background: rgba(240, 241, 246, 0.95); - padding: 12px 16px; - padding-bottom: calc(12px + env(safe-area-inset-bottom)); - z-index: 50; + position: fixed; + bottom: 0; + left: 0; + right: 0; + padding: 12px 16px; + padding-bottom: calc(12px + env(safe-area-inset-bottom)); + z-index: 50; + background-color: #fff; // 增加背景色,避免穿透 } - -// 快捷按钮横向滚动 +// 快捷按钮横向滚动 - 修复横向滚动问题 .quick-scroll { - white-space: nowrap; - margin-bottom: 12px; + width: 100%; + margin-bottom: 12px; + /* 核心:必须设置固定高度,否则scroll-view可能无法正常工作 */ + height: 50px; + /* 确保scroll-view能正确处理滚动 */ + overflow-x: scroll; + display: flex; + flex-direction: row; + -webkit-overflow-scrolling: touch; + /* 隐藏滚动条但保留滚动功能 */ + scrollbar-width: none; + -ms-overflow-style: none; +} +.quick-inner { + display: flex; + flex-direction: row; + align-items: center; /* ✅ 垂直居中 */ + padding: 0 16px; + height: 100%; +} +/* 隐藏滚动条 */ +.quick-scroll::-webkit-scrollbar { + display: none; } .quick-list { - display: inline-flex; - flex-direction: row; - align-items: center; - gap: 8px; + display: inline-flex; /* 使用inline-flex确保宽度随内容增长,触发横向滚动 */ + flex-direction: row; + align-items: center; + gap: 8px; + padding: 0 16px; + /* 关键:让容器宽度自动适应内容,超出父容器时触发滚动 */ + width: auto; + /* 确保垂直居中 */ + height: 100%; } .quick-btn { - margin: 0; - position: relative; - box-sizing: border-box; - flex-shrink: 0; - flex-grow: 0; - flex-basis: auto; - align-content: stretch; - min-height: 0px; - min-width: 0px; - overflow: hidden; - align-items: center; - justify-content: center; - background: #fff; - border-radius: 24px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); - border: none; - display: flex; - flex-direction: row; - padding: 10px 24px; - color: black; + /* 保持原有样式 */ + margin: 0; + position: relative; + box-sizing: border-box; + background: #fff; + border-radius: 24px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); + border: none; + padding: 10px 24px; + color: black; + /* 确保按钮不换行 */ + white-space: nowrap; + /* 关键:防止flex子项被压缩,确保产生横向溢出以便滚动 */ + flex-shrink: 0; + /* 按钮内部使用flex布局 */ + display: flex; + align-items: center; + justify-content: center; + flex-direction: row; + /* 确保按钮高度合适 */ + height: 36px; } .quick-btn.has-icon { - // background: linear-gradient(90deg, #173294 0%, #4a6fd9 100%); - border: none; - padding: 10px 24px; + /* 保持原有样式 */ } .quick-btn.has-icon .quick-text { - // color: #fff; - font-weight: 500; + /* 保持原有样式 */ } .quick-icon { @@ -443,6 +496,7 @@ height: 20px; background: #d0d5dd; margin: 0 4px; + flex-shrink: 0; } .quick-text { @@ -696,10 +750,14 @@ } @keyframes typing-bounce { - 0%, 80%, 100% { + + 0%, + 80%, + 100% { transform: scale(0.6); opacity: 0.5; } + 40% { transform: scale(1); opacity: 1; @@ -953,3 +1011,77 @@ font-size: 14px; color: #666; } + +// 操作选择弹窗样式 +.operation-select-modal { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; +} + +.modal-mask { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); +} + +.modal-content { + position: relative; + width: 80%; + max-width: 400px; + background: white; + border-radius: 16px; + padding: 20px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2); +} + +.modal-header { + text-align: center; + margin-bottom: 20px; +} + +.modal-title { + font-size: 18px; + font-weight: 600; + color: #333; +} + +.operation-select-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.operation-select-item { + display: flex; + align-items: center; + padding: 16px; + background: #f5f7fa; + border-radius: 12px; + cursor: pointer; + transition: all 0.3s ease; +} + +.operation-select-item:active { + background: #e4e7ed; + transform: scale(0.98); +} + +.select-icon { + font-size: 24px; + margin-right: 12px; +} + +.select-text { + font-size: 16px; + color: #333; +} \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue index 4a125390..7338f6f2 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue +++ b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue @@ -7,13 +7,13 @@ -