rebar3 服务器
This commit is contained in:
@@ -0,0 +1,291 @@
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @copyright (C) 2021, <COMPANY>
|
||||
%%% @doc
|
||||
%%%
|
||||
%%% @end
|
||||
%%% Created : 25. 5月 2021 11:15
|
||||
%%%-------------------------------------------------------------------
|
||||
-ifndef(__BASE_HRL__).
|
||||
-define(__BASE_HRL__, true).
|
||||
|
||||
-include_lib("stdlib/include/ms_transform.hrl").
|
||||
-include_lib("kernel/include/logger.hrl").
|
||||
|
||||
-define(RPC_CALL_TIMEOUT, 5000).
|
||||
-define(CALL_TIMEOUT, 5000).
|
||||
|
||||
%% atom define
|
||||
|
||||
%% 游戏校验key
|
||||
-define(AUTH_KEY, "4399-auth-key").
|
||||
-define(TBL_KEY, "44c78a8401fd692bdefb58a32220861b").
|
||||
-define(RECHARGE_KEY, "7e532cad3b95689afc4fddb7e9a83e09").
|
||||
-define(FN_NORMAL_KEY, "aef842b91f54a878d00ad0897ed02473").
|
||||
-define(CLIENT_KEY, "0248537b34d9cd80f8121fe07ec58eee").
|
||||
-define(RCC_KEY, "53b16e47b634cd6046e4da2884ff77d8").
|
||||
-define(API_KEY, "80260282bb470b304b60c03ab113e3ea"). % 通用api key
|
||||
|
||||
-ifndef(OK).
|
||||
-define(OK, ok).
|
||||
-endif.
|
||||
|
||||
%% 这里故意用的err,避免以系统抛异常的error冲突
|
||||
-ifndef(ERROR).
|
||||
-define(ERROR, error).
|
||||
-endif.
|
||||
|
||||
%% 这里故意用的err,避免以系统抛异常的error冲突
|
||||
-ifndef(ERR).
|
||||
-define(ERR, err).
|
||||
-endif.
|
||||
|
||||
-ifndef(TRUE).
|
||||
-define(TRUE, true).
|
||||
-endif.
|
||||
|
||||
-ifndef(FALSE).
|
||||
-define(FALSE, false).
|
||||
-endif.
|
||||
|
||||
-ifndef(TRUE_INT).
|
||||
-define(TRUE_INT, 1).
|
||||
-endif.
|
||||
|
||||
-ifndef(FALSE_INT).
|
||||
-define(FALSE_INT, 0).
|
||||
-endif.
|
||||
|
||||
-define(INT_TO_BOOLEAN(I), I =/= 0).
|
||||
-define(BOOLEAN_TO_INT(I), ?IF(I, ?TRUE_INT, ?FALSE_INT)).
|
||||
|
||||
-ifndef(UNDEFINED).
|
||||
-define(UNDEFINED, undefined).
|
||||
-endif.
|
||||
|
||||
-ifndef(CONTINUE).
|
||||
-define(CONTINUE, continue).
|
||||
-endif.
|
||||
|
||||
-ifndef(IGNORE).
|
||||
-define(IGNORE, ignore).
|
||||
-endif.
|
||||
|
||||
-ifndef(INFINITY).
|
||||
-define(INFINITY, infinity).
|
||||
-endif.
|
||||
|
||||
-ifndef(NONE).
|
||||
-define(NONE, none).
|
||||
-endif.
|
||||
|
||||
-ifndef(STOP).
|
||||
-define(STOP, stop).
|
||||
-endif.
|
||||
|
||||
-ifndef(SKIP).
|
||||
-define(SKIP, skip).
|
||||
-endif.
|
||||
|
||||
-ifndef(DISABLED).
|
||||
-define(DISABLED, disabled).
|
||||
-endif.
|
||||
|
||||
-ifndef(ENABLED).
|
||||
-define(ENABLED, enabled).
|
||||
-endif.
|
||||
|
||||
-ifndef(ONLINE).
|
||||
-define(ONLINE, online).
|
||||
-endif.
|
||||
|
||||
-ifndef(OFFLINE).
|
||||
-define(OFFLINE, offline).
|
||||
-endif.
|
||||
|
||||
-ifndef(VALUE).
|
||||
-define(VALUE, value).
|
||||
-endif.
|
||||
|
||||
-ifndef(CONTINUE).
|
||||
-define(CONTINUE, continue).
|
||||
-endif.
|
||||
|
||||
|
||||
-define(IF(C, T), (?IF(C, T, skip))).
|
||||
-define(IF(C, T, F), (case (C) of true -> (T); false -> (F) end)).
|
||||
-define(MAP_GET(__K__, __Map__, __Default__), (case (__Map__) of #{__K__ := __V__} -> __V__; #{} -> (__Default__) end)).
|
||||
|
||||
-define(THROW(ErrCode), throw(ErrCode)).
|
||||
|
||||
-define(ASSERT(Express),
|
||||
case (Express) of
|
||||
true ->
|
||||
ok;
|
||||
false ->
|
||||
error(assert_error)
|
||||
end).
|
||||
|
||||
-define(ASSERT(Express, ErrCode),
|
||||
case (Express) of
|
||||
true ->
|
||||
ok;
|
||||
false ->
|
||||
error(ErrCode)
|
||||
end).
|
||||
|
||||
%% try_catch 捕获玩家自己抛的异常,需要玩家自行匹配
|
||||
-define(TRY_CATCH(Fun),
|
||||
try
|
||||
(Fun)
|
||||
catch
|
||||
_:TRY_CACHE_Error:Trace ->
|
||||
?ERROR(?MODULE, "snip err, Error = ~p~n", [{TRY_CACHE_Error, Trace}]),
|
||||
TRY_CACHE_Error
|
||||
end
|
||||
).
|
||||
|
||||
-define(CHILD_SPEC(I, Type), {I, {I, start_link, []}, permanent, 50000, Type, [I]}).
|
||||
-define(CHILD_SPEC(I, Type, Args), {I, {I, start_link, Args}, permanent, 50000, Type, [I]}).
|
||||
-define(CHILD_SPEC(C, I, Type, Args), {C, {I, start_link, Args}, permanent, 50000, Type, [I]}).
|
||||
|
||||
|
||||
%% 控制台打印
|
||||
-define(PRINT(F), ?PRINT(F, [])).
|
||||
-define(PRINT(F, D), (io:format("~w:~w/~w:~w ~w ~w " ++ F ++ "\n", [?MODULE, ?FUNCTION_NAME, ?FUNCTION_ARITY, ?LINE, self(), erlang:get('!role_id!') | D]))).
|
||||
|
||||
-define(DEBUG(T, F, D), ?LOG_DEBUG(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(INFO(T, F, D), ?LOG_INFO(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(WARN(T, F, D), ?LOG_WARNING(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(CRIT(T, F, D), ?LOG_CRITICAL(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(NOTICE(T, F, D), ?LOG_NOTICE(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(ERROR(T, F, D), ?LOG_ERROR(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
|
||||
-define(DEBUG(F, D), ?LOG_DEBUG(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(INFO(F, D), ?LOG_INFO(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(WARN(F, D), ?LOG_WARNING(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(CRIT(F, D), ?LOG_CRITICAL(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(NOTICE(F, D), ?LOG_NOTICE(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
-define(ERROR(F, D), ?LOG_ERROR(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
|
||||
|
||||
-define(DEBUG_TAG(Tag, Data), ?DEBUG(Tag, "~p=~w", [??Data, Data])).
|
||||
|
||||
%% http单独打印
|
||||
-define(HTTP_DEBUG(T, F, D), ?LOG_DEBUG(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_INFO(T, F, D), ?LOG_INFO(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_WARN(T, F, D), ?LOG_WARNING(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_CRIT(T, F, D), ?LOG_CRITICAL(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_NOTICE(T, F, D), ?LOG_NOTICE(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_ERROR(T, F, D), ?LOG_ERROR(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
|
||||
-define(HTTP_DEBUG(F, D), ?LOG_DEBUG(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_INFO(F, D), ?LOG_INFO(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_WARN(F, D), ?LOG_WARNING(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_CRIT(F, D), ?LOG_CRITICAL(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_NOTICE(F, D), ?LOG_NOTICE(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
-define(HTTP_ERROR(F, D), ?LOG_ERROR(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
|
||||
|
||||
%% 协议录制
|
||||
-define(GET_PROTO_TIME, (
|
||||
case erlang:get(proto_time) of
|
||||
?UNDEFINED ->
|
||||
erlang:put(proto_time, misc_lib:now_ms()),
|
||||
0;
|
||||
ProtoTime ->
|
||||
ProtoTime1 = misc_lib:now_ms(),
|
||||
erlang:put(proto_time, ProtoTime1),
|
||||
ProtoTime1 - ProtoTime
|
||||
end)).
|
||||
-define(PROTO_TRACE(F, D), ?LOG_DEBUG(F, D, #{tag => proto, time1=>?GET_PROTO_TIME, id => erlang:get('!role_id!'), domain=>[proto]})).
|
||||
|
||||
%% 打印错误码日志
|
||||
-define(CODE_LOG(Code, Desc, LogArgs), ?INFO(?MODULE, "err_code:~p ~ts ~p=~w", [Code, Desc, ??LogArgs, LogArgs])).
|
||||
|
||||
%% 错误码处理, 打印错误码日志,返回{err,code}
|
||||
-define(ERROR_CODE(Code, LogArgs),
|
||||
begin
|
||||
?CODE_LOG(Code, "", LogArgs),
|
||||
{?ERR, Code}
|
||||
end).
|
||||
|
||||
%% 错误码处理, 打印错误码日志,返回{err,code}
|
||||
-define(ERROR_CODE(Code, Desc, LogArgs),
|
||||
begin
|
||||
?CODE_LOG(Code, Desc, LogArgs),
|
||||
{?ERR, Code}
|
||||
end).
|
||||
|
||||
-define(SECONDS_PER_MINUTE, 60).
|
||||
-define(SECONDS_PER_HOUR, 3600).
|
||||
-define(SECONDS_PER_DAY, 86400).
|
||||
-define(SECONDS_PER_WEEK, 604800).
|
||||
-define(SECONDS_PER_YEAR, 31536000).
|
||||
-define(SECONDS_PER_LEAP_YEAR, 31622400).
|
||||
-define(SECONDS_FROM_0_TO_1970, 62167219200).
|
||||
|
||||
-define(MSECS_PER_SEC, 1000).
|
||||
-define(MSECS_PER_MINUTE, 60000).
|
||||
-define(MSECS_PER_HOUR, 3600000).
|
||||
-define(MSECS_PER_DAY, 86400000).
|
||||
-define(MSECS_PER_WEEK, 604800000).
|
||||
|
||||
-define(DAYS_PER_WEEK, 7).
|
||||
-define(DAYS_PER_YEAR, 365).
|
||||
-define(DAYS_PER_LEAP_YEAR, 366).
|
||||
-define(DAYS_PER_4YEARS, 1461).
|
||||
-define(DAYS_PER_100YEARS, 36524).
|
||||
-define(DAYS_PER_400YEARS, 146097).
|
||||
-define(DAYS_FROM_0_TO_1970, 719528).
|
||||
|
||||
-define(TEN, 10). % 0.01k
|
||||
-define(ONE_HUNDRED, 100). % 0.1k
|
||||
-define(ONE_THOUSAND, 1000). % 1k
|
||||
-define(TEN_THOUSAND, 10000). % 1w
|
||||
-define(HUNDRED_THOUSAND, 100000). % 10w
|
||||
-define(ONE_MILLION, 1000000). % 100w
|
||||
-define(HUNDRED_MILLION, 100000000). % 1亿
|
||||
|
||||
-define(INTMAX, 2147483647).
|
||||
-define(UINTMAX, 4294967294).
|
||||
-define(UINT64MAX, 18446744073709551615).
|
||||
|
||||
-define(RECORD_NAME_POS, 1).
|
||||
|
||||
-type role_id() :: integer().
|
||||
|
||||
%% 日常清理偏移时间
|
||||
-define(DAILY_HOUR, 0).
|
||||
-define(DAILY_RESET_SHIFT_TIME, (3600 * ?DAILY_HOUR)).
|
||||
|
||||
-define(ETS_OPTIONS, [set, public, named_table, {keypos, 1}, {read_concurrency, true}, {write_concurrency, auto}]).
|
||||
|
||||
%% todo,以下宏属于游戏相关的,写在这里是因为登录服和游戏服都要用到同一套宏定义
|
||||
|
||||
%% 服务器状态
|
||||
-define(SERVER_STATUS_SMOOTH, 1). %% 服务器状态 - 流畅
|
||||
-define(SERVER_STATUS_CROWD, 2). %% 服务器转态 - 拥挤
|
||||
-define(SERVER_STATUS_FULL, 3). %% 服务器状态 - 爆满
|
||||
|
||||
%% 蜂鸟角色互通平台
|
||||
-define(FN_PLATFORM_APP_AND, <<"1">>).
|
||||
-define(FN_PLATFORM_APP_IOS, <<"2">>).
|
||||
-define(FN_PLATFORM_WECHAT_AND, <<"1388">>).
|
||||
-define(FN_PLATFORM_WECHAT_IOS, <<"1390">>).
|
||||
-define(FN_PLATFORM_INTER_LIST, [?FN_PLATFORM_APP_AND, ?FN_PLATFORM_APP_IOS, ?FN_PLATFORM_WECHAT_AND, ?FN_PLATFORM_WECHAT_IOS]).
|
||||
|
||||
%% 角色类型
|
||||
-define(ACCOUNT_TYPE_VISITOR, 0). %% 游客
|
||||
-define(ACCOUNT_TYPE_NORMAL, 1). %% 普通玩家
|
||||
-define(ACCOUNT_TYPE_INNER, 2). %% 内部玩家
|
||||
-define(ACCOUNT_TYPE_INNER_MGR, 3). %% 内部玩家管理员
|
||||
|
||||
-define(SERVER_ACTIVE_AUTO, 0). %% 服务器自动激活,开服时间到了自动开服
|
||||
-define(SERVER_ACTIVE_CLOSE, 1). %% 服务器未激活,开服时间到了也不开服
|
||||
-define(SERVER_ACTIVE_OPEN, 2). %% 服务器立刻激活,马上开服
|
||||
|
||||
-define(PLATFORM_ZONE_ALL, 0). %% 通用专区
|
||||
-define(PLATFORM_ZONE_WECHAT, 1). %% 微信专区
|
||||
-define(PLATFORM_ZONE_APP, 2). %% app专区
|
||||
|
||||
-define(PLATFORM_ZONE_WECHAT_FN_PLATFORMS, [?FN_PLATFORM_WECHAT_AND, ?FN_PLATFORM_WECHAT_IOS]).
|
||||
|
||||
-endif.
|
||||
@@ -0,0 +1,113 @@
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @copyright (C) 2021, 四三九九
|
||||
%%% @doc
|
||||
%%%
|
||||
%%% @end
|
||||
%%% Created : 2021-07-28 14:58:59
|
||||
%%%-------------------------------------------------------------------
|
||||
-ifndef(__MS_TBLAPI_HRL__).
|
||||
-define(__MS_TBLAPI_HRL__, true).
|
||||
|
||||
-include("base.hrl").
|
||||
%% -include("tblapi_c.hrl").
|
||||
%% -include("tblapi_pb.hrl").
|
||||
|
||||
-define(EXPIRED_TIME, 300). %% 过期时间
|
||||
-define(HTTP_TIMEOUT, 5000).
|
||||
|
||||
%% 错误码
|
||||
-ifdef(CODE_SUCC).
|
||||
-undef(CODE_SUCC).
|
||||
-endif.
|
||||
-ifdef(CODE_ERR_DUP).
|
||||
-undef(CODE_ERR_DUP).
|
||||
-endif.
|
||||
-ifdef(CODE_ERR_PARAM).
|
||||
-undef(CODE_ERR_PARAM).
|
||||
-endif.
|
||||
-ifdef(CODE_PARAM_INVALID).
|
||||
-undef(CODE_PARAM_INVALID).
|
||||
-endif.
|
||||
-ifdef(CODE_ERR_AUTH).
|
||||
-undef(CODE_ERR_AUTH).
|
||||
-endif.
|
||||
-ifdef(CODE_ERR_DATA).
|
||||
-undef(CODE_ERR_DATA).
|
||||
-endif.
|
||||
-ifdef(CODE_ERR_IP).
|
||||
-undef(CODE_ERR_IP).
|
||||
-endif.
|
||||
-ifdef(CODE_ERR_OTHER).
|
||||
-undef(CODE_ERR_OTHER).
|
||||
-endif.
|
||||
-define(CODE_SUCC, <<"0">>). %% 操作成功
|
||||
-define(CODE_ERR_DUP, <<"1">>). %% 请求重复
|
||||
-define(CODE_ERR_PARAM, <<"101">>). %% 参数错误
|
||||
-define(CODE_PARAM_INVALID, <<"102">>). %% 参数错误
|
||||
-define(CODE_ERR_AUTH, <<"202">>). %% 验证错误
|
||||
-define(CODE_ERR_DATA, <<"301">>). %% 数据部分错误
|
||||
-define(CODE_ERR_IP, <<"888">>). %% IP错误,非白名单IP
|
||||
-define(CODE_ERR_OTHER, <<"999">>). %% 其他错误
|
||||
|
||||
%% 邮件发送类型
|
||||
-define(SEND_BY_ROLE_NAME, 1).
|
||||
-define(SEND_BY_ROLE_ID, 2).
|
||||
-define(SEND_BY_ROLE_ACCOUNT, 3).
|
||||
-define(SEND_BY_CONDITION, 4).
|
||||
-define(SEND_TO_EVERYBODY, 5).
|
||||
-define(SEND_TO_ONLINE_PALYER, 6).
|
||||
|
||||
%% 玩家详情数据模式
|
||||
-define(TABLE_TYPE_1_VS_1, 1). %% 1对1
|
||||
-define(TABLE_TYPE_1_VS_N, 2). %% 1对多
|
||||
-define(TABLE_TYPE_1_VS_N2, 3). %% 特殊1对多
|
||||
|
||||
%% 白名单ip
|
||||
-define(WHITE_IP_LIST,
|
||||
[
|
||||
%% T后台
|
||||
"42.62.31.88"
|
||||
, "106.52.229.108"
|
||||
, "172.20.16.46"
|
||||
, "43.136.74.50"
|
||||
, "111.230.233.101"
|
||||
, "106.52.39.247"
|
||||
%% T后台hk
|
||||
, "150.109.109.6"
|
||||
, "43.154.4.184"
|
||||
|
||||
%% 聊天监控平台
|
||||
, "42.62.31.81"
|
||||
, "109.244.51.16"
|
||||
, "120.31.139.140"
|
||||
|
||||
%% 统一网关 todo 应该t后台/风控/蜂鸟都接了统一网关
|
||||
, "43.138.173.45"
|
||||
, "119.29.184.236"
|
||||
, "172.20.16.18"
|
||||
, "172.20.48.15"
|
||||
]).
|
||||
|
||||
-define(WHITE_IP_SEGMENT_LIST,
|
||||
[
|
||||
%% T后台
|
||||
%% 121.201.56.0 ~ 121.201.56.255
|
||||
"121.201.56.0/24"
|
||||
, "124.243.195.0/24"
|
||||
]).
|
||||
|
||||
-define(ETS_TBLAPI_FLAG, ets_tblapi_flag).
|
||||
-define(ETS_API_FLAG, ets_api_flag).
|
||||
|
||||
-define(TBLKEY_RET, ret).
|
||||
-define(TBLKEY_MSG, msg).
|
||||
-define(TBLKEY_DATA, data).
|
||||
-define(TBLKEY_TOTAL_NUM, totalNum).
|
||||
-define(TBLKEY_DESC, desc).
|
||||
-define(TBLKEY_TABLE_TYPE, tableType).
|
||||
|
||||
-define(OSS_SEX_ALL, 0). % 全体玩家
|
||||
-define(OSS_SEX_MALE, 1). % 男
|
||||
-define(OSS_SEX_FEMALE, 2). % 女
|
||||
|
||||
-endif.
|
||||
@@ -0,0 +1,34 @@
|
||||
-ifndef(__TABLE_HRL__).
|
||||
-define(__TABLE_HRL__, true).
|
||||
|
||||
%% -------------------------------------------------------------------
|
||||
%% 表配置
|
||||
%% -------------------------------------------------------------------
|
||||
-record(table, {
|
||||
tab_name, %% 数据库表对应的表名,也是代码里对应的record名
|
||||
field_list = [], %% 字段列表,对应mysql数据库表的字段 [#field{}...]
|
||||
prim_key_list = [], %% 表主键,为空默认表的第一个字段作为主键;多个字段表示联合主键
|
||||
index_list = [], %% 表索引,自动创建数据库表时自动创建索引,该字段只有数据库作用到
|
||||
uniq_id_field = undefined, %% 唯一id字段,类似于唯一索引,undefined表示该表不需要唯一id字段;该字段主要用于生成select max取表的最大唯一id值
|
||||
pre_load = false, %% 启动时是否全量加载数据,true/false
|
||||
all_clear = false, %% 表示可否通过ms_cache:delete_all_objects方法删除表的所有数据;慎用,不重要数据可以用该字段
|
||||
merge_type = 0, %% 合服类型,用于生成合服sql,0-保留主从服数据(默认值) 1-保留主服数据 2-保留从服数据 3-删除主从服数据 4-不处理
|
||||
merge_ignore_prim_key_conflict = false, %% 合服时是否忽略主键冲突,true-忽略冲突,false-不忽略冲突(默认值)
|
||||
worker_count = 0, %% 表的工作进程数量
|
||||
split_zone_column = undefined, %% 表的分区字段
|
||||
copy_from_table = undefined, %% 该表从哪一张表复制,两张表结构完全相同
|
||||
server_types = [game_server] %% 表的服务类型
|
||||
}).
|
||||
|
||||
%% -------------------------------------------------------------------
|
||||
%% 字段配置
|
||||
%% -------------------------------------------------------------------
|
||||
-record(field, {
|
||||
name, %% 字段名
|
||||
type = int, %% 类型,int | binary | list | map | atom | boolean | tuple | any
|
||||
len = 0, %% 数据库表中该字段的长度;Len=0 且 Type=list/map/tuple 时用text存储,Type=binary/any时用blob存储
|
||||
common = "", %% 字段的说明
|
||||
sync = true %% 是否同步到数据库表,true | false;当sync=false,表示该字段是临时数据,数据库表也没有该字段
|
||||
}).
|
||||
|
||||
-endif.
|
||||
Reference in New Issue
Block a user