mirror of
https://gitee.com/liweiyi/ChestnutCMS.git
synced 2025-12-08 01:18:24 +08:00
版本升级:V1.5.2
This commit is contained in:
parent
0e7b319498
commit
802a86abf6
@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut</artifactId>
|
<artifactId>chestnut</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|||||||
@ -5,7 +5,7 @@ chestnut:
|
|||||||
# 代号
|
# 代号
|
||||||
alias: ChestnutCMS
|
alias: ChestnutCMS
|
||||||
# 版本
|
# 版本
|
||||||
version: 1.5.1
|
version: 1.5.2
|
||||||
# 版权年份
|
# 版权年份
|
||||||
copyrightYear: 2022-2024
|
copyrightYear: 2022-2024
|
||||||
system:
|
system:
|
||||||
@ -19,6 +19,7 @@ chestnut:
|
|||||||
uploadPath: 'E:/dev/workspace_chestnut/_xy_member/'
|
uploadPath: 'E:/dev/workspace_chestnut/_xy_member/'
|
||||||
cms:
|
cms:
|
||||||
publish:
|
publish:
|
||||||
|
strategy: ThreadPool
|
||||||
pool:
|
pool:
|
||||||
threadNamePrefix: "CMS-PUBLISH-"
|
threadNamePrefix: "CMS-PUBLISH-"
|
||||||
queueCapacity: 10000
|
queueCapacity: 10000
|
||||||
|
|||||||
@ -5,7 +5,7 @@ chestnut:
|
|||||||
# 代号
|
# 代号
|
||||||
alias: ChestnutCMS
|
alias: ChestnutCMS
|
||||||
# 版本
|
# 版本
|
||||||
version: 1.5.1
|
version: 1.5.2
|
||||||
# 版权年份
|
# 版权年份
|
||||||
copyrightYear: 2022-2024
|
copyrightYear: 2022-2024
|
||||||
system:
|
system:
|
||||||
|
|||||||
@ -5,7 +5,7 @@ chestnut:
|
|||||||
# 代号
|
# 代号
|
||||||
alias: ChestnutCMS
|
alias: ChestnutCMS
|
||||||
# 版本
|
# 版本
|
||||||
version: 1.5.1
|
version: 1.5.2
|
||||||
# 版权年份
|
# 版权年份
|
||||||
copyrightYear: 2022-2024
|
copyrightYear: 2022-2024
|
||||||
system:
|
system:
|
||||||
|
|||||||
@ -0,0 +1,2 @@
|
|||||||
|
ALTER TABLE cms_catalog MODIFY COLUMN `path` varchar(255);
|
||||||
|
ALTER TABLE cms_content MODIFY COLUMN `images` varchar(1000);
|
||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-advertisement</artifactId>
|
<artifactId>chestnut-cms-advertisement</artifactId>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-article</artifactId>
|
<artifactId>chestnut-cms-article</artifactId>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-block</artifactId>
|
<artifactId>chestnut-cms-block</artifactId>
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-comment</artifactId>
|
<artifactId>chestnut-cms-comment</artifactId>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-contentcore</artifactId>
|
<artifactId>chestnut-cms-contentcore</artifactId>
|
||||||
|
|||||||
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022-2024 兮玥(190785909@qq.com)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.chestnut.contentcore.core.impl;
|
||||||
|
|
||||||
|
import com.chestnut.contentcore.core.IPublishPipeProp;
|
||||||
|
import com.chestnut.contentcore.enums.SitePrefixMode;
|
||||||
|
import org.apache.commons.collections4.MapUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发布通道属性:站点路径模式
|
||||||
|
*
|
||||||
|
* @author 兮玥
|
||||||
|
* @email 190785909@qq.com
|
||||||
|
*/
|
||||||
|
@Component(IPublishPipeProp.BEAN_PREFIX + PublishPipeProp_PrefixMode.KEY)
|
||||||
|
public class PublishPipeProp_PrefixMode implements IPublishPipeProp {
|
||||||
|
|
||||||
|
public static final String KEY = "PrefixMode";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getKey() {
|
||||||
|
return KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "站点路径模式";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<PublishPipePropUseType> getUseTypes() {
|
||||||
|
return List.of(PublishPipePropUseType.Site);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDefaultValue() {
|
||||||
|
return SitePrefixMode.Absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getValue(String publishPipeCode, Map<String, Map<String, Object>> publishPipeProps) {
|
||||||
|
if (Objects.nonNull(publishPipeProps)) {
|
||||||
|
return MapUtils.getString(publishPipeProps.get(publishPipeCode), KEY);
|
||||||
|
}
|
||||||
|
return SitePrefixMode.Absolute;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -153,7 +153,9 @@ public class CmsSite extends BaseEntity {
|
|||||||
|
|
||||||
public String getUrl(String publishPipeCode) {
|
public String getUrl(String publishPipeCode) {
|
||||||
String ppUrl = PublishPipeProp_SiteUrl.getValue(publishPipeCode, this.publishPipeProps);
|
String ppUrl = PublishPipeProp_SiteUrl.getValue(publishPipeCode, this.publishPipeProps);
|
||||||
ppUrl = StringUtils.appendIfMissing(ppUrl, "/");
|
if (StringUtils.isNotBlank(ppUrl)) {
|
||||||
|
ppUrl = StringUtils.appendIfMissing(ppUrl, "/");
|
||||||
|
}
|
||||||
return Objects.requireNonNullElse(ppUrl, StringUtils.EMPTY);
|
return Objects.requireNonNullElse(ppUrl, StringUtils.EMPTY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022-2024 兮玥(190785909@qq.com)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.chestnut.contentcore.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 站点路径模式,决定模板上下文${Prefix}取值
|
||||||
|
*
|
||||||
|
* @author 兮玥
|
||||||
|
* @email 190785909@qq.com
|
||||||
|
*/
|
||||||
|
public class SitePrefixMode {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 相对路径,Prefix = "/"
|
||||||
|
*/
|
||||||
|
public static final String Relative = "relative";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绝对路径, Prefix = "SiteUrl"
|
||||||
|
*/
|
||||||
|
public static final String Absolute = "absolute";
|
||||||
|
|
||||||
|
public static boolean isRelative(String v) {
|
||||||
|
return Relative.equals(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isAbsolute(String v) {
|
||||||
|
return Absolute.equals(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -235,6 +235,11 @@ public class ContentCoreListener {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventListener
|
||||||
|
public void afterContentDelete(AfterContentDeleteEvent event) {
|
||||||
|
contentRelaService.onContentDelete(event.getContent().getContentEntity().getContentId());
|
||||||
|
}
|
||||||
|
|
||||||
@EventListener
|
@EventListener
|
||||||
public void onCatalogClear(OnCatalogClearEvent event) {
|
public void onCatalogClear(OnCatalogClearEvent event) {
|
||||||
CmsCatalog catalog = event.getCatalog();
|
CmsCatalog catalog = event.getCatalog();
|
||||||
|
|||||||
@ -75,7 +75,9 @@ public class SiteApiUrlProperty implements IProperty {
|
|||||||
if (StringUtils.isEmpty(apiUrl)) {
|
if (StringUtils.isEmpty(apiUrl)) {
|
||||||
apiUrl = site.getUrl(publishPipeCode);
|
apiUrl = site.getUrl(publishPipeCode);
|
||||||
}
|
}
|
||||||
apiUrl = StringUtils.appendIfMissing(apiUrl, "/");
|
if (StringUtils.isNotEmpty(apiUrl)) {
|
||||||
|
apiUrl = StringUtils.appendIfMissing(apiUrl, "/");
|
||||||
|
}
|
||||||
return apiUrl;
|
return apiUrl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,4 +20,5 @@ import com.chestnut.contentcore.domain.CmsContentRela;
|
|||||||
|
|
||||||
public interface IContentRelaService extends IService<CmsContentRela> {
|
public interface IContentRelaService extends IService<CmsContentRela> {
|
||||||
|
|
||||||
|
void onContentDelete(Long contentId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.chestnut.contentcore.service.impl;
|
package com.chestnut.contentcore.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.chestnut.contentcore.domain.CmsContentRela;
|
import com.chestnut.contentcore.domain.CmsContentRela;
|
||||||
import com.chestnut.contentcore.mapper.CmsContentRelaMapper;
|
import com.chestnut.contentcore.mapper.CmsContentRelaMapper;
|
||||||
@ -26,4 +27,10 @@ import org.springframework.stereotype.Service;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class ContentRelaServiceImpl extends ServiceImpl<CmsContentRelaMapper, CmsContentRela>
|
public class ContentRelaServiceImpl extends ServiceImpl<CmsContentRelaMapper, CmsContentRela>
|
||||||
implements IContentRelaService {
|
implements IContentRelaService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onContentDelete(Long contentId) {
|
||||||
|
this.remove(new LambdaQueryWrapper<CmsContentRela>()
|
||||||
|
.eq(CmsContentRela::getContentId, contentId).or().eq(CmsContentRela::getRelaContentId, contentId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -119,7 +119,9 @@ public class SiteServiceImpl extends ServiceImpl<CmsSiteMapper, CmsSite> impleme
|
|||||||
CmsSite site = new CmsSite();
|
CmsSite site = new CmsSite();
|
||||||
site.setSiteId(IdUtils.getSnowflakeId());
|
site.setSiteId(IdUtils.getSnowflakeId());
|
||||||
BeanUtils.copyProperties(dto, site, "siteId");
|
BeanUtils.copyProperties(dto, site, "siteId");
|
||||||
site.setResourceUrl(StringUtils.appendIfMissing(site.getResourceUrl(), "/"));
|
if (StringUtils.isNotBlank(site.getResourceUrl())) {
|
||||||
|
site.setResourceUrl(StringUtils.appendIfMissing(site.getResourceUrl(), "/"));
|
||||||
|
}
|
||||||
site.setSortFlag(SortUtils.getDefaultSortValue());
|
site.setSortFlag(SortUtils.getDefaultSortValue());
|
||||||
site.createBy(dto.getOperator().getUsername());
|
site.createBy(dto.getOperator().getUsername());
|
||||||
this.save(site);
|
this.save(site);
|
||||||
@ -143,7 +145,9 @@ public class SiteServiceImpl extends ServiceImpl<CmsSiteMapper, CmsSite> impleme
|
|||||||
CmsSite site = this.getById(dto.getSiteId());
|
CmsSite site = this.getById(dto.getSiteId());
|
||||||
|
|
||||||
BeanUtils.copyProperties(dto, site, "path");
|
BeanUtils.copyProperties(dto, site, "path");
|
||||||
site.setResourceUrl(StringUtils.appendIfMissing(site.getResourceUrl(), "/"));
|
if (StringUtils.isNotBlank(site.getResourceUrl())) {
|
||||||
|
site.setResourceUrl(StringUtils.appendIfMissing(site.getResourceUrl(), "/"));
|
||||||
|
}
|
||||||
// 发布通道数据处理
|
// 发布通道数据处理
|
||||||
dto.getPublishPipeDatas().forEach(prop -> {
|
dto.getPublishPipeDatas().forEach(prop -> {
|
||||||
prop.getProps().entrySet().removeIf(e -> !publishPipeProps.containsKey(IPublishPipeProp.BEAN_PREFIX + e.getKey()));
|
prop.getProps().entrySet().removeIf(e -> !publishPipeProps.containsKey(IPublishPipeProp.BEAN_PREFIX + e.getKey()));
|
||||||
|
|||||||
@ -18,6 +18,7 @@ package com.chestnut.contentcore.template.tag;
|
|||||||
import com.chestnut.common.staticize.FreeMarkerUtils;
|
import com.chestnut.common.staticize.FreeMarkerUtils;
|
||||||
import com.chestnut.common.staticize.core.TemplateContext;
|
import com.chestnut.common.staticize.core.TemplateContext;
|
||||||
import com.chestnut.common.staticize.enums.TagAttrDataType;
|
import com.chestnut.common.staticize.enums.TagAttrDataType;
|
||||||
|
import com.chestnut.common.staticize.exception.IncludeTemplateNotFoundException;
|
||||||
import com.chestnut.common.staticize.tag.AbstractTag;
|
import com.chestnut.common.staticize.tag.AbstractTag;
|
||||||
import com.chestnut.common.staticize.tag.TagAttr;
|
import com.chestnut.common.staticize.tag.TagAttr;
|
||||||
import com.chestnut.common.utils.Assert;
|
import com.chestnut.common.utils.Assert;
|
||||||
@ -36,7 +37,6 @@ import freemarker.core.Environment;
|
|||||||
import freemarker.template.Template;
|
import freemarker.template.Template;
|
||||||
import freemarker.template.TemplateException;
|
import freemarker.template.TemplateException;
|
||||||
import freemarker.template.TemplateModel;
|
import freemarker.template.TemplateModel;
|
||||||
import freemarker.template.TemplateNotFoundException;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.apache.commons.collections4.MapUtils;
|
import org.apache.commons.collections4.MapUtils;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
@ -113,7 +113,7 @@ public class CmsPageWidgetTag extends AbstractTag {
|
|||||||
}
|
}
|
||||||
CmsSite site = this.siteService.getSite(siteId);
|
CmsSite site = this.siteService.getSite(siteId);
|
||||||
File templateFile = this.templateService.findTemplateFile(site, pw.getTemplate(), context.getPublishPipeCode());
|
File templateFile = this.templateService.findTemplateFile(site, pw.getTemplate(), context.getPublishPipeCode());
|
||||||
Assert.notNull(templateFile, () -> new TemplateNotFoundException(pw.getTemplate(), null, null));
|
Assert.notNull(templateFile, () -> new IncludeTemplateNotFoundException(pw.getTemplate(), env));
|
||||||
|
|
||||||
boolean ssi = MapUtils.getBoolean(attrs, ATTR_SSI, EnableSSIProperty.getValue(site.getConfigProps()));
|
boolean ssi = MapUtils.getBoolean(attrs, ATTR_SSI, EnableSSIProperty.getValue(site.getConfigProps()));
|
||||||
String templateKey = SiteUtils.getTemplateKey(site, pw.getPublishPipeCode(), pw.getTemplate());
|
String templateKey = SiteUtils.getTemplateKey(site, pw.getPublishPipeCode(), pw.getTemplate());
|
||||||
|
|||||||
@ -20,7 +20,9 @@ import com.chestnut.contentcore.ContentCoreConsts;
|
|||||||
import com.chestnut.contentcore.config.CMSConfig;
|
import com.chestnut.contentcore.config.CMSConfig;
|
||||||
import com.chestnut.contentcore.core.IInternalDataType;
|
import com.chestnut.contentcore.core.IInternalDataType;
|
||||||
import com.chestnut.contentcore.core.impl.InternalDataType_Site;
|
import com.chestnut.contentcore.core.impl.InternalDataType_Site;
|
||||||
|
import com.chestnut.contentcore.core.impl.PublishPipeProp_PrefixMode;
|
||||||
import com.chestnut.contentcore.domain.CmsSite;
|
import com.chestnut.contentcore.domain.CmsSite;
|
||||||
|
import com.chestnut.contentcore.enums.SitePrefixMode;
|
||||||
import com.chestnut.system.fixed.config.BackendContext;
|
import com.chestnut.system.fixed.config.BackendContext;
|
||||||
|
|
||||||
public class SiteUtils {
|
public class SiteUtils {
|
||||||
@ -44,6 +46,10 @@ public class SiteUtils {
|
|||||||
return CMSConfig.getResourcePreviewPrefix()
|
return CMSConfig.getResourcePreviewPrefix()
|
||||||
+ getSitePublishPipePath(site.getPath(), publishPipeCode);
|
+ getSitePublishPipePath(site.getPath(), publishPipeCode);
|
||||||
}
|
}
|
||||||
|
String pathMode = PublishPipeProp_PrefixMode.getValue(publishPipeCode, site.getPublishPipeProps());
|
||||||
|
if (SitePrefixMode.isRelative(pathMode)) {
|
||||||
|
return "/";
|
||||||
|
}
|
||||||
return site.getUrl(publishPipeCode);
|
return site.getUrl(publishPipeCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-customform</artifactId>
|
<artifactId>chestnut-cms-customform</artifactId>
|
||||||
|
|||||||
@ -34,9 +34,9 @@ public class CustomFormRule extends FixedDictType {
|
|||||||
|
|
||||||
public static final String Unlimited = "0"; // 无限制
|
public static final String Unlimited = "0"; // 无限制
|
||||||
|
|
||||||
public static final String IP = "1"; // IP
|
// public static final String IP = "1"; // IP
|
||||||
|
|
||||||
public static final String BrowserFingerprint = "2"; // 浏览器指纹
|
// public static final String BrowserFingerprint = "2"; // 浏览器指纹
|
||||||
|
|
||||||
|
|
||||||
private static final ISysDictTypeService dictTypeService = SpringUtils.getBean(ISysDictTypeService.class);
|
private static final ISysDictTypeService dictTypeService = SpringUtils.getBean(ISysDictTypeService.class);
|
||||||
@ -44,8 +44,8 @@ public class CustomFormRule extends FixedDictType {
|
|||||||
public CustomFormRule() {
|
public CustomFormRule() {
|
||||||
super(TYPE, "{DICT." + TYPE + "}");
|
super(TYPE, "{DICT." + TYPE + "}");
|
||||||
super.addDictData("{DICT." + TYPE + "." + Unlimited + "}", Unlimited, 1);
|
super.addDictData("{DICT." + TYPE + "." + Unlimited + "}", Unlimited, 1);
|
||||||
super.addDictData("{DICT." + TYPE + "." + IP + "}", IP, 2);
|
// super.addDictData("{DICT." + TYPE + "." + IP + "}", IP, 2);
|
||||||
super.addDictData("{DICT." + TYPE + "." + BrowserFingerprint + "}", BrowserFingerprint, 3);
|
// super.addDictData("{DICT." + TYPE + "." + BrowserFingerprint + "}", BrowserFingerprint, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void decode(List<T> list, Function<T, String> getter, BiConsumer<T, String> setter) {
|
public static <T> void decode(List<T> list, Function<T, String> getter, BiConsumer<T, String> setter) {
|
||||||
|
|||||||
@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapp
|
|||||||
import com.chestnut.common.staticize.FreeMarkerUtils;
|
import com.chestnut.common.staticize.FreeMarkerUtils;
|
||||||
import com.chestnut.common.staticize.core.TemplateContext;
|
import com.chestnut.common.staticize.core.TemplateContext;
|
||||||
import com.chestnut.common.staticize.enums.TagAttrDataType;
|
import com.chestnut.common.staticize.enums.TagAttrDataType;
|
||||||
|
import com.chestnut.common.staticize.exception.IncludeTemplateNotFoundException;
|
||||||
import com.chestnut.common.staticize.tag.AbstractTag;
|
import com.chestnut.common.staticize.tag.AbstractTag;
|
||||||
import com.chestnut.common.staticize.tag.TagAttr;
|
import com.chestnut.common.staticize.tag.TagAttr;
|
||||||
import com.chestnut.common.utils.Assert;
|
import com.chestnut.common.utils.Assert;
|
||||||
@ -39,7 +40,6 @@ import freemarker.core.Environment;
|
|||||||
import freemarker.template.Template;
|
import freemarker.template.Template;
|
||||||
import freemarker.template.TemplateException;
|
import freemarker.template.TemplateException;
|
||||||
import freemarker.template.TemplateModel;
|
import freemarker.template.TemplateModel;
|
||||||
import freemarker.template.TemplateNotFoundException;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.apache.commons.collections4.MapUtils;
|
import org.apache.commons.collections4.MapUtils;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
@ -104,7 +104,7 @@ public class CmsCustomFormTag extends AbstractTag {
|
|||||||
String template = form.getTemplates().getOrDefault(context.getPublishPipeCode(),
|
String template = form.getTemplates().getOrDefault(context.getPublishPipeCode(),
|
||||||
PublishPipeProp_CustomFormTemplate.getValue(context.getPublishPipeCode(), site.getPublishPipeProps()));
|
PublishPipeProp_CustomFormTemplate.getValue(context.getPublishPipeCode(), site.getPublishPipeProps()));
|
||||||
File templateFile = this.templateService.findTemplateFile(site, template, context.getPublishPipeCode());
|
File templateFile = this.templateService.findTemplateFile(site, template, context.getPublishPipeCode());
|
||||||
Assert.notNull(templateFile, () -> new TemplateNotFoundException(template, null, null));
|
Assert.notNull(templateFile, () -> new IncludeTemplateNotFoundException(template, env));
|
||||||
|
|
||||||
boolean ssi = MapUtils.getBoolean(attrs, ATTR_SSI, EnableSSIProperty.getValue(site.getConfigProps()));
|
boolean ssi = MapUtils.getBoolean(attrs, ATTR_SSI, EnableSSIProperty.getValue(site.getConfigProps()));
|
||||||
String templateKey = SiteUtils.getTemplateKey(site, context.getPublishPipeCode(), template);
|
String templateKey = SiteUtils.getTemplateKey(site, context.getPublishPipeCode(), template);
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-dynamic</artifactId>
|
<artifactId>chestnut-cms-dynamic</artifactId>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-exmodel</artifactId>
|
<artifactId>chestnut-cms-exmodel</artifactId>
|
||||||
|
|||||||
@ -21,9 +21,13 @@ import com.chestnut.common.staticize.exception.InvalidTagAttrValueException;
|
|||||||
import com.chestnut.common.staticize.tag.AbstractTag;
|
import com.chestnut.common.staticize.tag.AbstractTag;
|
||||||
import com.chestnut.common.staticize.tag.TagAttr;
|
import com.chestnut.common.staticize.tag.TagAttr;
|
||||||
import com.chestnut.common.staticize.tag.TagAttrOption;
|
import com.chestnut.common.staticize.tag.TagAttrOption;
|
||||||
|
import com.chestnut.common.utils.ConvertUtils;
|
||||||
import com.chestnut.common.utils.IdUtils;
|
import com.chestnut.common.utils.IdUtils;
|
||||||
import com.chestnut.exmodel.CmsExtendMetaModelType;
|
import com.chestnut.exmodel.CmsExtendMetaModelType;
|
||||||
|
import com.chestnut.xmodel.core.IMetaControlType;
|
||||||
|
import com.chestnut.xmodel.core.MetaModel;
|
||||||
import com.chestnut.xmodel.service.IModelDataService;
|
import com.chestnut.xmodel.service.IModelDataService;
|
||||||
|
import com.chestnut.xmodel.service.IModelService;
|
||||||
import freemarker.core.Environment;
|
import freemarker.core.Environment;
|
||||||
import freemarker.template.TemplateException;
|
import freemarker.template.TemplateException;
|
||||||
import freemarker.template.TemplateModel;
|
import freemarker.template.TemplateModel;
|
||||||
@ -53,7 +57,9 @@ public class CmsXModelDataTag extends AbstractTag {
|
|||||||
public final static String ATTR_DATA_TYPE = "dataType";
|
public final static String ATTR_DATA_TYPE = "dataType";
|
||||||
public final static String ATTR_DATA_ID = "dataId";
|
public final static String ATTR_DATA_ID = "dataId";
|
||||||
|
|
||||||
|
private final IModelService modelService;
|
||||||
private final IModelDataService modelDataService;
|
private final IModelDataService modelDataService;
|
||||||
|
private final Map<String, IMetaControlType> controlTypeMap;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<TagAttr> getTagAttrs() {
|
public List<TagAttr> getTagAttrs() {
|
||||||
@ -79,6 +85,17 @@ public class CmsXModelDataTag extends AbstractTag {
|
|||||||
CmsExtendMetaModelType.FIELD_DATA_TYPE.getCode(), dataType,
|
CmsExtendMetaModelType.FIELD_DATA_TYPE.getCode(), dataType,
|
||||||
CmsExtendMetaModelType.FIELD_DATA_ID.getCode(), dataId
|
CmsExtendMetaModelType.FIELD_DATA_ID.getCode(), dataId
|
||||||
));
|
));
|
||||||
|
MetaModel model = this.modelService.getMetaModel(modelId);
|
||||||
|
modelData.entrySet().forEach(entry -> {
|
||||||
|
model.getFields().stream().filter(field -> field.getCode().equals(entry.getKey()))
|
||||||
|
.findFirst().ifPresent(field -> {
|
||||||
|
IMetaControlType controlType = controlTypeMap.get(IMetaControlType.BEAN_PREFIX + field.getControlType());
|
||||||
|
if (controlType != null) {
|
||||||
|
Object v = controlType.stringAsValue(ConvertUtils.toStr(entry.getValue()));
|
||||||
|
entry.setValue(v);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
return Map.of(StaticizeConstants.TemplateVariable_Data, this.wrap(env, modelData));
|
return Map.of(StaticizeConstants.TemplateVariable_Data, this.wrap(env, modelData));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-image</artifactId>
|
<artifactId>chestnut-cms-image</artifactId>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-link</artifactId>
|
<artifactId>chestnut-cms-link</artifactId>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-media</artifactId>
|
<artifactId>chestnut-cms-media</artifactId>
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-member</artifactId>
|
<artifactId>chestnut-cms-member</artifactId>
|
||||||
|
|||||||
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022-2024 兮玥(190785909@qq.com)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.chestnut.cms.member.properties;
|
||||||
|
|
||||||
|
import com.chestnut.common.utils.StringUtils;
|
||||||
|
import com.chestnut.contentcore.core.IProperty;
|
||||||
|
import com.chestnut.contentcore.domain.CmsSite;
|
||||||
|
import com.chestnut.contentcore.util.ConfigPropertyUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会员资源访问域名
|
||||||
|
*
|
||||||
|
* @author 兮玥
|
||||||
|
* @email 190785909@qq.com
|
||||||
|
*/
|
||||||
|
@Component(IProperty.BEAN_NAME_PREFIX + MemberResourceUrlProperty.ID)
|
||||||
|
public class MemberResourceUrlProperty implements IProperty {
|
||||||
|
|
||||||
|
public final static String ID = "MemberResourceUrl";
|
||||||
|
|
||||||
|
static UseType[] UseTypes = new UseType[] { UseType.Site };
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UseType[] getUseTypes() {
|
||||||
|
return UseTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getId() {
|
||||||
|
return ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "会员资源访问域名";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getValue(CmsSite site) {
|
||||||
|
String value = ConfigPropertyUtils.getStringValue(ID, site.getConfigProps());
|
||||||
|
if (StringUtils.isNotEmpty(value)) {
|
||||||
|
return StringUtils.appendIfMissing(value, "/");
|
||||||
|
}
|
||||||
|
return StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-search</artifactId>
|
<artifactId>chestnut-cms-search</artifactId>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-seo</artifactId>
|
<artifactId>chestnut-cms-seo</artifactId>
|
||||||
|
|||||||
@ -195,7 +195,6 @@ public class BaiduSitemapService {
|
|||||||
*/
|
*/
|
||||||
public void generateSitemapIndexXml(CmsSite site, String publishPipeCode) throws IOException {
|
public void generateSitemapIndexXml(CmsSite site, String publishPipeCode) throws IOException {
|
||||||
String siteUrl = site.getUrl(publishPipeCode);
|
String siteUrl = site.getUrl(publishPipeCode);
|
||||||
siteUrl = StringUtils.appendIfMissing(siteUrl, "/");
|
|
||||||
String siteRoot = SiteUtils.getSiteRoot(site, publishPipeCode);
|
String siteRoot = SiteUtils.getSiteRoot(site, publishPipeCode);
|
||||||
File[] files = new File(siteRoot).listFiles(f -> f.getName().startsWith(SitemapFileNamePrefix));
|
File[] files = new File(siteRoot).listFiles(f -> f.getName().startsWith(SitemapFileNamePrefix));
|
||||||
if (files != null) {
|
if (files != null) {
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-stat</artifactId>
|
<artifactId>chestnut-cms-stat</artifactId>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-vote</artifactId>
|
<artifactId>chestnut-cms-vote</artifactId>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-cms</artifactId>
|
<artifactId>chestnut-cms</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-cms-word</artifactId>
|
<artifactId>chestnut-cms-word</artifactId>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut</artifactId>
|
<artifactId>chestnut</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-common</artifactId>
|
<artifactId>chestnut-common</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -15,8 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.chestnut.common.utils;
|
package com.chestnut.common.utils;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.Objects;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
public class ArrayUtils {
|
public class ArrayUtils {
|
||||||
@ -84,4 +84,32 @@ public class ArrayUtils {
|
|||||||
}
|
}
|
||||||
return defaultV;
|
return defaultV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Map<String, List<Map<String, ?>>> groupBy(List<Map<String, ?>> list, String groupBy) {
|
||||||
|
Map<String, List<Map<String, ?>>> map = new HashMap<>();
|
||||||
|
list.forEach(obj -> {
|
||||||
|
String key = obj.get(groupBy).toString();
|
||||||
|
List<Map<String, ?>> groupList = map.get(key);
|
||||||
|
if (Objects.isNull(groupList)) {
|
||||||
|
groupList = new ArrayList<>();
|
||||||
|
map.put(key, groupList);
|
||||||
|
}
|
||||||
|
groupList.add(obj);
|
||||||
|
});
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Map<String, List<T>> groupBy(List<T> list, Function<T, String> getter) {
|
||||||
|
Map<String, List<T>> map = new HashMap<>();
|
||||||
|
list.forEach(obj -> {
|
||||||
|
String key = getter.apply(obj);
|
||||||
|
List<T> groupList = map.get(key);
|
||||||
|
if (Objects.isNull(groupList)) {
|
||||||
|
groupList = new ArrayList<>();
|
||||||
|
map.put(key, groupList);
|
||||||
|
}
|
||||||
|
groupList.add(obj);
|
||||||
|
});
|
||||||
|
return map;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-common</artifactId>
|
<artifactId>chestnut-common</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-common</artifactId>
|
<artifactId>chestnut-common</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-common</artifactId>
|
<artifactId>chestnut-common</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-common</artifactId>
|
<artifactId>chestnut-common</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-common</artifactId>
|
<artifactId>chestnut-common</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-common</artifactId>
|
<artifactId>chestnut-common</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -48,7 +48,7 @@ public class FreeMarkerConfig {
|
|||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param properties
|
* @param properties
|
||||||
* @param fileTemplateLoader
|
* @param templateLoaders
|
||||||
* @return
|
* @return
|
||||||
* @throws TemplateException
|
* @throws TemplateException
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022-2024 兮玥(190785909@qq.com)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.chestnut.common.staticize.exception;
|
||||||
|
|
||||||
|
import com.chestnut.common.i18n.I18nUtils;
|
||||||
|
import freemarker.core.Environment;
|
||||||
|
import freemarker.template.TemplateException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IncludeTemplateNotFoundException
|
||||||
|
*
|
||||||
|
* @author 兮玥
|
||||||
|
* @email 190785909@qq.com
|
||||||
|
*/
|
||||||
|
public class IncludeTemplateNotFoundException extends TemplateException {
|
||||||
|
|
||||||
|
public IncludeTemplateNotFoundException(String templateKey, Environment env) {
|
||||||
|
super(I18nUtils.get("{FREEMARKER.ERR.IncludeTemplateNotFound}", templateKey), env);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -16,10 +16,7 @@
|
|||||||
package com.chestnut.common.staticize.func.impl;
|
package com.chestnut.common.staticize.func.impl;
|
||||||
|
|
||||||
import com.chestnut.common.staticize.func.AbstractFunc;
|
import com.chestnut.common.staticize.func.AbstractFunc;
|
||||||
import com.chestnut.common.utils.ConvertUtils;
|
import com.chestnut.common.utils.*;
|
||||||
import com.chestnut.common.utils.DateUtils;
|
|
||||||
import com.chestnut.common.utils.NumberUtils;
|
|
||||||
import com.chestnut.common.utils.StringUtils;
|
|
||||||
import freemarker.ext.beans.BeanModel;
|
import freemarker.ext.beans.BeanModel;
|
||||||
import freemarker.template.SimpleNumber;
|
import freemarker.template.SimpleNumber;
|
||||||
import freemarker.template.SimpleScalar;
|
import freemarker.template.SimpleScalar;
|
||||||
@ -30,11 +27,11 @@ import org.springframework.stereotype.Component;
|
|||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneId;
|
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.time.temporal.TemporalAccessor;
|
import java.time.temporal.TemporalAccessor;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,8 +49,7 @@ public class DateFormatFunction extends AbstractFunc {
|
|||||||
|
|
||||||
private static final String ARG2_NAME = "{FREEMARKER.FUNC." + FUNC_NAME + ".Arg2.Name}";
|
private static final String ARG2_NAME = "{FREEMARKER.FUNC." + FUNC_NAME + ".Arg2.Name}";
|
||||||
|
|
||||||
private static final SimpleDateFormat DEFAULT_SIMPLE_DATE_FORMAT = new SimpleDateFormat(
|
private static final String ARG3_NAME = "{FREEMARKER.FUNC." + FUNC_NAME + ".Arg3.Name}";
|
||||||
DateUtils.YYYY_MM_DD_HH_MM_SS);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getFuncName() {
|
public String getFuncName() {
|
||||||
@ -70,35 +66,35 @@ public class DateFormatFunction extends AbstractFunc {
|
|||||||
if (args.length < 1 || Objects.isNull(args[0])) {
|
if (args.length < 1 || Objects.isNull(args[0])) {
|
||||||
return StringUtils.EMPTY;
|
return StringUtils.EMPTY;
|
||||||
}
|
}
|
||||||
|
Locale locale = args.length == 3 ? Locale.forLanguageTag(args[2].toString()) : Locale.getDefault();
|
||||||
if (args[0] instanceof BeanModel model) {
|
if (args[0] instanceof BeanModel model) {
|
||||||
Object obj = model.getWrappedObject();
|
Object obj = model.getWrappedObject();
|
||||||
|
|
||||||
if (obj instanceof TemporalAccessor t) {
|
if (obj instanceof TemporalAccessor t) {
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
return DateTimeFormatter.ofPattern(args[1].toString()).format(t);
|
return DateTimeFormatter.ofPattern(args[1].toString(), locale).format(t);
|
||||||
} else {
|
} else {
|
||||||
return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(t);
|
return DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS, locale).format(t);
|
||||||
}
|
}
|
||||||
} else if (obj instanceof Date d) {
|
} else if (obj instanceof Date d) {
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
String formatStr = ConvertUtils.toStr(args[1], DateUtils.YYYY_MM_DD_HH_MM_SS);
|
String formatStr = ConvertUtils.toStr(args[1], DateUtils.YYYY_MM_DD_HH_MM_SS);
|
||||||
return DateUtils.parseDateToStr(formatStr, d);
|
SimpleDateFormat format = new SimpleDateFormat(formatStr, locale);
|
||||||
|
return format.format(d);
|
||||||
} else {
|
} else {
|
||||||
return DEFAULT_SIMPLE_DATE_FORMAT.format(d);
|
SimpleDateFormat format = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS, locale);
|
||||||
|
return format.format(d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (args[0] instanceof SimpleScalar s) {
|
} else if (args[0] instanceof SimpleScalar s) {
|
||||||
String value = s.getAsString();
|
String value = s.getAsString();
|
||||||
if (NumberUtils.isCreatable(value)) {
|
if (NumberUtils.isCreatable(value)) {
|
||||||
LocalDateTime dateTime = Instant.ofEpochMilli(ConvertUtils.toLong(value))
|
LocalDateTime dateTime = TimeUtils.toLocalDateTime(Instant.ofEpochMilli(ConvertUtils.toLong(value)));
|
||||||
.atZone(ZoneId.systemDefault()).toLocalDateTime();
|
return DateTimeFormatter.ofPattern(args[1].toString(), locale).format(dateTime);
|
||||||
return DateTimeFormatter.ofPattern(args[1].toString()).format(dateTime);
|
|
||||||
}
|
}
|
||||||
} else if (args[0] instanceof SimpleNumber s) {
|
} else if (args[0] instanceof SimpleNumber s) {
|
||||||
long value = s.getAsNumber().longValue();
|
long value = s.getAsNumber().longValue();
|
||||||
LocalDateTime dateTime = Instant.ofEpochMilli(value)
|
LocalDateTime dateTime = TimeUtils.toLocalDateTime(Instant.ofEpochMilli(value));
|
||||||
.atZone(ZoneId.systemDefault()).toLocalDateTime();
|
return DateTimeFormatter.ofPattern(args[1].toString(), locale).format(dateTime);
|
||||||
return DateTimeFormatter.ofPattern(args[1].toString()).format(dateTime);
|
|
||||||
}
|
}
|
||||||
return args[0].toString();
|
return args[0].toString();
|
||||||
}
|
}
|
||||||
@ -106,6 +102,7 @@ public class DateFormatFunction extends AbstractFunc {
|
|||||||
@Override
|
@Override
|
||||||
public List<FuncArg> getFuncArgs() {
|
public List<FuncArg> getFuncArgs() {
|
||||||
return List.of(new FuncArg(ARG1_NAME, FuncArgType.DateTime, true),
|
return List.of(new FuncArg(ARG1_NAME, FuncArgType.DateTime, true),
|
||||||
new FuncArg(ARG2_NAME, FuncArgType.String, false, null, "yyyy-MM-dd HH:mm:ss"));
|
new FuncArg(ARG2_NAME, FuncArgType.String, false, null, "yyyy-MM-dd HH:mm:ss"),
|
||||||
|
new FuncArg(ARG3_NAME, FuncArgType.String, false, null, Locale.getDefault().toLanguageTag()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022-2024 兮玥(190785909@qq.com)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.chestnut.common.staticize.func.impl;
|
||||||
|
|
||||||
|
import com.chestnut.common.staticize.func.AbstractFunc;
|
||||||
|
import com.chestnut.common.utils.StringUtils;
|
||||||
|
import freemarker.template.TemplateModelException;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Freemarker模板自定义函数:提取URL域名
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class GetDomainFunction extends AbstractFunc {
|
||||||
|
|
||||||
|
static final String FUNC_NAME = "getDomain";
|
||||||
|
|
||||||
|
private static final String DESC = "{FREEMARKER.FUNC." + FUNC_NAME + ".DESC}";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFuncName() {
|
||||||
|
return FUNC_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDesc() {
|
||||||
|
return DESC;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object exec0(Object... args) throws TemplateModelException {
|
||||||
|
if (args.length < 1) {
|
||||||
|
return StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
String str = args[0].toString();
|
||||||
|
if (StringUtils.isBlank(str)) {
|
||||||
|
return StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
return StringUtils.substringBefore(StringUtils.substringAfter(str, "://"), "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FuncArg> getFuncArgs() {
|
||||||
|
return List.of(new FuncArg("URL", FuncArgType.String, true, null));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022-2024 兮玥(190785909@qq.com)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.chestnut.common.staticize.func.impl;
|
||||||
|
|
||||||
|
import com.chestnut.common.staticize.func.AbstractFunc;
|
||||||
|
import com.chestnut.common.utils.StringUtils;
|
||||||
|
import freemarker.template.TemplateHashModel;
|
||||||
|
import freemarker.template.TemplateModel;
|
||||||
|
import freemarker.template.TemplateModelException;
|
||||||
|
import freemarker.template.TemplateSequenceModel;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Freemarker模板自定义函数:列表分组
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class GroupByFunction extends AbstractFunc {
|
||||||
|
|
||||||
|
static final String FUNC_NAME = "groupBy";
|
||||||
|
|
||||||
|
private static final String DESC = "{FREEMARKER.FUNC." + FUNC_NAME + ".DESC}";
|
||||||
|
|
||||||
|
private static final String ARG1_NAME = "{FREEMARKER.FUNC." + FUNC_NAME + ".Arg1.Name}";
|
||||||
|
|
||||||
|
private static final String ARG1_DESC = "{FREEMARKER.FUNC." + FUNC_NAME + ".Arg1.Desc}";
|
||||||
|
|
||||||
|
private static final String ARG2_NAME = "{FREEMARKER.FUNC." + FUNC_NAME + ".Arg2.Name}";
|
||||||
|
|
||||||
|
private static final String ARG2_DESC = "{FREEMARKER.FUNC." + FUNC_NAME + ".Arg2.Desc}";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFuncName() {
|
||||||
|
return FUNC_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDesc() {
|
||||||
|
return DESC;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object exec0(Object... args) throws TemplateModelException {
|
||||||
|
if (StringUtils.isEmpty(args)) {
|
||||||
|
return StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
String groupBy = args[1].toString();
|
||||||
|
if (args[0] instanceof TemplateSequenceModel dataList) {
|
||||||
|
return groupBy(dataList, groupBy);
|
||||||
|
}
|
||||||
|
return Map.of();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, List<TemplateModel>> groupBy(TemplateSequenceModel list, String groupBy) throws TemplateModelException {
|
||||||
|
Map<String, List<TemplateModel>> map = new HashMap<>();
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
TemplateModel itemModel = list.get(i);
|
||||||
|
if (itemModel instanceof TemplateHashModel model) {
|
||||||
|
String key = model.get(groupBy).toString();
|
||||||
|
List<TemplateModel> groupList = map.get(key);
|
||||||
|
if (Objects.isNull(groupList)) {
|
||||||
|
groupList = new ArrayList<>();
|
||||||
|
map.put(key, groupList);
|
||||||
|
}
|
||||||
|
groupList.add(itemModel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FuncArg> getFuncArgs() {
|
||||||
|
return List.of(
|
||||||
|
new FuncArg(ARG1_NAME, FuncArgType.Array, true, ARG1_DESC),
|
||||||
|
new FuncArg(ARG2_NAME, FuncArgType.String, true, ARG2_DESC)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -33,8 +33,13 @@ FREEMARKER.FUNC.randomInt.Arg2.Name=随机数范围最大值
|
|||||||
FREEMARKER.FUNC.dateFormat.DESC=日期格式化,例如:`${dateFormat(content.publishDate,'yyyy-MM')}`
|
FREEMARKER.FUNC.dateFormat.DESC=日期格式化,例如:`${dateFormat(content.publishDate,'yyyy-MM')}`
|
||||||
FREEMARKER.FUNC.dateFormat.Arg1.Name=日期时间
|
FREEMARKER.FUNC.dateFormat.Arg1.Name=日期时间
|
||||||
FREEMARKER.FUNC.dateFormat.Arg2.Name=格式化字符串
|
FREEMARKER.FUNC.dateFormat.Arg2.Name=格式化字符串
|
||||||
|
FREEMARKER.FUNC.dateFormat.Arg3.Name=地区
|
||||||
FREEMARKER.FUNC.clearHtmlTag.DESC=清除Html标签,例如:`${clearHtmlTag(ArticleContent)}`
|
FREEMARKER.FUNC.clearHtmlTag.DESC=清除Html标签,例如:`${clearHtmlTag(ArticleContent)}`
|
||||||
FREEMARKER.FUNC.clearHtmlTag.Arg1.Name=Html字符串
|
FREEMARKER.FUNC.clearHtmlTag.Arg1.Name=Html字符串
|
||||||
|
FREEMARKER.FUNC.getDomain.DESC=提取URL的域名
|
||||||
|
FREEMARKER.FUNC.groupBy.DESC=将列表数据按列表项指定字段分组
|
||||||
|
FREEMARKER.FUNC.groupBy.Arg1.Name=列表数据
|
||||||
|
FREEMARKER.FUNC.groupBy.Arg2.Name=列表项字段名
|
||||||
|
|
||||||
FREEMARKER.ERR.MISSING_ATTR=标签 <@{0}> 缺少必填属性:{1}。
|
FREEMARKER.ERR.MISSING_ATTR=标签 <@{0}> 缺少必填属性:{1}。
|
||||||
FREEMARKER.ERR.INVALID_ATTR_TYPE=标签 <@{0}> 属性 `{1}` 类型必须是:{2}, 当前是:{3}。
|
FREEMARKER.ERR.INVALID_ATTR_TYPE=标签 <@{0}> 属性 `{1}` 类型必须是:{2}, 当前是:{3}。
|
||||||
@ -43,3 +48,4 @@ FREEMARKER.ERR.INVALID_ATTR_VALUE2=标签 <@{0}> 属性值 `{1}` = `{2}` 无效
|
|||||||
FREEMARKER.ERR.DUPLICATE_PAGE_FLAG=标签分页属性`page`不能被多次设置为true。
|
FREEMARKER.ERR.DUPLICATE_PAGE_FLAG=标签分页属性`page`不能被多次设置为true。
|
||||||
FREEMARKER.ERR.PAGE_INDEX_OUT_OF_BOUNDS=分页页码`{0}`超出最大页码`{1}`。
|
FREEMARKER.ERR.PAGE_INDEX_OUT_OF_BOUNDS=分页页码`{0}`超出最大页码`{1}`。
|
||||||
FREEMARKER.ERR.INVALID_FUNC_ARGUMENT=函数`{0}()`第{1}个参数错误:{2}。
|
FREEMARKER.ERR.INVALID_FUNC_ARGUMENT=函数`{0}()`第{1}个参数错误:{2}。
|
||||||
|
FREEMARKER.ERR.IncludeTemplateNotFound=引用模板`{0}`不存在。
|
||||||
@ -33,8 +33,13 @@ FREEMARKER.FUNC.randomInt.Arg2.Name=Maximum value
|
|||||||
FREEMARKER.FUNC.dateFormat.DESC=Use `${dateFormat(site.publishDate,'yyyy-MM')}` in template to format the date.
|
FREEMARKER.FUNC.dateFormat.DESC=Use `${dateFormat(site.publishDate,'yyyy-MM')}` in template to format the date.
|
||||||
FREEMARKER.FUNC.dateFormat.Arg1.Name=Date time
|
FREEMARKER.FUNC.dateFormat.Arg1.Name=Date time
|
||||||
FREEMARKER.FUNC.dateFormat.Arg2.Name=Format string
|
FREEMARKER.FUNC.dateFormat.Arg2.Name=Format string
|
||||||
|
FREEMARKER.FUNC.dateFormat.Arg3.Name=Locale
|
||||||
FREEMARKER.FUNC.clearHtmlTag.DESC=Use `${clearHtmlTag(ArticleContent)}` in template to clear html tag.
|
FREEMARKER.FUNC.clearHtmlTag.DESC=Use `${clearHtmlTag(ArticleContent)}` in template to clear html tag.
|
||||||
FREEMARKER.FUNC.clearHtmlTag.Arg1.Name=Html text
|
FREEMARKER.FUNC.clearHtmlTag.Arg1.Name=Html text
|
||||||
|
FREEMARKER.FUNC.getDomain.DESC=Get domain from url.
|
||||||
|
FREEMARKER.FUNC.groupBy.DESC=Group the list by the specified field of the list item.
|
||||||
|
FREEMARKER.FUNC.groupBy.Arg1.Name=List
|
||||||
|
FREEMARKER.FUNC.groupBy.Arg2.Name=The list item field name
|
||||||
|
|
||||||
FREEMARKER.ERR.MISSING_ATTR=The tag <@{0}> missing required attribute: {1}.
|
FREEMARKER.ERR.MISSING_ATTR=The tag <@{0}> missing required attribute: {1}.
|
||||||
FREEMARKER.ERR.INVALID_ATTR_TYPE=The tag <@{0}> attribute `{1}` must be {2}, but is: {3}.
|
FREEMARKER.ERR.INVALID_ATTR_TYPE=The tag <@{0}> attribute `{1}` must be {2}, but is: {3}.
|
||||||
@ -43,3 +48,4 @@ FREEMARKER.ERR.INVALID_ATTR_VALUE2=The tag <@{0}> attribute value `{1}` = `{2}`
|
|||||||
FREEMARKER.ERR.DUPLICATE_PAGE_FLAG=Template page flag is already activated.
|
FREEMARKER.ERR.DUPLICATE_PAGE_FLAG=Template page flag is already activated.
|
||||||
FREEMARKER.ERR.PAGE_INDEX_OUT_OF_BOUNDS=The page number `{0}` is out of bounds `{1}`.
|
FREEMARKER.ERR.PAGE_INDEX_OUT_OF_BOUNDS=The page number `{0}` is out of bounds `{1}`.
|
||||||
FREEMARKER.ERR.INVALID_FUNC_ARGUMENT=Invalid arg[{1}] of function '{0}()' is invalid: {2}。
|
FREEMARKER.ERR.INVALID_FUNC_ARGUMENT=Invalid arg[{1}] of function '{0}()' is invalid: {2}。
|
||||||
|
FREEMARKER.ERR.IncludeTemplateNotFound=Include template `{0}` not found.。
|
||||||
@ -33,8 +33,13 @@ FREEMARKER.FUNC.randomInt.Arg2.Name=隨機數範圍最大值
|
|||||||
FREEMARKER.FUNC.dateFormat.DESC=日期格式化,例如:`${dateFormat(content.publishDate,'yyyy-MM')}`
|
FREEMARKER.FUNC.dateFormat.DESC=日期格式化,例如:`${dateFormat(content.publishDate,'yyyy-MM')}`
|
||||||
FREEMARKER.FUNC.dateFormat.Arg1.Name=日期時間
|
FREEMARKER.FUNC.dateFormat.Arg1.Name=日期時間
|
||||||
FREEMARKER.FUNC.dateFormat.Arg2.Name=格式化字符串
|
FREEMARKER.FUNC.dateFormat.Arg2.Name=格式化字符串
|
||||||
|
FREEMARKER.FUNC.dateFormat.Arg3.Name=地區
|
||||||
FREEMARKER.FUNC.clearHtmlTag.DESC=清除Html標籤,例如:`${clearHtmlTag(ArticleContent)}`
|
FREEMARKER.FUNC.clearHtmlTag.DESC=清除Html標籤,例如:`${clearHtmlTag(ArticleContent)}`
|
||||||
FREEMARKER.FUNC.clearHtmlTag.Arg1.Name=待處理字符串
|
FREEMARKER.FUNC.clearHtmlTag.Arg1.Name=待處理字符串
|
||||||
|
FREEMARKER.FUNC.getDomain.DESC=提取URL的域名
|
||||||
|
FREEMARKER.FUNC.groupBy.DESC=將列表數據按列表項指定字段分組
|
||||||
|
FREEMARKER.FUNC.groupBy.Arg1.Name=列表數據
|
||||||
|
FREEMARKER.FUNC.groupBy.Arg2.Name=列表項字段名
|
||||||
|
|
||||||
FREEMARKER.ERR.MISSING_ATTR=標籤 <@{0}> 缺少必填屬性:{1}。
|
FREEMARKER.ERR.MISSING_ATTR=標籤 <@{0}> 缺少必填屬性:{1}。
|
||||||
FREEMARKER.ERR.INVALID_ATTR_TYPE=標籤 <@{0}> 屬性 `{1}` 類型必須是:{2}, 當前是: {3}。
|
FREEMARKER.ERR.INVALID_ATTR_TYPE=標籤 <@{0}> 屬性 `{1}` 類型必須是:{2}, 當前是: {3}。
|
||||||
@ -43,3 +48,4 @@ FREEMARKER.ERR.INVALID_ATTR_VALUE2=標籤 <@{0}> 屬性值 `{1}` = `{2}` 无效
|
|||||||
FREEMARKER.ERR.DUPLICATE_PAGE_FLAG=標籤分頁屬性`page`不能被多次設置為true。
|
FREEMARKER.ERR.DUPLICATE_PAGE_FLAG=標籤分頁屬性`page`不能被多次設置為true。
|
||||||
FREEMARKER.ERR.PAGE_INDEX_OUT_OF_BOUNDS=分頁頁碼`{0}`超出最大頁碼`{1}`。
|
FREEMARKER.ERR.PAGE_INDEX_OUT_OF_BOUNDS=分頁頁碼`{0}`超出最大頁碼`{1}`。
|
||||||
FREEMARKER.ERR.INVALID_FUNC_ARGUMENT=函數`{0}()`第{1}個參數錯誤:{2}。
|
FREEMARKER.ERR.INVALID_FUNC_ARGUMENT=函數`{0}()`第{1}個參數錯誤:{2}。
|
||||||
|
FREEMARKER.ERR.IncludeTemplateNotFound=引用模板`{0}`不存在。
|
||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-common</artifactId>
|
<artifactId>chestnut-common</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut</artifactId>
|
<artifactId>chestnut</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -39,7 +39,7 @@ public class MemberConfig implements WebMvcConfigurer {
|
|||||||
|
|
||||||
private final MemberProperties properties;
|
private final MemberProperties properties;
|
||||||
|
|
||||||
public MemberConfig(MemberProperties properties) throws FileNotFoundException {
|
public MemberConfig(MemberProperties properties) {
|
||||||
UPLOAD_DIRECTORY = properties.getUploadPath();
|
UPLOAD_DIRECTORY = properties.getUploadPath();
|
||||||
if (StringUtils.isEmpty(UPLOAD_DIRECTORY)) {
|
if (StringUtils.isEmpty(UPLOAD_DIRECTORY)) {
|
||||||
UPLOAD_DIRECTORY = SpringUtils.getAppParentDirectory() + "/_xy_member/";
|
UPLOAD_DIRECTORY = SpringUtils.getAppParentDirectory() + "/_xy_member/";
|
||||||
@ -47,7 +47,7 @@ public class MemberConfig implements WebMvcConfigurer {
|
|||||||
UPLOAD_DIRECTORY = StringUtils.appendIfMissing(FileExUtils.normalizePath(UPLOAD_DIRECTORY), "/");
|
UPLOAD_DIRECTORY = StringUtils.appendIfMissing(FileExUtils.normalizePath(UPLOAD_DIRECTORY), "/");
|
||||||
FileExUtils.mkdirs(UPLOAD_DIRECTORY);
|
FileExUtils.mkdirs(UPLOAD_DIRECTORY);
|
||||||
properties.setUploadPath(UPLOAD_DIRECTORY);
|
properties.setUploadPath(UPLOAD_DIRECTORY);
|
||||||
log.info("Member upload directory: " + UPLOAD_DIRECTORY);
|
log.info("Member upload directory: {}", UPLOAD_DIRECTORY);
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -39,6 +39,9 @@ public class MemberResourcePrefix extends FixedConfig {
|
|||||||
if (StringUtils.isEmpty(configValue)) {
|
if (StringUtils.isEmpty(configValue)) {
|
||||||
return BackendContext.getValue() + MemberConfig.getResourcePrefix();
|
return BackendContext.getValue() + MemberConfig.getResourcePrefix();
|
||||||
}
|
}
|
||||||
return StringUtils.appendIfMissing(configValue, "/");
|
if (StringUtils.isEmpty(configValue)) {
|
||||||
|
configValue = StringUtils.appendIfMissing(configValue, "/");
|
||||||
|
}
|
||||||
|
return configValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,14 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package com.chestnut.member.service.impl;
|
package com.chestnut.member.service.impl;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import org.springframework.boot.CommandLineRunner;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.chestnut.common.exception.CommonErrorCode;
|
import com.chestnut.common.exception.CommonErrorCode;
|
||||||
import com.chestnut.common.utils.Assert;
|
import com.chestnut.common.utils.Assert;
|
||||||
@ -34,8 +26,15 @@ import com.chestnut.member.level.ILevelType;
|
|||||||
import com.chestnut.member.level.LevelManager;
|
import com.chestnut.member.level.LevelManager;
|
||||||
import com.chestnut.member.mapper.MemberLevelConfigMapper;
|
import com.chestnut.member.mapper.MemberLevelConfigMapper;
|
||||||
import com.chestnut.member.service.IMemberLevelConfigService;
|
import com.chestnut.member.service.IMemberLevelConfigService;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.boot.CommandLineRunner;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Service
|
@Service
|
||||||
@ -44,7 +43,7 @@ public class MemberLevelConfigServiceImpl extends ServiceImpl<MemberLevelConfigM
|
|||||||
|
|
||||||
private final Map<String, ILevelType> levelTypes;
|
private final Map<String, ILevelType> levelTypes;
|
||||||
|
|
||||||
private Map<String, LevelManager> levelManagerMap = new HashMap<>();
|
private static final Map<String, LevelManager> levelManagerMap = new HashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addLevelConfig(LevelConfigDTO dto) {
|
public void addLevelConfig(LevelConfigDTO dto) {
|
||||||
@ -87,9 +86,10 @@ public class MemberLevelConfigServiceImpl extends ServiceImpl<MemberLevelConfigM
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void deleteLevelConfig(List<Long> configIds) {
|
public void deleteLevelConfig(List<Long> configIds) {
|
||||||
List<MemberLevelConfig> list = this.listByIds(configIds);
|
List<MemberLevelConfig> list = this.listByIds(configIds);
|
||||||
if (list.size() > 0) {
|
if (!list.isEmpty()) {
|
||||||
this.removeByIds(list);
|
this.removeByIds(list);
|
||||||
|
|
||||||
ILevelType levelType = this.getLevelType(list.get(0).getLevelType());
|
ILevelType levelType = this.getLevelType(list.get(0).getLevelType());
|
||||||
@ -101,7 +101,7 @@ public class MemberLevelConfigServiceImpl extends ServiceImpl<MemberLevelConfigM
|
|||||||
List<MemberLevelConfig> list = this.lambdaQuery().eq(MemberLevelConfig::getLevelType, levelType.getId())
|
List<MemberLevelConfig> list = this.lambdaQuery().eq(MemberLevelConfig::getLevelType, levelType.getId())
|
||||||
.orderByAsc(MemberLevelConfig::getLevel).list();
|
.orderByAsc(MemberLevelConfig::getLevel).list();
|
||||||
LevelManager levelManager = this.getLevelManager(levelType);
|
LevelManager levelManager = this.getLevelManager(levelType);
|
||||||
if (list.size() > 0) {
|
if (!list.isEmpty()) {
|
||||||
levelManager.resetLevelConfigs(
|
levelManager.resetLevelConfigs(
|
||||||
list.stream().collect(Collectors.toMap(MemberLevelConfig::getLevel, conf -> conf)));
|
list.stream().collect(Collectors.toMap(MemberLevelConfig::getLevel, conf -> conf)));
|
||||||
}
|
}
|
||||||
@ -114,11 +114,11 @@ public class MemberLevelConfigServiceImpl extends ServiceImpl<MemberLevelConfigM
|
|||||||
}
|
}
|
||||||
|
|
||||||
private LevelManager getLevelManager(ILevelType levelType) {
|
private LevelManager getLevelManager(ILevelType levelType) {
|
||||||
LevelManager levelManager = this.levelManagerMap.get(levelType.getId());
|
LevelManager levelManager = levelManagerMap.get(levelType.getId());
|
||||||
if (levelManager == null) {
|
if (levelManager == null) {
|
||||||
levelManager = new LevelManager();
|
levelManager = new LevelManager();
|
||||||
levelManager.setLevelType(levelType);
|
levelManager.setLevelType(levelType);
|
||||||
this.levelManagerMap.put(levelType.getId(), levelManager);
|
levelManagerMap.put(levelType.getId(), levelManager);
|
||||||
}
|
}
|
||||||
return levelManager;
|
return levelManager;
|
||||||
}
|
}
|
||||||
@ -137,6 +137,6 @@ public class MemberLevelConfigServiceImpl extends ServiceImpl<MemberLevelConfigM
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run(String... args) throws Exception {
|
public void run(String... args) throws Exception {
|
||||||
levelTypes.values().forEach(levelType -> onLevelConfigChange(levelType));
|
levelTypes.values().forEach(this::onLevelConfigChange);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>chestnut-monitor</artifactId>
|
<artifactId>chestnut-monitor</artifactId>
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>chestnut-modules</artifactId>
|
<artifactId>chestnut-modules</artifactId>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut</artifactId>
|
<artifactId>chestnut</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ChestnutCMS",
|
"name": "ChestnutCMS",
|
||||||
"version": "1.5.1",
|
"version": "1.5.2",
|
||||||
"description": "ChestnutCMS[栗子内容管理系统]",
|
"description": "ChestnutCMS[栗子内容管理系统]",
|
||||||
"author": "兮玥 - 190785909@qq.com",
|
"author": "兮玥 - 190785909@qq.com",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
|||||||
@ -35,7 +35,7 @@
|
|||||||
@row-dblclick="handleRowDblclick"
|
@row-dblclick="handleRowDblclick"
|
||||||
style="width:100%;line-height: normal;">
|
style="width:100%;line-height: normal;">
|
||||||
<el-table-column type="index" :label="$t('Common.RowNo')" width="50" />
|
<el-table-column type="index" :label="$t('Common.RowNo')" width="50" />
|
||||||
<el-table-column :label="$t('CMS.Site.Name')" align="center" prop="name">
|
<el-table-column :label="$t('CMS.Site.Name')" prop="name">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<div slot="reference" class="name-wrapper">
|
<div slot="reference" class="name-wrapper">
|
||||||
<el-tag v-if="scope.row.siteId==currentSite" size="medium">{{ scope.row.name }}</el-tag>
|
<el-tag v-if="scope.row.siteId==currentSite" size="medium">{{ scope.row.name }}</el-tag>
|
||||||
@ -43,7 +43,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="URL" align="center" width="300" prop="url" />
|
<el-table-column :label="$t('CMS.Site.Path')" width="260" prop="path" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<pagination
|
<pagination
|
||||||
v-show="total>0"
|
v-show="total>0"
|
||||||
|
|||||||
@ -935,6 +935,9 @@ export default {
|
|||||||
SitemapProgressTitle: "Generate sitemap task",
|
SitemapProgressTitle: "Generate sitemap task",
|
||||||
Domain: "URL",
|
Domain: "URL",
|
||||||
UEditorCss: "UEditor CSS",
|
UEditorCss: "UEditor CSS",
|
||||||
|
PrefixMode: "Prefix Mode",
|
||||||
|
PrefixMode_Absolute: "Absolute",
|
||||||
|
PrefixMode_Relative: "Relative",
|
||||||
Tab: {
|
Tab: {
|
||||||
Basic: "Basic Information",
|
Basic: "Basic Information",
|
||||||
Extend: "Extend Config",
|
Extend: "Extend Config",
|
||||||
@ -1003,7 +1006,8 @@ export default {
|
|||||||
SEO: "SEO Configuration",
|
SEO: "SEO Configuration",
|
||||||
BaiduPushAccessSecret: "Baidu Push API Secret",
|
BaiduPushAccessSecret: "Baidu Push API Secret",
|
||||||
DownloadRemoteImage: "Enable Download Remote Image",
|
DownloadRemoteImage: "Enable Download Remote Image",
|
||||||
EnableSiteDeleteBackup: "Enable Site Delete Backup"
|
EnableSiteDeleteBackup: "Enable Site Delete Backup",
|
||||||
|
MemberResourceUrl: "Member Resource Domain",
|
||||||
},
|
},
|
||||||
Property: {
|
Property: {
|
||||||
QueryPlaceholder: "Input name/code",
|
QueryPlaceholder: "Input name/code",
|
||||||
@ -1826,7 +1830,10 @@ export default {
|
|||||||
Location: "Location",
|
Location: "Location",
|
||||||
Source: "Source",
|
Source: "Source",
|
||||||
ClientType: "Client Type",
|
ClientType: "Client Type",
|
||||||
LogTime: "Time"
|
LogTime: "Time",
|
||||||
|
Placeholder: {
|
||||||
|
Word: "Input search word"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
WordStat: {
|
WordStat: {
|
||||||
TabName: "Query Statistics",
|
TabName: "Query Statistics",
|
||||||
@ -1908,9 +1915,36 @@ export default {
|
|||||||
ConfirmApply: "Are you sure to apply for the certificate?",
|
ConfirmApply: "Are you sure to apply for the certificate?",
|
||||||
Applying: "Waiting for certificate application...",
|
Applying: "Waiting for certificate application...",
|
||||||
Authroizating: "Authorizating...",
|
Authroizating: "Authorizating...",
|
||||||
|
Servers: "Synchronize to server",
|
||||||
Placeholder: {
|
Placeholder: {
|
||||||
Domain: "Input domain..."
|
Domain: "Input domain..."
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
ServerMachine: {
|
||||||
|
Name: "Server Name",
|
||||||
|
RemoteAddress: "Remote Addr.",
|
||||||
|
Host: "Host",
|
||||||
|
Port: "Port",
|
||||||
|
UserName: "Username",
|
||||||
|
KeyFile: "Login Key",
|
||||||
|
Passphrase: "Passphrase",
|
||||||
|
AddTitle: "Add Server",
|
||||||
|
EditTitle: "Eidt Server",
|
||||||
|
TestConnection: "Test Connection",
|
||||||
|
ConnectionSuccess: "Connect Success",
|
||||||
|
TestConnectionLoading: "Connecting...",
|
||||||
|
},
|
||||||
|
NginxConfig: {
|
||||||
|
Name: "Name",
|
||||||
|
Code: "Code",
|
||||||
|
Type: "Type",
|
||||||
|
ConfigText: "Configure",
|
||||||
|
Status: "Status",
|
||||||
|
Sync: "Synchronize to server",
|
||||||
|
ConfirmSync: "Are you sure to sync the config `{0}` to deploy servers?",
|
||||||
|
NginxNode: "Deploy Servers",
|
||||||
|
AddTitle: "Add nginx config",
|
||||||
|
EditTitle: "Edit nginx config",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -935,6 +935,9 @@ export default {
|
|||||||
SitemapProgressTitle: "生成Sitemap任务",
|
SitemapProgressTitle: "生成Sitemap任务",
|
||||||
Domain: "站点域名",
|
Domain: "站点域名",
|
||||||
UEditorCss: "文章编辑器CSS",
|
UEditorCss: "文章编辑器CSS",
|
||||||
|
PrefixMode: "路径模式",
|
||||||
|
PrefixMode_Absolute: "绝对路径",
|
||||||
|
PrefixMode_Relative: "相对路径",
|
||||||
Tab: {
|
Tab: {
|
||||||
Basic: "基础信息",
|
Basic: "基础信息",
|
||||||
Extend: "扩展配置",
|
Extend: "扩展配置",
|
||||||
@ -1003,7 +1006,8 @@ export default {
|
|||||||
SEO: "搜索引擎优化配置",
|
SEO: "搜索引擎优化配置",
|
||||||
BaiduPushAccessSecret: "百度收录API秘钥",
|
BaiduPushAccessSecret: "百度收录API秘钥",
|
||||||
DownloadRemoteImage: "开启文章远程图片下载",
|
DownloadRemoteImage: "开启文章远程图片下载",
|
||||||
EnableSiteDeleteBackup: "开启站点删除备份"
|
EnableSiteDeleteBackup: "开启站点删除备份",
|
||||||
|
MemberResourceUrl: "会员资源访问域名",
|
||||||
},
|
},
|
||||||
Property: {
|
Property: {
|
||||||
QueryPlaceholder: "输入名称/编码查询",
|
QueryPlaceholder: "输入名称/编码查询",
|
||||||
@ -1911,9 +1915,36 @@ export default {
|
|||||||
ConfirmApply: "确认发起证书申请吗?",
|
ConfirmApply: "确认发起证书申请吗?",
|
||||||
Applying: "正在提交证书申请,请稍等...",
|
Applying: "正在提交证书申请,请稍等...",
|
||||||
Authroizating: "正在验证,请稍等...",
|
Authroizating: "正在验证,请稍等...",
|
||||||
|
Servers: "同步服务器",
|
||||||
Placeholder: {
|
Placeholder: {
|
||||||
Domain: "输入域名查询"
|
Domain: "输入域名查询"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
ServerMachine: {
|
||||||
|
Name: "服务器名称",
|
||||||
|
RemoteAddress: "服务器地址",
|
||||||
|
Host: "域名/IP地址",
|
||||||
|
Port: "端口",
|
||||||
|
UserName: "登录用户名",
|
||||||
|
KeyFile: "登录秘钥",
|
||||||
|
Passphrase: "秘钥密码",
|
||||||
|
AddTitle: "添加服务器信息",
|
||||||
|
EditTitle: "编辑服务器信息",
|
||||||
|
TestConnection: "测试连接",
|
||||||
|
ConnectionSuccess: "连接成功",
|
||||||
|
TestConnectionLoading: "正在尝试链接..."
|
||||||
|
},
|
||||||
|
NginxConfig: {
|
||||||
|
Name: "名称",
|
||||||
|
Code: "编码",
|
||||||
|
Type: "类型",
|
||||||
|
ConfigText: "自定义配置",
|
||||||
|
Status: "状态",
|
||||||
|
Sync: "同步配置",
|
||||||
|
ConfirmSync: "确认将配置`{0}`同步到关联服务器节点吗?",
|
||||||
|
NginxNode: "部署节点",
|
||||||
|
AddTitle: "添加配置",
|
||||||
|
EditTitle: "编辑配置信息",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -935,6 +935,9 @@ export default {
|
|||||||
SitemapProgressTitle: "生成Sitemap任務",
|
SitemapProgressTitle: "生成Sitemap任務",
|
||||||
Domain: "站點域名",
|
Domain: "站點域名",
|
||||||
UEditorCss: "文章編輯器CSS",
|
UEditorCss: "文章編輯器CSS",
|
||||||
|
PrefixMode: "路徑模式",
|
||||||
|
PrefixMode_Absolute: "絕對路徑",
|
||||||
|
PrefixMode_Relative: "相對路徑",
|
||||||
Tab: {
|
Tab: {
|
||||||
Basic: "基礎資訊",
|
Basic: "基礎資訊",
|
||||||
Extend: "擴展配置",
|
Extend: "擴展配置",
|
||||||
@ -1003,7 +1006,8 @@ export default {
|
|||||||
SEO: "搜索引擎優化配置",
|
SEO: "搜索引擎優化配置",
|
||||||
BaiduPushAccessSecret: "百度收錄API秘鑰",
|
BaiduPushAccessSecret: "百度收錄API秘鑰",
|
||||||
DownloadRemoteImage: "開啟文章遠程圖片下載",
|
DownloadRemoteImage: "開啟文章遠程圖片下載",
|
||||||
EnableSiteDeleteBackup: "開啟站點刪除備份"
|
EnableSiteDeleteBackup: "開啟站點刪除備份",
|
||||||
|
MemberResourceUrl: "會員資源訪問域名",
|
||||||
},
|
},
|
||||||
Property: {
|
Property: {
|
||||||
QueryPlaceholder: "輸入名稱/編碼查詢",
|
QueryPlaceholder: "輸入名稱/編碼查詢",
|
||||||
@ -1827,6 +1831,9 @@ export default {
|
|||||||
Source: "來源",
|
Source: "來源",
|
||||||
ClientType: "客戶端",
|
ClientType: "客戶端",
|
||||||
LogTime: "搜索時間",
|
LogTime: "搜索時間",
|
||||||
|
Placeholder: {
|
||||||
|
Word: "輸入搜索詞查詢"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
WordStat: {
|
WordStat: {
|
||||||
TabName: "搜索詞",
|
TabName: "搜索詞",
|
||||||
@ -1908,9 +1915,36 @@ export default {
|
|||||||
ConfirmApply: "確認發起證書申請嗎?",
|
ConfirmApply: "確認發起證書申請嗎?",
|
||||||
Applying: "正在提交證書申請,請稍等...",
|
Applying: "正在提交證書申請,請稍等...",
|
||||||
Authroizating: "正在驗證,請稍等...",
|
Authroizating: "正在驗證,請稍等...",
|
||||||
|
Servers: "同步服務器",
|
||||||
Placeholder: {
|
Placeholder: {
|
||||||
Domain: "輸入域名查詢"
|
Domain: "輸入域名查詢"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
ServerMachine: {
|
||||||
|
Name: "服务器名称",
|
||||||
|
RemoteAddress: "服务器地址",
|
||||||
|
Host: "域名/IP地址",
|
||||||
|
Port: "端口",
|
||||||
|
UserName: "登录用户名",
|
||||||
|
KeyFile: "登录秘钥",
|
||||||
|
Passphrase: "秘钥密码",
|
||||||
|
AddTitle: "添加服务器信息",
|
||||||
|
EditTitle: "编辑服务器信息",
|
||||||
|
TestConnection: "测试连接",
|
||||||
|
ConnectionSuccess: "连接成功",
|
||||||
|
TestConnectionLoading: "正在尝试链接...",
|
||||||
|
},
|
||||||
|
NginxConfig: {
|
||||||
|
Name: "名稱",
|
||||||
|
Code: "編碼",
|
||||||
|
Type: "類型",
|
||||||
|
ConfigText: "自定義配置",
|
||||||
|
Status: "狀態",
|
||||||
|
Sync: "同步配置",
|
||||||
|
ConfirmSync: "確認將配置`{0}`同步到關聯服務器節點嗎?",
|
||||||
|
NginxNode: "部署節點",
|
||||||
|
AddTitle: "添加配置",
|
||||||
|
EditTitle: "編輯配置信息",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -177,7 +177,7 @@
|
|||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('CMS.Catalog.Desc')" prop="description">
|
<el-form-item :label="$t('CMS.Catalog.Desc')" prop="description">
|
||||||
<el-input v-model="form_info.description" type="textarea" maxlength="100" />
|
<el-input v-model="form_info.description" type="textarea" maxlength="250" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('CMS.Catalog.ContentPathRule')" prop="detailNameRule">
|
<el-form-item :label="$t('CMS.Catalog.ContentPathRule')" prop="detailNameRule">
|
||||||
<el-select v-model="form_info.detailNameRule" :placeholder="$t('CMS.Catalog.ContentPathRule')">
|
<el-select v-model="form_info.detailNameRule" :placeholder="$t('CMS.Catalog.ContentPathRule')">
|
||||||
|
|||||||
@ -80,7 +80,7 @@
|
|||||||
<el-col class="pr10">
|
<el-col class="pr10">
|
||||||
<el-card shadow="always" class="card-title">
|
<el-card shadow="always" class="card-title">
|
||||||
<div class="art-title bg-purple-white">
|
<div class="art-title bg-purple-white">
|
||||||
<el-form-item :label="$t('CMS.Content.Title')" prop="title">
|
<el-form-item :label="$t('CMS.Content.Title')" prop="title" style="margin-bottom: 18px;">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.title"
|
v-model="form.title"
|
||||||
maxlength="360"
|
maxlength="360"
|
||||||
|
|||||||
@ -85,6 +85,9 @@
|
|||||||
<el-form-item :label="$t('CMS.Site.Extend.SiteApiUrl')" prop="SiteApiUrl">
|
<el-form-item :label="$t('CMS.Site.Extend.SiteApiUrl')" prop="SiteApiUrl">
|
||||||
<el-input v-model="form_extend.SiteApiUrl" placeholder="http(s)://"></el-input>
|
<el-input v-model="form_extend.SiteApiUrl" placeholder="http(s)://"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('CMS.Site.Extend.MemberResourceUrl')" prop="MemberResourceUrl">
|
||||||
|
<el-input v-model="form_extend.MemberResourceUrl" placeholder="http(s)://"></el-input>
|
||||||
|
</el-form-item>
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<div slot="header" class="clearfix">
|
<div slot="header" class="clearfix">
|
||||||
|
|||||||
@ -177,6 +177,12 @@
|
|||||||
>{{ $t("Common.Select") }}</el-button>
|
>{{ $t("Common.Select") }}</el-button>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('CMS.Site.PrefixMode')">
|
||||||
|
<el-radio-group v-model="pp.props.PrefixMode">
|
||||||
|
<el-radio-button label="absolute">{{ $t('CMS.Site.PrefixMode_Absolute') }}</el-radio-button>
|
||||||
|
<el-radio-button label="relative">{{ $t('CMS.Site.PrefixMode_Relative') }}</el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
<div v-else style="background-color: #f4f4f5;color: #909399;font-size:12px;line-height: 30px;padding-left:10px;">
|
<div v-else style="background-color: #f4f4f5;color: #909399;font-size:12px;line-height: 30px;padding-left:10px;">
|
||||||
|
|||||||
@ -100,7 +100,7 @@
|
|||||||
<el-table-column
|
<el-table-column
|
||||||
:label="$t('Common.Operation')"
|
:label="$t('Common.Operation')"
|
||||||
align="right"
|
align="right"
|
||||||
width="350"
|
width="380"
|
||||||
class-name="small-padding fixed-width">
|
class-name="small-padding fixed-width">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button
|
<el-button
|
||||||
@ -167,7 +167,7 @@
|
|||||||
</el-option>
|
</el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('CMS.CustomForm.NeedCaptcha')" prop="needCaptcha">
|
<!-- <el-form-item :label="$t('CMS.CustomForm.NeedCaptcha')" prop="needCaptcha">
|
||||||
<el-switch
|
<el-switch
|
||||||
v-model="form.needCaptcha"
|
v-model="form.needCaptcha"
|
||||||
active-value="Y"
|
active-value="Y"
|
||||||
@ -180,7 +180,7 @@
|
|||||||
active-value="Y"
|
active-value="Y"
|
||||||
inactive-value="N"
|
inactive-value="N"
|
||||||
></el-switch>
|
></el-switch>
|
||||||
</el-form-item>
|
</el-form-item> -->
|
||||||
<el-form-item v-if="form.needLogin=='N'" :label="$t('CMS.CustomForm.RuleLimit')" prop="ruleLimit">
|
<el-form-item v-if="form.needLogin=='N'" :label="$t('CMS.CustomForm.RuleLimit')" prop="ruleLimit">
|
||||||
<el-select v-model="form.ruleLimit">
|
<el-select v-model="form.ruleLimit">
|
||||||
<el-option
|
<el-option
|
||||||
|
|||||||
4
pom.xml
4
pom.xml
@ -4,14 +4,14 @@
|
|||||||
|
|
||||||
<groupId>com.chestnut</groupId>
|
<groupId>com.chestnut</groupId>
|
||||||
<artifactId>chestnut</artifactId>
|
<artifactId>chestnut</artifactId>
|
||||||
<version>1.5.1</version>
|
<version>1.5.2</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<name>ChestnutCMS</name>
|
<name>ChestnutCMS</name>
|
||||||
<description>栗子内容管理系统</description>
|
<description>栗子内容管理系统</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<chestnut.version>1.5.1</chestnut.version>
|
<chestnut.version>1.5.2</chestnut.version>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<java.version>17</java.version>
|
<java.version>17</java.version>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user