记得上下班打卡 | git大法好,push需谨慎

Commit 5e155683 authored by wangyifan's avatar wangyifan

草莓护照V1.1-admin后台增加新类型

parent f8932630
-- ============================================================
-- 草莓护照 / 徽章 v1.1 数据库变更
-- 说明:新增徽章类型「签证页」(type=4),仅更新字段注释,无结构变更
-- 适用:已在 v1.0 建表的环境(adam_caomei_badge)
-- 日期:2026-05-13
-- ============================================================
-- 1. 徽章类型:补充 4-签证页
ALTER TABLE `adam_caomei_badge`
MODIFY COLUMN `type` tinyint(4) NOT NULL COMMENT '徽章类型: 1-护照纪念徽章, 2-演出纪念徽章, 3-特殊徽章, 4-签证页';
-- 2. 关联演出:签证页同样需绑定音乐节/演出
ALTER TABLE `adam_caomei_badge`
MODIFY COLUMN `performance_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '关联演出ID (演出纪念徽章、签证页必填,其他类型为空)';
...@@ -26,10 +26,10 @@ public class AdamCaomeiBadgeParam { ...@@ -26,10 +26,10 @@ public class AdamCaomeiBadgeParam {
@ApiModelProperty(value = "徽章图标 (Emoji字符或图片URL)") @ApiModelProperty(value = "徽章图标 (Emoji字符或图片URL)")
private String icon; private String icon;
@ApiModelProperty(value = "徽章类型: 1-护照纪念徽章, 2-演出纪念徽章, 3-特殊徽章") @ApiModelProperty(value = "徽章类型: 1-护照纪念徽章, 2-演出纪念徽章, 3-特殊徽章, 4-签证页")
private Integer type; private Integer type;
@ApiModelProperty(value = "关联演出ID (仅演出纪念徽章必填,其他类型为空)") @ApiModelProperty(value = "关联演出ID (演出纪念徽章、签证页必填,其他类型为空)")
private String performanceId; private String performanceId;
@ApiModelProperty(value = "上架状态: 0-下架(默认), 1-已发布") @ApiModelProperty(value = "上架状态: 0-下架(默认), 1-已发布")
......
...@@ -14,7 +14,7 @@ public class AdamCaomeiBadgeSearchParam { ...@@ -14,7 +14,7 @@ public class AdamCaomeiBadgeSearchParam {
@ApiModelProperty(value = "徽章名称") @ApiModelProperty(value = "徽章名称")
private String name; private String name;
@ApiModelProperty(value = "徽章类型: 1-护照纪念徽章, 2-演出纪念徽章, 3-特殊徽章") @ApiModelProperty(value = "徽章类型: 1-护照纪念徽章, 2-演出纪念徽章, 3-特殊徽章, 4-签证页")
private Integer type; private Integer type;
@ApiModelProperty(value = "上架状态: 0-下架(默认), 1-已发布") @ApiModelProperty(value = "上架状态: 0-下架(默认), 1-已发布")
......
...@@ -28,7 +28,7 @@ public class AdamCaomeiBadgeVo { ...@@ -28,7 +28,7 @@ public class AdamCaomeiBadgeVo {
@ApiModelProperty(value = "徽章图标 (Emoji字符或图片URL)") @ApiModelProperty(value = "徽章图标 (Emoji字符或图片URL)")
private String icon; private String icon;
@ApiModelProperty(value = "徽章类型: 1-护照纪念徽章, 2-演出纪念徽章, 3-特殊徽章") @ApiModelProperty(value = "徽章类型: 1-护照纪念徽章, 2-演出纪念徽章, 3-特殊徽章, 4-签证页")
private Integer type; private Integer type;
@ApiModelProperty(value = "关联演出ID") @ApiModelProperty(value = "关联演出ID")
......
...@@ -30,7 +30,7 @@ public class AdamCaomeiPassportBadgeShelfItemVo { ...@@ -30,7 +30,7 @@ public class AdamCaomeiPassportBadgeShelfItemVo {
@ApiModelProperty("类型 1护照 2演出 3特殊") @ApiModelProperty("类型 1护照 2演出 3特殊")
private Integer type; private Integer type;
@ApiModelProperty("关联演出ID(演出纪念徽章)") @ApiModelProperty("关联演出ID(演出纪念徽章、签证页)")
private String performanceId; private String performanceId;
@ApiModelProperty("关联演出名称(type=2 时用于按演出分组展示;无数据时可能为演出ID)") @ApiModelProperty("关联演出名称(type=2 时用于按演出分组展示;无数据时可能为演出ID)")
......
...@@ -27,7 +27,7 @@ public class AdamCaomeiPassportUserClaimedBadgeVo { ...@@ -27,7 +27,7 @@ public class AdamCaomeiPassportUserClaimedBadgeVo {
@ApiModelProperty("分享文案") @ApiModelProperty("分享文案")
private String shareText; private String shareText;
@ApiModelProperty("类型 1护照类型徽章 2演出类型徽章 3特殊徽章") @ApiModelProperty("类型 1护照类型徽章 2演出类型徽章 3特殊徽章 4签证页")
private Integer type; private Integer type;
@ApiModelProperty("关联演出名称(仅 type=2 有值)") @ApiModelProperty("关联演出名称(仅 type=2 有值)")
......
...@@ -94,11 +94,11 @@ public class AdamCaomeiBadgeController extends BaseController { ...@@ -94,11 +94,11 @@ public class AdamCaomeiBadgeController extends BaseController {
badge.setCreatedAt(new Date()); badge.setCreatedAt(new Date());
badge.setUpdatedAt(new Date()); badge.setUpdatedAt(new Date());
// 演出类型校验 // 演出纪念徽章、签证页须关联音乐节
if (badge.getType() != null && badge.getType() == 2) { if (badgeRequiresPerformance(badge.getType())) {
String pid = StringUtils.trimToEmpty(badge.getPerformanceId()); String pid = StringUtils.trimToEmpty(badge.getPerformanceId());
if (StringUtils.isBlank(pid)) { if (StringUtils.isBlank(pid)) {
return error("演出纪念徽章必须关联演出"); return error(badgePerformanceRequiredMessage(badge.getType()));
} }
badge.setPerformanceId(pid); badge.setPerformanceId(pid);
if (!adamCaomeiBadgeAdminService.kylinPerformanceExists(pid)) { if (!adamCaomeiBadgeAdminService.kylinPerformanceExists(pid)) {
...@@ -184,10 +184,10 @@ public class AdamCaomeiBadgeController extends BaseController { ...@@ -184,10 +184,10 @@ public class AdamCaomeiBadgeController extends BaseController {
badge.setUpdatedAt(new java.util.Date()); badge.setUpdatedAt(new java.util.Date());
// 徽章类型与「已发布不可改」一致:编辑时不允许变更类型 // 徽章类型与「已发布不可改」一致:编辑时不允许变更类型
badge.setType(oldBadge.getType()); badge.setType(oldBadge.getType());
if (badge.getType() != null && badge.getType() == 2) { if (badgeRequiresPerformance(badge.getType())) {
String pid = StringUtils.trimToEmpty(badge.getPerformanceId()); String pid = StringUtils.trimToEmpty(badge.getPerformanceId());
if (StringUtils.isBlank(pid)) { if (StringUtils.isBlank(pid)) {
return error("演出纪念徽章必须关联演出"); return error(badgePerformanceRequiredMessage(badge.getType()));
} }
badge.setPerformanceId(pid); badge.setPerformanceId(pid);
if (!adamCaomeiBadgeAdminService.kylinPerformanceExists(pid)) { if (!adamCaomeiBadgeAdminService.kylinPerformanceExists(pid)) {
...@@ -217,6 +217,17 @@ public class AdamCaomeiBadgeController extends BaseController { ...@@ -217,6 +217,17 @@ public class AdamCaomeiBadgeController extends BaseController {
return toAjax(adamCaomeiBadgeAdminService.updateById(updateBadge)); return toAjax(adamCaomeiBadgeAdminService.updateById(updateBadge));
} }
private static boolean badgeRequiresPerformance(Integer type) {
return type != null && (type == 2 || type == 4);
}
private static String badgePerformanceRequiredMessage(Integer type) {
if (type != null && type == 4) {
return "签证页必须关联音乐节";
}
return "演出纪念徽章必须关联演出";
}
/** /**
* @return 校验通过返回 null,否则返回错误 AjaxResult * @return 校验通过返回 null,否则返回错误 AjaxResult
*/ */
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
<option value="">请选择</option> <option value="">请选择</option>
<option value="1">护照纪念徽章</option> <option value="1">护照纪念徽章</option>
<option value="2">演出纪念徽章</option> <option value="2">演出纪念徽章</option>
<option value="4">签证页</option>
<!-- <option value="3">特殊徽章</option> --> <!-- <option value="3">特殊徽章</option> -->
</select> </select>
</div> </div>
...@@ -59,7 +60,7 @@ ...@@ -59,7 +60,7 @@
<label class="col-sm-3 control-label is-required">关联演出:</label> <label class="col-sm-3 control-label is-required">关联演出:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input name="performanceId" id="performanceId" class="form-control" type="text" placeholder="请输入演出ID"> <input name="performanceId" id="performanceId" class="form-control" type="text" placeholder="请输入演出ID">
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 演出纪念徽章必填</span> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 演出纪念徽章、签证页必填</span>
</div> </div>
</div> </div>
</form> </form>
...@@ -71,7 +72,7 @@ ...@@ -71,7 +72,7 @@
var platformUrl = /*[[${platformUrl}]]*/ ''; var platformUrl = /*[[${platformUrl}]]*/ '';
function typeChange(val) { function typeChange(val) {
if (val == 2) { if (val == 2 || val == 4) {
$("#ticketTimesDiv").show(); $("#ticketTimesDiv").show();
$("#performanceId").prop("required", true); $("#performanceId").prop("required", true);
} else { } else {
......
...@@ -32,10 +32,11 @@ ...@@ -32,10 +32,11 @@
<div class="col-sm-8"> <div class="col-sm-8">
<div class="form-control-static" th:if="*{type == 1}">护照纪念徽章</div> <div class="form-control-static" th:if="*{type == 1}">护照纪念徽章</div>
<div class="form-control-static" th:if="*{type == 2}">演出纪念徽章</div> <div class="form-control-static" th:if="*{type == 2}">演出纪念徽章</div>
<div class="form-control-static" th:if="*{type == 3}">特殊徽章</div> <div class="form-control-static" th:if="*{type == 4}">签证页</div>
<!-- <div class="form-control-static" th:if="*{type == 3}">特殊徽章</div>-->
</div> </div>
</div> </div>
<div class="form-group" th:style="${badge.type == 2 ? 'display:block;' : 'display:none;'}"> <div class="form-group" th:style="${badge.type == 2 or badge.type == 4 ? 'display:block;' : 'display:none;'}">
<label class="col-sm-3 control-label">关联演出:</label> <label class="col-sm-3 control-label">关联演出:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="form-control-static" th:text="*{performanceId}"></div> <div class="form-control-static" th:text="*{performanceId}"></div>
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
<select class="form-control m-b" disabled> <select class="form-control m-b" disabled>
<option th:selected="${badge.type == 1}" value="1">护照纪念徽章</option> <option th:selected="${badge.type == 1}" value="1">护照纪念徽章</option>
<option th:selected="${badge.type == 2}" value="2">演出纪念徽章</option> <option th:selected="${badge.type == 2}" value="2">演出纪念徽章</option>
<option th:selected="${badge.type == 4}" value="4">签证页</option>
</select> </select>
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 徽章类型保存后不可修改</span> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 徽章类型保存后不可修改</span>
</div> </div>
...@@ -63,11 +64,11 @@ ...@@ -63,11 +64,11 @@
<textarea name="shareText" th:field="*{shareText}" class="form-control" rows="3" maxlength="255" placeholder="请输入徽章分享文案"></textarea> <textarea name="shareText" th:field="*{shareText}" class="form-control" rows="3" maxlength="255" placeholder="请输入徽章分享文案"></textarea>
</div> </div>
</div> </div>
<div class="form-group" id="ticketTimesDiv" th:style="${badge.type == 2 ? 'display:block;' : 'display:none;'}"> <div class="form-group" id="ticketTimesDiv" th:style="${badge.type == 2 or badge.type == 4 ? 'display:block;' : 'display:none;'}">
<label class="col-sm-3 control-label is-required">关联演出:</label> <label class="col-sm-3 control-label is-required">关联演出:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input name="performanceId" id="performanceId" th:field="*{performanceId}" class="form-control" type="text" placeholder="请输入演出ID" th:required="${badge.type == 2}"> <input name="performanceId" id="performanceId" th:field="*{performanceId}" class="form-control" type="text" placeholder="请输入演出ID" th:required="${badge.type == 2 or badge.type == 4}">
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 演出纪念徽章必填</span> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 演出纪念徽章、签证页必填</span>
</div> </div>
</div> </div>
</form> </form>
...@@ -79,7 +80,7 @@ ...@@ -79,7 +80,7 @@
var platformUrl = /*[[${platformUrl}]]*/ ''; var platformUrl = /*[[${platformUrl}]]*/ '';
function typeChange(val) { function typeChange(val) {
if (val == 2 || val == '2') { if (val == 2 || val == '2' || val == 4 || val == '4') {
$("#ticketTimesDiv").show(); $("#ticketTimesDiv").show();
$("#performanceId").prop("required", true); $("#performanceId").prop("required", true);
} else { } else {
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
<option value="">所有</option> <option value="">所有</option>
<option value="1">护照纪念徽章</option> <option value="1">护照纪念徽章</option>
<option value="2">演出纪念徽章</option> <option value="2">演出纪念徽章</option>
<option value="4">签证页</option>
<!-- <option value="3">特殊徽章</option> --> <!-- <option value="3">特殊徽章</option> -->
</select> </select>
</li> </li>
...@@ -106,6 +107,7 @@ ...@@ -106,6 +107,7 @@
if (value == 1) return '<span class="badge badge-info">护照纪念</span>'; if (value == 1) return '<span class="badge badge-info">护照纪念</span>';
if (value == 2) return '<span class="badge badge-primary">演出纪念</span>'; if (value == 2) return '<span class="badge badge-primary">演出纪念</span>';
if (value == 3) return '<span class="badge badge-warning">特殊徽章</span>'; if (value == 3) return '<span class="badge badge-warning">特殊徽章</span>';
if (value == 4) return '<span class="badge badge-success">签证页</span>';
return value; return value;
} }
}, },
......
...@@ -44,12 +44,12 @@ public class AdamCaomeiBadge implements Serializable { ...@@ -44,12 +44,12 @@ public class AdamCaomeiBadge implements Serializable {
private String icon; private String icon;
/** /**
* 徽章类型: 1-护照纪念徽章, 2-演出纪念徽章, 3-特殊徽章 * 徽章类型: 1-护照纪念徽章, 2-演出纪念徽章, 3-特殊徽章, 4-签证页
*/ */
private Integer type; private Integer type;
/** /**
* 关联演出ID (仅演出纪念徽章必填,其他类型为空) * 关联演出ID (演出纪念徽章、签证页必填,其他类型为空)
*/ */
private String performanceId; private String performanceId;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment