diff --git a/src/main/java/com/budwk/app/sys/controller/SysConfController.java b/src/main/java/com/budwk/app/sys/controller/SysConfController.java index 0484ec3..efe39a4 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysConfController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysConfController.java @@ -9,6 +9,8 @@ import com.budwk.app.sys.models.Sys_config; import com.budwk.app.sys.services.SysConfigService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; import org.nutz.integration.jedis.pubsub.PubSubService; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -32,6 +34,8 @@ public class SysConfController { private SysConfigService sysConfigService; @Inject private PubSubService pubSubService; + @Inject + private Dao dao; @At("") @Ok("beetl:/platform/sys/conf/index.html") @@ -40,6 +44,24 @@ public class SysConfController { } + /** + * 自动补齐首页图片配置项,保证新版移动端页面配置入口可直接维护。 + * + * @param configKey 配置键。 + * @param note 配置说明。 + */ + private void ensureAppImageConfig(String configKey, String note) { + if (sysConfigService.fetch(configKey) != null) { + return; + } + Sys_config conf = new Sys_config(); + conf.setConfigKey(configKey); + conf.setConfigValue(""); + conf.setNote(note); + conf.setCreatedBy(SecurityUtil.getUserId()); + sysConfigService.insert(conf); + } + @At @Ok("json") @SaCheckPermission("sys.manager.conf.add") @@ -73,13 +95,38 @@ public class SysConfController { @SLog(tag = "修改参数", msg = "${conf.configKey}:${conf.configValue}") public Object editDo(@Param("..") Sys_config conf) { try { + // 首页图片可能保存多个文件地址,更新前确保 MySQL 字段容量足够。 + ensureConfigValueColumn(conf); conf.setUpdatedBy(SecurityUtil.getUserId()); if (sysConfigService.updateIgnoreNull(conf) > 0) { pubSubService.fire(RedisConstant.PLATFORM_REDIS_PREFIX + "web:platform", "sys_config"); } return Result.success(); } catch (Exception e) { - return Result.error(); + log.error("Update sys config failed: " + (conf == null ? "" : conf.getConfigKey()), e); + return Result.error("save failed: " + e.getMessage()); + } + } + + /** + * 图片配置保存多个 URL 时会超过原有短文本长度,MySQL 环境下自动扩容配置值字段。 + * + * @param conf 当前保存的系统配置。 + */ + private void ensureConfigValueColumn(Sys_config conf) { + if (conf == null || (!"AppHomeImg".equals(conf.getConfigKey()) + && !"H5AppHomeImg".equals(conf.getConfigKey()) + && !"AppFeaturedActivityImg".equals(conf.getConfigKey()) + && !"AppFestivalBenefitImg".equals(conf.getConfigKey()))) { + return; + } + String configValue = Strings.sNull(conf.getConfigValue()); + if (configValue.length() <= 100) { + return; + } + String dbType = Strings.sNull(dao.getJdbcExpert().getDatabaseType()).toLowerCase(); + if (dbType.contains("mysql")) { + dao.execute(Sqls.create("ALTER TABLE `sys_config` MODIFY COLUMN `configValue` TEXT")); } } @@ -106,6 +153,11 @@ public class SysConfController { @SaCheckPermission("sys.manager.conf") public Object data(@Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize, @Param("pageOrderName") String pageOrderName, @Param("pageOrderBy") String pageOrderBy) { try { + // 新版首页使用多图配置,进入配置列表时自动创建缺失配置项。 + ensureAppImageConfig("AppHomeImg", "PC首页轮播图"); + ensureAppImageConfig("H5AppHomeImg", "移动端首页轮播图"); + ensureAppImageConfig("AppFeaturedActivityImg", "精彩活动页顶部图片"); + ensureAppImageConfig("AppFestivalBenefitImg", "节日福利页顶部图片"); Cnd cnd = Cnd.NEW(); if (Strings.isNotBlank(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { cnd.orderBy(pageOrderName, PageUtil.getOrder(pageOrderBy)); diff --git a/src/main/java/com/budwk/app/sys/controller/SysH5IndexController.java b/src/main/java/com/budwk/app/sys/controller/SysH5IndexController.java index 4cae5a1..29b1a39 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysH5IndexController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysH5IndexController.java @@ -6,7 +6,7 @@ import cn.hutool.core.util.StrUtil; import com.budwk.app.base.result.Result; import com.budwk.app.sys.models.Sys_home_activity; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import io.swagger.annotations.Api; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -32,7 +32,12 @@ public class SysH5IndexController { @Inject private Dao dao; + @Inject + private ActivityBasicScopeService activityBasicScopeService; + /** + * 移动端首页主页面。 + */ @At @Ok("beetl:/platform/zhghh5/sys/home/index.html") @SaCheckLogin @@ -40,6 +45,29 @@ public class SysH5IndexController { } + /** + * 移动端精彩活动专题页。 + */ + @At + @Ok("beetl:/platform/zhghh5/sys/home/featuredActivity.html") + @SaCheckLogin + public void featuredActivity() { + + } + + /** + * 移动端节日福利专题页。 + */ + @At + @Ok("beetl:/platform/zhghh5/sys/home/festivalBenefit.html") + @SaCheckLogin + public void festivalBenefit() { + + } + + /** + * 移动端个人中心页面。 + */ @At @Ok("beetl:/platform/zhghh5/index/mine/index.html") @SaCheckLogin @@ -47,6 +75,9 @@ public class SysH5IndexController { } + /** + * 移动端消息页面。 + */ @At @Ok("beetl:/platform/zhghh5/index/msg/index.html") @SaCheckLogin @@ -54,6 +85,9 @@ public class SysH5IndexController { } + /** + * 移动端工作台页面。 + */ @At @Ok("beetl:/platform/zhghh5/index/work/index.html") @SaCheckLogin @@ -61,6 +95,11 @@ public class SysH5IndexController { } + /** + * 查询当前用户可见的移动端首页活动。 + * + * @return 当前登录用户有权限访问且处于有效期内的首页活动列表。 + */ @At @SaCheckLogin @Ok("json") @@ -88,16 +127,19 @@ public class SysH5IndexController { } if (allowUserGroupId != null) { - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", allowUserGroupId).and("userId", "=", userId)); - if (count > 0) { + // 用户组范围判断统一交给活动基础服务处理,保持与其他活动功能的成员范围逻辑一致。 + if (activityBasicScopeService.isUserInGroup(allowUserGroupId, userId)) { allowActivityList.add(activity); continue; } } if (StrUtil.isNotBlank(allowUserSql)){ + // 自定义 SQL 范围仅返回 userId 时视为匹配,执行后清理敏感 SQL 字段避免前端暴露。 Sql sql = Sqls.create(allowUserSql).setParam("userId", userId); - NutMap nutMap = (NutMap) Daos.query(dao, sql.toString(), Sqls.callback.map()); + sql.setCallback(Sqls.callback.map()); + dao.execute(sql); + NutMap nutMap = (NutMap) sql.getResult(); if (Lang.isNotEmpty(nutMap) && StrUtil.isNotBlank(nutMap.getString("userId"))) { allowActivityList.add(activity); } diff --git a/src/main/java/com/budwk/app/sys/controller/SysUserController.java b/src/main/java/com/budwk/app/sys/controller/SysUserController.java index 2f6fd91..237bd78 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysUserController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysUserController.java @@ -330,16 +330,21 @@ public class SysUserController { } /** - * 获取子应用菜单 + * 获取子应用菜单。 * - * @param appId - * @return + * @param appId 子应用菜单 ID。 + * @param platform 菜单所属端类型,传入 H5 时仅返回移动端菜单,不传时保持原有全量菜单逻辑。 + * @return 当前用户在指定子应用下有权限访问的菜单树。 */ @At @Ok("json") @SaCheckLogin - public Result subAppMenus(@Param("appId") String appId) { + public Result subAppMenus(@Param("appId") String appId, @Param("platform") String platform) { List menus = sysUserService.getMenus(SecurityUtil.getUserId()); + // 新版移动端应用页按平台展示功能菜单,避免 PC 菜单混入 H5 分类。 + if (StrUtil.isNotBlank(platform)) { + menus = menus.stream().filter(menu -> platform.equals(menu.getPlatform())).toList(); + } List list = SysMenuUtil.createTreeMenus(menus, appId); if (ObjectUtil.isEmpty(list)) { List self = menus.stream().filter(menu -> menu.getId().equals(appId)).toList(); diff --git a/src/main/java/com/budwk/app/web/controllers/open/commons/CommonController.java b/src/main/java/com/budwk/app/web/controllers/open/commons/CommonController.java index b554e7e..2542eab 100644 --- a/src/main/java/com/budwk/app/web/controllers/open/commons/CommonController.java +++ b/src/main/java/com/budwk/app/web/controllers/open/commons/CommonController.java @@ -148,7 +148,8 @@ public class CommonController { @ApiOperation("系统配置") public Result getConfigKey(String key) { Sys_config configKey = sysDictService.dao().fetch(Sys_config.class, Cnd.where("configKey", "=", key)); - return Result.success().addData(configKey.getConfigValue()); + // 新版移动端首页会读取可选图片配置,配置未初始化时返回空值让前端使用默认图兜底。 + return Result.success().addData(configKey == null ? "" : configKey.getConfigValue()); } @At diff --git a/src/main/resources/views/platform/sys/conf/index.html b/src/main/resources/views/platform/sys/conf/index.html index 920b306..29c8556 100644 --- a/src/main/resources/views/platform/sys/conf/index.html +++ b/src/main/resources/views/platform/sys/conf/index.html @@ -75,8 +75,9 @@ layout("/layouts/platform.html"){ > -