Compare commits

...

3 Commits

Author SHA1 Message Date
5fe610120b fix getLanguage NPE 2025-12-22 10:52:45 +08:00
4f0d2a380b add PageIgnore 2025-12-22 10:32:36 +08:00
c463ac5443 upper base lang field to timi-java for multilingual 2025-12-22 10:32:25 +08:00
5 changed files with 79 additions and 91 deletions

View File

@ -356,7 +356,10 @@ public class TimiSpring {
public static Language.Enum getLanguage() { public static Language.Enum getLanguage() {
String name = getRequestArg("lang"); String name = getRequestArg("lang");
if (TimiJava.isEmpty(name)) { if (TimiJava.isEmpty(name)) {
List<Locale.LanguageRange> rangeList = Locale.LanguageRange.parse(getLanguageRaw()); name = getLanguageRaw();
}
if (TimiJava.isNotEmpty(name)) {
List<Locale.LanguageRange> rangeList = Locale.LanguageRange.parse(name);
for (Locale.LanguageRange item : rangeList) { for (Locale.LanguageRange item : rangeList) {
if (item.getRange().contains("-")) { if (item.getRange().contains("-")) {
name = item.getRange(); name = item.getRange();

View File

@ -0,0 +1,21 @@
package com.imyeyu.spring.annotation.table;
import com.imyeyu.spring.bean.Page;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 在 {@link com.imyeyu.spring.mapper.BaseMapper#page(Page)} 方法忽略查询该属性
* <br />
* {@link com.imyeyu.spring.service.AbstractEntityService#page(Page)} 同上
*
* @author 夜雨
* @since 2025-12-12 14:54
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface PageIgnore {
}

View File

@ -1,29 +1,23 @@
package com.imyeyu.spring.bean; package com.imyeyu.spring.bean;
import com.imyeyu.java.bean.Language;
import com.imyeyu.java.ref.Ref; import com.imyeyu.java.ref.Ref;
import com.imyeyu.spring.entity.UUIDEntity; import com.imyeyu.spring.annotation.table.AutoUUID;
import com.imyeyu.spring.annotation.table.Id;
import com.imyeyu.spring.entity.Creatable;
import com.imyeyu.spring.entity.IDEntity;
/** /**
* @author 夜雨 * @author 夜雨
* @since 2025-10-17 15:21 * @since 2025-10-17 15:21
*/ */
public class Multilingual extends UUIDEntity { public class Multilingual extends Language implements IDEntity<String>, Creatable {
protected String key; @Id
@AutoUUID
protected String id;
protected String zhCN; protected Long createdAt;
protected String zhTW;
protected String enUS;
protected String ruRU;
protected String koKR;
protected String jaJP;
protected String deDE;
/** /**
* 获取指定语言值 * 获取指定语言值
@ -31,7 +25,7 @@ public class Multilingual extends UUIDEntity {
* @param language 指定语言 * @param language 指定语言
* @return 值 * @return 值
*/ */
public String getValue(com.imyeyu.java.bean.Language language) { public String getValue(Language.Enum language) {
try { try {
return Ref.getFieldValue(this, language.toString().replace("_", ""), String.class); return Ref.getFieldValue(this, language.toString().replace("_", ""), String.class);
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
@ -39,67 +33,23 @@ public class Multilingual extends UUIDEntity {
} }
} }
public String getKey() { @Override
return key; public String getId() {
return id;
} }
public void setKey(String key) { @Override
this.key = key; public void setId(String id) {
this.id = id;
} }
public String getZhCN() { @Override
return zhCN; public Long getCreatedAt() {
return createdAt;
} }
public void setZhCN(String zhCN) { @Override
this.zhCN = zhCN; public void setCreatedAt(Long createdAt) {
} this.createdAt = createdAt;
public String getZhTW() {
return zhTW;
}
public void setZhTW(String zhTW) {
this.zhTW = zhTW;
}
public String getEnUS() {
return enUS;
}
public void setEnUS(String enUS) {
this.enUS = enUS;
}
public String getRuRU() {
return ruRU;
}
public void setRuRU(String ruRU) {
this.ruRU = ruRU;
}
public String getKoKR() {
return koKR;
}
public void setKoKR(String koKR) {
this.koKR = koKR;
}
public String getJaJP() {
return jaJP;
}
public void setJaJP(String jaJP) {
this.jaJP = jaJP;
}
public String getDeDE() {
return deDE;
}
public void setDeDE(String deDE) {
this.deDE = deDE;
} }
} }

View File

@ -61,7 +61,7 @@ public class Page<T> extends BasePage {
} }
public void addOrder(String field, BaseMapper.OrderType orderType) { public void addOrder(String field, BaseMapper.OrderType orderType) {
orderMap = TimiJava.firstNotNull(orderMap, new LinkedHashMap<>()); orderMap = TimiJava.defaultIfNull(orderMap, new LinkedHashMap<>());
orderMap.put(Text.camelCase2underscore(field), orderType); orderMap.put(Text.camelCase2underscore(field), orderType);
} }
} }

View File

@ -1,6 +1,7 @@
package com.imyeyu.spring.util; package com.imyeyu.spring.util;
import com.imyeyu.java.TimiJava; import com.imyeyu.java.TimiJava;
import com.imyeyu.java.bean.CallbackArgReturn;
import com.imyeyu.java.bean.timi.TimiCode; import com.imyeyu.java.bean.timi.TimiCode;
import com.imyeyu.java.bean.timi.TimiException; import com.imyeyu.java.bean.timi.TimiException;
import com.imyeyu.java.ref.Ref; import com.imyeyu.java.ref.Ref;
@ -8,6 +9,7 @@ import com.imyeyu.spring.annotation.table.AutoUUID;
import com.imyeyu.spring.annotation.table.Column; import com.imyeyu.spring.annotation.table.Column;
import com.imyeyu.spring.annotation.table.DeleteColumn; import com.imyeyu.spring.annotation.table.DeleteColumn;
import com.imyeyu.spring.annotation.table.Id; import com.imyeyu.spring.annotation.table.Id;
import com.imyeyu.spring.annotation.table.PageIgnore;
import com.imyeyu.spring.annotation.table.Table; import com.imyeyu.spring.annotation.table.Table;
import com.imyeyu.spring.annotation.table.Transient; import com.imyeyu.spring.annotation.table.Transient;
import com.imyeyu.spring.bean.Page; import com.imyeyu.spring.bean.Page;
@ -53,7 +55,7 @@ public class SQLProvider {
public String listByPage(ProviderContext context, @Param("page") Page<?> page) { public String listByPage(ProviderContext context, @Param("page") Page<?> page) {
EntityMeta meta = getEntityMeta(context); EntityMeta meta = getEntityMeta(context);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append("SELECT %s FROM `%s` WHERE 1 = 1".formatted(meta.selectAllClause, meta.table)); sql.append("SELECT %s FROM `%s` WHERE 1 = 1".formatted(meta.selectPageClause, meta.table));
if (meta.canDelete) { if (meta.canDelete) {
sql.append(" AND (`deleted_at` IS NULL OR %s < `deleted_at`)".formatted(Time.now())); sql.append(" AND (`deleted_at` IS NULL OR %s < `deleted_at`)".formatted(Time.now()));
} }
@ -367,6 +369,9 @@ public class SQLProvider {
/** 查询字段映射 */ /** 查询字段映射 */
final String selectAllClause; final String selectAllClause;
/** 页面查询字段映射 */
final String selectPageClause;
/** ID 字段 */ /** ID 字段 */
final FieldColumn idFieldColumn; final FieldColumn idFieldColumn;
@ -400,8 +405,6 @@ public class SQLProvider {
TimiException.required(this.table, String.format("empty table annotation value for %s entity", entityClass.getName())); TimiException.required(this.table, String.format("empty table annotation value for %s entity", entityClass.getName()));
} }
List<Field> allFieldList = Ref.listAllFields(entityClass); List<Field> allFieldList = Ref.listAllFields(entityClass);
StringBuilder selectAllClause = new StringBuilder();
FieldColumn idFieldColumn = null; FieldColumn idFieldColumn = null;
List<FieldColumn> fieldColumnList = new ArrayList<>(); List<FieldColumn> fieldColumnList = new ArrayList<>();
for (int i = 0; i < allFieldList.size(); i++) { for (int i = 0; i < allFieldList.size(); i++) {
@ -414,21 +417,10 @@ public class SQLProvider {
TimiException.requiredNull(idFieldColumn, String.format("multi id field for %s entity", entityClass.getName())); TimiException.requiredNull(idFieldColumn, String.format("multi id field for %s entity", entityClass.getName()));
idFieldColumn = fieldColumn; idFieldColumn = fieldColumn;
} }
{
Column column = field.getAnnotation(Column.class);
if (column == null) {
selectAllClause.append('`').append(fieldColumn.columnName).append('`');
selectAllClause.append(',');
} else {
// 处理自定义映射列名
selectAllClause.append('`').append(column.value()).append('`');
selectAllClause.append(" AS `").append(fieldColumn.fieldName).append('`');
selectAllClause.append(',');
}
}
fieldColumnList.add(fieldColumn); fieldColumnList.add(fieldColumn);
} }
this.selectAllClause = selectAllClause.substring(0, selectAllClause.length() - 1); this.selectAllClause = buildSelectClause(fieldColumnList, null);
this.selectPageClause = buildSelectClause(fieldColumnList, fc -> !fc.getField().isAnnotationPresent(PageIgnore.class));
this.idFieldColumn = idFieldColumn; this.idFieldColumn = idFieldColumn;
this.fieldColumnList = List.of(fieldColumnList.toArray(new FieldColumn[0])); // 转为只读 this.fieldColumnList = List.of(fieldColumnList.toArray(new FieldColumn[0])); // 转为只读
canCreate = Creatable.class.isAssignableFrom(entityClass); canCreate = Creatable.class.isAssignableFrom(entityClass);
@ -437,6 +429,28 @@ public class SQLProvider {
canDestroy = Destroyable.class.isAssignableFrom(entityClass); canDestroy = Destroyable.class.isAssignableFrom(entityClass);
} }
private String buildSelectClause(List<FieldColumn> fieldColumnList, CallbackArgReturn<FieldColumn, Boolean> callback) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < fieldColumnList.size(); i++) {
FieldColumn fieldColumn = fieldColumnList.get(i);
Field field = fieldColumn.getField();
if (callback != null && !callback.handler(fieldColumn)) {
continue;
}
Column column = field.getAnnotation(Column.class);
if (column == null) {
sb.append('`').append(fieldColumn.columnName).append('`');
sb.append(',');
} else {
// 自定义映射列名
sb.append('`').append(column.value()).append('`');
sb.append(" AS `").append(fieldColumn.fieldName).append('`');
sb.append(',');
}
}
return sb.substring(0, sb.length() - 1);
}
public Class<?> getEntityClass() { public Class<?> getEntityClass() {
return entityClass; return entityClass;
} }