Compare commits

...

10 Commits

Author SHA1 Message Date
曾文豪
ffc7220944 publish 2.0.17-test2
All checks were successful
/ local-deploy (push) Successful in 20s
2025-08-20 16:01:01 +08:00
曾文豪
411969192f publish 2.0.17-test
All checks were successful
/ local-deploy (push) Successful in 25s
2025-08-20 15:29:46 +08:00
曾文豪
2cf88cefa7 publish 2.0.17
All checks were successful
/ local-deploy (push) Successful in 20s
2024-12-08 12:00:48 +08:00
曾文豪
9a56994342 publish 2.0.16
All checks were successful
/ local-deploy (push) Successful in 20s
2024-12-08 11:53:36 +08:00
曾文豪
a987689bd6 perf:优化登录次数校验 2024-12-08 11:53:11 +08:00
曾文豪
690dffa779 publish 2.0.15
All checks were successful
/ local-deploy (push) Successful in 18s
2024-12-08 10:23:38 +08:00
曾文豪
3ccbd6cd8e feat:configKey增加缓存 2024-12-08 10:22:44 +08:00
曾文豪
89e0c5d1d5 publish 2.0.14
All checks were successful
/ local-deploy (push) Successful in 21s
2024-11-21 15:22:36 +08:00
曾文豪
b15dbc6d4c perf:调整表结构 2024-11-21 15:21:58 +08:00
曾文豪
2f6b5b0b05 perf:更改一个方法的名称 2024-10-28 09:24:38 +08:00
27 changed files with 187 additions and 81 deletions

View File

@@ -1,17 +0,0 @@
stages:
- deploy
deploy-jar:
stage: deploy
tags:
- zengos
rules:
- if: $CI_COMMIT_TAG
script:
- mvn clean deploy -Dmaven.test.skip -DaltDeploymentRepository=master::default::file:$TAG_REPO_FOLDER
- cd $TAG_REPO_FOLDER
- git checkout master
- git pull
- git add .
- git commit -m "deploy $CI_PROJECT_NAME $CI_COMMIT_TAG"
- git push origin master

18
pom.xml
View File

@@ -6,7 +6,7 @@
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
<packaging>pom</packaging>
<name>springboot-parent</name>
<description>杭州铁晟科技有限公司基础依赖</description>
@@ -58,49 +58,49 @@
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-database</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-login</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-web</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-util</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-platform</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-message</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-role</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-annotation</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</dependency>
<dependency>

View File

@@ -6,11 +6,11 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</parent>
<artifactId>springboot-ademo</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>

View File

@@ -67,7 +67,7 @@ public class TestController {
@RequestMapping("/index")
@TokenIgnore
public void index(HttpServletResponse response) {
globalConfig.redirect("mobile", "/test", response);
globalConfig.redirectWithVer("mobile", "/test", response);
}
@RequestMapping("/redirect")
@@ -75,7 +75,8 @@ public class TestController {
@RoleAuthority("redirect")
public ApiResp<JsonTest> redirect(HttpServletResponse response) {
encryptConfig.passwdCreate("111111@Zz", "");
String s1 = encryptConfig.passwdCreate("qU3?wE3{bX", "");
LogFactory.get().info(s1);
JsonTest jsonTest = new JsonTest();
jsonTest.setNow(DateUtil.date());

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</parent>
<artifactId>springboot-annotation</artifactId>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</parent>
<artifactId>springboot-database</artifactId>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</parent>
<artifactId>springboot-login</artifactId>

View File

@@ -170,7 +170,7 @@ public class LoginController {
extra = "";
}
String configUrl = globalConfig.buildPath("/login/wxmp/oauth2/" + service + "?extra=" + extra);
String authorizationUrl = platformWxmpConfig.buildAuthorizationUrl(service, configUrl, "snsapi_userinfo");
String authorizationUrl = platformWxmpConfig.buildAuthorizationUrl(service, configUrl);
response.sendRedirect(authorizationUrl);
}

View File

@@ -43,9 +43,12 @@ public class CorePlatformUniqueService extends TsServiceBase<CorePlatformUniqueM
*/
public TokenBean login(DoLoginInfo loginInfo) {
int loginErrorTimes = coreLogLoginMapper.getLoginErrorTimes(loginInfo.getLoginIp());
if (loginErrorTimes > 4) {
throw new ApiException("登录失败已达5次请10分钟后再试");
int loginErrorTimes = tsLoginConfigurer.getLoginErrorTimes();
if (loginErrorTimes > 0) {
int currentErrorTimes = coreLogLoginMapper.getLoginErrorTimes(loginInfo.getLoginIp());
if (currentErrorTimes >= loginErrorTimes) {
throw new ApiException("登录失败已达" + loginErrorTimes + "请10分钟后再试");
}
}
CorePlatformUnique platformUnique = getOneByColumn("unique_id", loginInfo.getUnique());

View File

@@ -36,7 +36,7 @@ public interface TsLoginConfigurer {
/**
* 登录失败的时候
*/
default void onLoginError(String to,HttpServletResponse response) {
default void onLoginError(String to, HttpServletResponse response) {
ServletKit.write(response, "404", "text");
}
@@ -66,4 +66,14 @@ public interface TsLoginConfigurer {
*/
RequestUserInfo getCurrentUserName(TokenBean userId);
/**
* 获取登录失败的次数默认5次
*
* @return
*/
default int getLoginErrorTimes() {
return 0;
}
}

View File

@@ -17,7 +17,8 @@ CREATE TABLE `core_log_login`
`address` varchar(255) DEFAULT NULL COMMENT 'ip地址',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='日志-登录';
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT ='日志-登录';
-- ----------------------------
-- Table structure for core_platform_unique
@@ -35,6 +36,7 @@ CREATE TABLE `core_platform_unique`
`info` text COMMENT '其他参数',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='平台-唯一值';
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT ='平台-唯一值';
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</parent>
<artifactId>springboot-message</artifactId>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</parent>
<artifactId>springboot-platform</artifactId>

View File

@@ -19,6 +19,7 @@ import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* @author hao
@@ -122,12 +123,12 @@ public class PlatformWxmpConfig {
*
* @return
*/
public String buildAuthorizationUrl(String service, String redirectUrl, String scope) {
public String buildAuthorizationUrl(String service, String redirectUrl) {
WxConfigBean configBean = getConfigBean(service);
return "https://open.weixin.qq.com/connect/oauth2/authorize"
+ "?appid=" + configBean.getAppId()
+ "&redirect_uri=" + URLUtil.encodeAll(redirectUrl)
+ "&response_type=code&scope=" + scope
+ "&response_type=code&scope=" + configBean.getScope()
+ "&state=STATE#wechat_redirect";
}
@@ -141,7 +142,15 @@ public class PlatformWxmpConfig {
public WxUserInfo getOAuth2AccessToken(String service, String code) {
WxConfigBean configBean = getConfigBean(service);
WxOAuth2AccessToken wxOAuth2AccessToken = WxOAuth2AccessToken.create(configBean.getAppId(), configBean.getAppSecret(), code);
WxUserInfo wxUserInfo = WxUserInfo.create(wxOAuth2AccessToken);
WxUserInfo wxUserInfo = null;
if (Objects.equals(configBean.getScope(), "snsapi_userinfo")) {
wxUserInfo = WxUserInfo.create(wxOAuth2AccessToken);
} else {
wxUserInfo = new WxUserInfo();
wxUserInfo.setOpenid(wxOAuth2AccessToken.getOpenid());
wxUserInfo.setRealUser(wxOAuth2AccessToken.isRealUser());
}
wxUserInfo.setAppId(configBean.getAppId());
return wxUserInfo;
}
@@ -162,7 +171,8 @@ public class PlatformWxmpConfig {
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public Map<String, WxConfigBean> getConfigs() {
return configs;

View File

@@ -7,10 +7,12 @@ public class WxConfigBean {
private String appId;
private String appSecret;
private String scope = "snsapi_userinfo";
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public String getAppId() {
return appId;
@@ -27,4 +29,12 @@ public class WxConfigBean {
public void setAppSecret(String appSecret) {
this.appSecret = appSecret;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
}

View File

@@ -11,6 +11,7 @@ public class WxOAuth2AccessToken {
private String accessToken;
private String openid;
private String isSnapshotuser;
public static WxOAuth2AccessToken create(String appId, String secret, String code) {
String response = OkHttpUtil.get("https://api.weixin.qq.com/sns/oauth2/access_token" +
@@ -23,10 +24,20 @@ public class WxOAuth2AccessToken {
return oAuth2AccessToken;
}
/**
* 是否是真实用户
*
* @return
*/
public boolean isRealUser() {
return !"1".equals(isSnapshotuser);
}
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public String getAccessToken() {
return accessToken;
@@ -43,4 +54,12 @@ public class WxOAuth2AccessToken {
public void setOpenid(String openid) {
this.openid = openid;
}
public String getIsSnapshotuser() {
return isSnapshotuser;
}
public void setIsSnapshotuser(String isSnapshotuser) {
this.isSnapshotuser = isSnapshotuser;
}
}

View File

@@ -17,6 +17,7 @@ public class WxUserInfo {
private String headimgurl;
private String openid;
private String appId;
private boolean isRealUser;
///////////////////////////////////////////////////////////////////////////
// 逻辑方法
@@ -33,13 +34,16 @@ public class WxUserInfo {
String s = OkHttpUtil.get("https://api.weixin.qq.com/sns/userinfo"
+ "?access_token=" + oAuth2AccessToken.getAccessToken()
+ "&openid=" + oAuth2AccessToken.getOpenid() + "&lang=zh_CN");
return JSON.parseObject(s, WxUserInfo.class);
WxUserInfo wxUserInfo = JSON.parseObject(s, WxUserInfo.class);
wxUserInfo.setRealUser(oAuth2AccessToken.isRealUser());
return wxUserInfo;
}
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public String getAccessToken() {
return accessToken;
@@ -112,4 +116,12 @@ public class WxUserInfo {
public void setAppId(String appId) {
this.appId = appId;
}
public boolean isRealUser() {
return isRealUser;
}
public void setRealUser(boolean realUser) {
isRealUser = realUser;
}
}

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</parent>
<artifactId>springboot-role</artifactId>

View File

@@ -24,6 +24,7 @@ create table core_role_authority
ext3 varchar(500) null comment '扩展3'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
comment '角色-权限';
create table core_role_group
@@ -43,6 +44,7 @@ create table core_role_group
ext3 varchar(500) null comment '扩展3'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
comment '角色-分组';
create table core_role_group_rx
@@ -56,6 +58,7 @@ create table core_role_group_rx
menu_id varchar(50) not null comment '菜单id'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
comment '角色-分组-关系';
create table core_role_server
@@ -76,6 +79,7 @@ create table core_role_server
ext3 varchar(500) null comment '扩展3'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
comment '角色-服务';
create table core_role_user
@@ -94,6 +98,7 @@ create table core_role_user
ext3 varchar(500) null comment '扩展3'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
comment '角色-用户';
alter table core_role_authority

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</parent>
<artifactId>springboot-util</artifactId>

View File

@@ -95,12 +95,13 @@ public class GlobalConfig {
/**
* 重定向
* 构建待版本号的路径
*
* @param htmlDir 资源目录
* @param htmlDir
* @param route
* @return
*/
public void redirect(String htmlDir, String route, HttpServletResponse response) {
public String buildByVersion(String htmlDir, String route) {
if (!StrUtil.endWith(htmlDir, "/")) {
htmlDir = htmlDir + "/";
}
@@ -129,16 +130,32 @@ public class GlobalConfig {
throw new ApiException("无法重定向,请检查资源");
}
CollUtil.sort(versions, (o1, o2) -> -VersionComparator.INSTANCE.compare(o1, o2));
String path = buildPath(String.format("/%s%s/index.html#%s", htmlDir, versions.get(0), route));
response.sendRedirect(path);
return buildPath(String.format("/%s%s/index.html#%s", htmlDir, versions.get(0), route));
} catch (IOException e) {
LogFactory.get().info(e);
}
return "";
}
/**
* 重定向
*
* @param htmlDir 资源目录
* @param route
*/
public void redirectWithVer(String htmlDir, String route, HttpServletResponse response) {
try {
response.sendRedirect(buildByVersion(htmlDir, route));
} catch (Exception ignored) {
}
}
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public String getUploadDir() {

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.13</version>
<version>2.0.17-test2</version>
</parent>
<artifactId>springboot-web</artifactId>

View File

@@ -4,7 +4,6 @@ package com.tiesheng.web.controller.system;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tiesheng.annotation.role.RoleAuthority;
import com.tiesheng.util.exception.ApiException;
import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.util.pojos.PageDTO;
import com.tiesheng.web.pojos.dao.CoreConfigSystem;
@@ -57,21 +56,8 @@ public class ConfigSystemController {
*/
@PostMapping("/system/update")
public ApiResp<String> systemUpdate(@RequestBody ConfigSystemDTO dto) {
CoreConfigSystem configKey = coreConfigService.getOneByColumn("config_key", dto.getConfigKey());
if (configKey == null) {
throw new ApiException("该配置不存在,请检查");
}
if (configKey.getReadOnly() == 1) {
throw new ApiException("该配置只读,不可修改");
}
configKey.setConfigVal(dto.getConfigVal());
configKey.setRemark(dto.getRemark());
configKey.setExtra(dto.getExtra());
tieshengWebConfigurer.configSystemCheck(configKey);
coreConfigService.updateById(configKey);
tieshengWebConfigurer.configSystemCheck(dto);
coreConfigService.updateConfigSystem(dto);
return ApiResp.respOK("");
}

View File

@@ -1,12 +1,17 @@
package com.tiesheng.web.service;
import com.tiesheng.util.exception.ApiException;
import com.tiesheng.util.service.TsCacheService;
import com.tiesheng.util.service.TsServiceBase;
import com.tiesheng.web.mapper.CoreConfigEnumMapper;
import com.tiesheng.web.mapper.CoreConfigSystemMapper;
import com.tiesheng.web.pojos.dao.CoreConfigSystem;
import com.tiesheng.util.service.TsServiceBase;
import com.tiesheng.web.pojos.dto.config.ConfigSystemDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author hao
*/
@@ -15,6 +20,11 @@ public class CoreConfigService extends TsServiceBase<CoreConfigSystemMapper, Cor
@Autowired
CoreConfigEnumMapper coreConfigEnumMapper;
@Resource
TsCacheService tsCacheService;
private static final String CONFIG_SYSTEM_PREFIX = "CONFIG:SYSTEM:";
public CoreConfigEnumMapper getEnumMapper() {
return coreConfigEnumMapper;
@@ -28,7 +38,14 @@ public class CoreConfigService extends TsServiceBase<CoreConfigSystemMapper, Cor
* @return
*/
public CoreConfigSystem getTextOrCreate(String configKey, String defaultValue) {
CoreConfigSystem oneByColumn = getOneByColumn("config_key", configKey);
CoreConfigSystem oneByColumn = tsCacheService.getObj(CONFIG_SYSTEM_PREFIX + configKey,
CoreConfigSystem.class, -1);
if (oneByColumn != null) {
return oneByColumn;
}
oneByColumn = getOneByColumn("config_key", configKey);
if (oneByColumn == null) {
oneByColumn = new CoreConfigSystem();
oneByColumn.setId(configKey);
@@ -38,7 +55,33 @@ public class CoreConfigService extends TsServiceBase<CoreConfigSystemMapper, Cor
oneByColumn.setConfigType(0);
save(oneByColumn);
}
tsCacheService.putObj(CONFIG_SYSTEM_PREFIX + configKey, oneByColumn, 10 * 60);
return oneByColumn;
}
/**
* 更新数据
*
* @param dto
*/
public void updateConfigSystem(ConfigSystemDTO dto) {
CoreConfigSystem configKey = getOneByColumn("config_key", dto.getConfigKey());
if (configKey == null) {
throw new ApiException("该配置不存在,请检查");
}
if (configKey.getReadOnly() == 1) {
throw new ApiException("该配置只读,不可修改");
}
configKey.setConfigVal(dto.getConfigVal());
configKey.setRemark(dto.getRemark());
configKey.setExtra(dto.getExtra());
updateById(configKey);
tsCacheService.putObj(CONFIG_SYSTEM_PREFIX + configKey, configKey, 10 * 60);
}
}

View File

@@ -5,6 +5,7 @@ import com.tiesheng.login.service.TsLoginConfigurer;
import com.tiesheng.util.exception.ApiRespEnum;
import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.web.pojos.dao.CoreConfigSystem;
import com.tiesheng.web.pojos.dto.config.ConfigSystemDTO;
import org.springframework.web.multipart.MultipartFile;
/**
@@ -58,7 +59,7 @@ public interface TieshengWebConfigurer {
* 系统配置验证
* 如果不符合规则,可以抛出异常
*/
default void configSystemCheck(CoreConfigSystem configSystem) {
default void configSystemCheck(ConfigSystemDTO dto) {
}
///////////////////////////////////////////////////////////////////////////

View File

@@ -13,7 +13,8 @@ CREATE TABLE `core_config_enum`
`ext` varchar(255) DEFAULT NULL COMMENT '扩展字段',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='配置-枚举';
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT ='配置-枚举';
CREATE TABLE `core_config_system`
@@ -31,7 +32,8 @@ CREATE TABLE `core_config_system`
PRIMARY KEY (`id`),
UNIQUE KEY `uni_key` (`config_key`(50)) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='配置-系统';
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT ='配置-系统';
alter table core_config_enum
add sort int(10) not null default 0 comment '排序' after name;

View File

@@ -18,6 +18,7 @@ CREATE TABLE `core_log_api`
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
ROW_FORMAT = DYNAMIC COMMENT ='日志-调用';
-- ----------------------------
@@ -69,7 +70,8 @@ CREATE TABLE `core_log_operation`
`params` longtext COMMENT '其他参数',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='日志-操作';
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT ='日志-操作';
alter table core_log_process