Skip to content

Commit

Permalink
1.升级boost至1.85
Browse files Browse the repository at this point in the history
2.为 API GetItemsInfo 和 GetItemInfo 的返回结果中新增int access_flags的属性,用于判断是否可以在商店出售(access_flags & 1 == 1时为可以出售)
3.新增API GetCardsRecvMsg 和 SetCardRecvMsgState 用于 获取名片消息 和 设置名片消息已读状态(代码来自https://github.com/HBACC0005240/MLAssist
  • Loading branch information
hzqst committed Jul 21, 2024
1 parent 79e7509 commit fe78a0e
Show file tree
Hide file tree
Showing 11 changed files with 299 additions and 9 deletions.
28 changes: 27 additions & 1 deletion CGALib/gameinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ namespace CGAServiceProtocol
TIMAX_DEFINE_PROTOCOL(GetItemsInfo, cga_items_info_t());
TIMAX_DEFINE_PROTOCOL(GetBankItemsInfo, cga_items_info_t());
TIMAX_DEFINE_PROTOCOL(GetCardsInfo, cga_cards_info_t());
TIMAX_DEFINE_PROTOCOL(GetCardsRecvMsg, cga_cards_recv_msgs_t());
TIMAX_DEFINE_PROTOCOL(SetCardRecvMsgState, bool(int, int, int));
TIMAX_DEFINE_PROTOCOL(GetPicBooksInfo, cga_picbooks_info_t());
TIMAX_DEFINE_PROTOCOL(GetBankGold, int());
TIMAX_DEFINE_PROTOCOL(UseItem, bool(int));
Expand Down Expand Up @@ -422,7 +424,31 @@ namespace CGA
catch (msgpack::parse_error &e) { OutputDebugStringA("parse exception from " __FUNCTION__); OutputDebugStringA(e.what()); }
}
return false;
}
}
virtual bool GetCardsRecvMsg(cga_cards_recv_msgs_t& info) {
if (m_connected) {
try {
info = m_client.call(std::chrono::milliseconds(10000), m_endpoint, CGAServiceProtocol::GetCardsRecvMsg);
return true;
}
catch (timax::rpc::exception const& e) { if (e.get_error_code() != timax::rpc::error_code::TIMEOUT) m_connected = false; OutputDebugStringA("rpc exception from " __FUNCTION__); OutputDebugStringA(e.get_error_message().c_str()); }
catch (msgpack::parse_error& e) { OutputDebugStringA("parse exception from " __FUNCTION__); OutputDebugStringA(e.what()); }
}
return false;
}

virtual bool SetCardRecvMsgState(int index, int item, int state)
{
if (m_connected) {
try {
m_client.call(std::chrono::milliseconds(10000), m_endpoint, CGAServiceProtocol::SetCardRecvMsgState, index, item, state);
return true;
}
catch (timax::rpc::exception const& e) { if (e.get_error_code() != timax::rpc::error_code::TIMEOUT) m_connected = false; OutputDebugStringA("rpc exception from " __FUNCTION__); OutputDebugStringA(e.get_error_message().c_str()); }
catch (msgpack::parse_error& e) { OutputDebugStringA("parse exception from " __FUNCTION__); OutputDebugStringA(e.what()); }
}
return false;
}
virtual bool GetPicBooksInfo(cga_picbooks_info_t &info) {
if (m_connected) {
try {
Expand Down
38 changes: 36 additions & 2 deletions CGALib/gameinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -439,9 +439,10 @@ namespace CGA
level = 0;
type = 0;
assessed = true;
assess_flags = 0;
}
cga_item_info_s(std::string &a1, std::string &a2, std::string &a3, int a4, int a5, int a6, int a7, int a8, bool a9)
: name(a1), attr(a2), info(a3), itemid(a4), count(a5), pos(a6), level(a7), type(a8), assessed(a9)
cga_item_info_s(std::string &a1, std::string &a2, std::string &a3, int a4, int a5, int a6, int a7, int a8, bool a9, int a10)
: name(a1), attr(a2), info(a3), itemid(a4), count(a5), pos(a6), level(a7), type(a8), assessed(a9), assess_flags(a10)
{
}
std::string name;
Expand All @@ -453,6 +454,7 @@ namespace CGA
int level;
int type;
bool assessed;
int assess_flags;
}cga_item_info_t;

typedef std::vector<cga_item_info_t> cga_items_info_t;
Expand Down Expand Up @@ -972,6 +974,38 @@ namespace CGA

typedef std::vector<cga_card_info_t> cga_cards_info_t;

typedef struct cga_card_recv_msg_payload_s
{
cga_card_recv_msg_payload_s()
{
state = 0;
}
cga_card_recv_msg_payload_s(int a1, std::string& a2, std::string& a3)
: state(a1), date(a2), msg(a3)
{
}
int state;
std::string date;
std::string msg;
}cga_card_recv_msg_payload_t;

typedef struct cga_card_recv_msgs_s
{
cga_card_recv_msgs_s()
{
index = 0;
}
cga_card_recv_msgs_s(int a1, std::string& a2)
: index(a1), name(a2)
{
}
int index;
std::string name;
cga_card_recv_msg_payload_t msgs[10];
}cga_card_recv_msgs_t;

typedef std::vector<cga_card_recv_msgs_t> cga_cards_recv_msgs_t;

typedef struct cga_picbook_info_s
{
cga_picbook_info_s()
Expand Down
90 changes: 87 additions & 3 deletions CGALib/packdata.h
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,7 @@ namespace msgpack {
struct convert<cga_item_info_t> {
msgpack::object const& operator()(msgpack::object const& o, cga_item_info_t& v) const {
if (o.type != msgpack::type::ARRAY) throw msgpack::type_error();
if (o.via.array.size != 9) throw msgpack::type_error();
if (o.via.array.size != 10) throw msgpack::type_error();
v.name = o.via.array.ptr[0].as<std::string>();
v.attr = o.via.array.ptr[1].as<std::string>();
v.info = o.via.array.ptr[2].as<std::string>();
Expand All @@ -505,6 +505,7 @@ namespace msgpack {
v.level = o.via.array.ptr[6].as<int>();
v.type = o.via.array.ptr[7].as<int>();
v.assessed = o.via.array.ptr[8].as<bool>();
v.assess_flags = o.via.array.ptr[9].as<int>();
return o;
}
};
Expand All @@ -514,7 +515,7 @@ namespace msgpack {
template <typename Stream>
packer<Stream>& operator()(msgpack::packer<Stream>& o, cga_item_info_t const& v) const {
// packing member variables as an array.
o.pack_array(9);
o.pack_array(10);
o.pack(v.name);
o.pack(v.attr);
o.pack(v.info);
Expand All @@ -524,6 +525,7 @@ namespace msgpack {
o.pack(v.level);
o.pack(v.type);
o.pack(v.assessed);
o.pack(v.assess_flags);
return o;
}
};
Expand All @@ -532,7 +534,7 @@ namespace msgpack {
struct object_with_zone<cga_item_info_t> {
void operator()(msgpack::object::with_zone& o, cga_item_info_t const& v) const {
o.type = type::ARRAY;
o.via.array.size = 9;
o.via.array.size = 10;
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size));
o.via.array.ptr[0] = msgpack::object(v.name, o.zone);
o.via.array.ptr[1] = msgpack::object(v.attr, o.zone);
Expand All @@ -543,6 +545,7 @@ namespace msgpack {
o.via.array.ptr[6] = msgpack::object(v.level, o.zone);
o.via.array.ptr[7] = msgpack::object(v.type, o.zone);
o.via.array.ptr[8] = msgpack::object(v.assessed, o.zone);
o.via.array.ptr[9] = msgpack::object(v.assess_flags, o.zone);
}
};

Expand Down Expand Up @@ -1833,6 +1836,87 @@ namespace msgpack {
}
};

//cga_card_recv_msg_payload_t
template<>
struct convert<cga_card_recv_msg_payload_t> {
msgpack::object const& operator()(msgpack::object const& o, cga_card_recv_msg_payload_t& v) const {
if (o.type != msgpack::type::ARRAY) throw msgpack::type_error();
if (o.via.array.size != 3) throw msgpack::type_error();
v.state = o.via.array.ptr[0].as<int>();
v.date = o.via.array.ptr[1].as<std::string>();
v.msg = o.via.array.ptr[2].as<std::string>();
return o;
}
};

template<>
struct pack<cga_card_recv_msg_payload_t> {
template <typename Stream>
packer<Stream>& operator()(msgpack::packer<Stream>& o, cga_card_recv_msg_payload_t const& v) const {
// packing member variables as an array.
o.pack_array(3);
o.pack(v.state);
o.pack(v.date);
o.pack(v.msg);
return o;
}
};

template <>
struct object_with_zone<cga_card_recv_msg_payload_t> {
void operator()(msgpack::object::with_zone& o, cga_card_recv_msg_payload_t const& v) const {
o.type = type::ARRAY;
o.via.array.size = 3;
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size));
o.via.array.ptr[0] = msgpack::object(v.state, o.zone);
o.via.array.ptr[1] = msgpack::object(v.date, o.zone);
o.via.array.ptr[2] = msgpack::object(v.msg, o.zone);
}
};

//cga_card_recv_msgs_t

template<>
struct convert<cga_card_recv_msgs_t> {
msgpack::object const& operator()(msgpack::object const& o, cga_card_recv_msgs_t& v) const {
if (o.type != msgpack::type::ARRAY) throw msgpack::type_error();
if (o.via.array.size != 12) throw msgpack::type_error();
v.index = o.via.array.ptr[0].as<int>();
v.name = o.via.array.ptr[1].as<std::string>();
for (int i = 0; i < 10; ++i)
v.msgs[i] = o.via.array.ptr[2 + i].as<tCard_Recv_Msg>();
return o;
}
};

template<>
struct pack<cga_card_recv_msgs_t> {
template <typename Stream>
packer<Stream>& operator()(msgpack::packer<Stream>& o, cga_card_recv_msgs_t const& v) const {
// packing member variables as an array.
o.pack_array(12);
o.pack(v.index);
o.pack(v.name);
for (int i = 0; i < 10; ++i)
o.pack(v.msgs[i]);
return o;
}
};

template <>
struct object_with_zone<cga_card_recv_msgs_t> {
void operator()(msgpack::object::with_zone& o, cga_card_recv_msgs_t const& v) const {
o.type = type::ARRAY;
o.via.array.size = 12;
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size));
o.via.array.ptr[0] = msgpack::object(v.index, o.zone);
o.via.array.ptr[1] = msgpack::object(v.name, o.zone);
for (int i = 0; i < 10; ++i)
o.via.array.ptr[2 + i] = msgpack::object(v.msgs[i], o.zone);
}
};


//cga_picbook_info_t

template<>
Expand Down
67 changes: 67 additions & 0 deletions CGANode/info.cc
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,7 @@ void GetItemInfo(const Nan::FunctionCallbackInfo<v8::Value>& info)
obj->Set(context, String::NewFromUtf8(isolate, "level").ToLocalChecked(), Integer::New(isolate, myinfo.level));
obj->Set(context, String::NewFromUtf8(isolate, "type").ToLocalChecked(), Integer::New(isolate, myinfo.type));
obj->Set(context, String::NewFromUtf8(isolate, "assessed").ToLocalChecked(), Boolean::New(isolate, myinfo.assessed));
obj->Set(context, String::NewFromUtf8(isolate, "assess_flags").ToLocalChecked(), Integer::New(isolate, myinfo.assess_flags));
info.GetReturnValue().Set(obj);
}

Expand Down Expand Up @@ -644,6 +645,7 @@ void GetItemsInfo(const Nan::FunctionCallbackInfo<v8::Value>& info)
obj->Set(context, String::NewFromUtf8(isolate, "level").ToLocalChecked(), Integer::New(isolate, myinfo.level));
obj->Set(context, String::NewFromUtf8(isolate, "type").ToLocalChecked(), Integer::New(isolate, myinfo.type));
obj->Set(context, String::NewFromUtf8(isolate, "assessed").ToLocalChecked(), Boolean::New(isolate, myinfo.assessed));
obj->Set(context, String::NewFromUtf8(isolate, "assess_flags").ToLocalChecked(), Integer::New(isolate, myinfo.assess_flags));
arr->Set(context, i, obj);
}
info.GetReturnValue().Set(arr);
Expand Down Expand Up @@ -819,6 +821,71 @@ void GetCardsInfo(const Nan::FunctionCallbackInfo<v8::Value>& info)
info.GetReturnValue().Set(arr);
}

void GetCardsRecvMsg(const Nan::FunctionCallbackInfo<v8::Value>& info)
{
auto isolate = info.GetIsolate();
HandleScope handle_scope(isolate);
auto context = isolate->GetCurrentContext();

CGA::cga_cards_recv_msgs_t myinfos;
if (!g_CGAInterface->GetCardsRecvMsg(myinfos))
{
Nan::ThrowError("RPC Invocation failed.");
return;
}
Local<Array> arr = Array::New(isolate);
for (size_t i = 0; i < myinfos.size(); ++i)
{
Local<Object> obj = Object::New(isolate);
const CGA::cga_card_recv_msgs_t &myinfo = myinfos.at(i);
obj->Set(context, String::NewFromUtf8(isolate, "index").ToLocalChecked(), Integer::New(isolate, myinfo.index));
obj->Set(context, String::NewFromUtf8(isolate, "name").ToLocalChecked(), Nan::New(myinfo.name).ToLocalChecked());

Local<Array> arrmsgs = Array::New(isolate);
for (size_t i = 0; i < myinfo.msgs.size(); ++i)
{
arrmsgs->Set(context, i, Nan::New(myinfo.msgs[i]).ToLocalChecked());
}
obj->Set(context, String::NewFromUtf8(isolate, "msgs").ToLocalChecked(), arrmsgs);

arr->Set(context, i, obj);
}
info.GetReturnValue().Set(arr);
}

void SetCardRecvMsgState(const Nan::FunctionCallbackInfo<v8::Value>& info)
{
auto isolate = info.GetIsolate();
HandleScope handle_scope(isolate);
auto context = isolate->GetCurrentContext();

if (info.Length() < 1 || !info[0]->IsInt32()) {
Nan::ThrowTypeError("Arg[0] must be integer.");
return;
}

if (info.Length() < 2 || !info[1]->IsInt32()) {
Nan::ThrowTypeError("Arg[1] must be integer.");
return;
}

if (info.Length() < 3 || !info[2]->IsInt32()) {
Nan::ThrowTypeError("Arg[2] must be integer.");
return;
}

int index = info[0]->Int32Value(context).ToChecked();
int item = info[1]->Int32Value(context).ToChecked();
int state = info[2]->Int32Value(context).ToChecked();
if (!g_CGAInterface->SetCardRecvMsgState(index, item, state))
{
Nan::ThrowError("RPC Invocation failed.");
return;
}

info.GetReturnValue().Set(true);
}

void GetPicBooksInfo(const Nan::FunctionCallbackInfo<v8::Value>& info)
{
auto isolate = info.GetIsolate();
Expand Down
2 changes: 2 additions & 0 deletions CGANode/info.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ void GetBankGold(const Nan::FunctionCallbackInfo<v8::Value>& info);
void IsPetValid(const Nan::FunctionCallbackInfo<v8::Value>& info);
void GetPetInfo(const Nan::FunctionCallbackInfo<v8::Value>& info);
void GetCardsInfo(const Nan::FunctionCallbackInfo<v8::Value>& info);
void GetCardsRecvMsg(const Nan::FunctionCallbackInfo<v8::Value>& info);
void SetCardRecvMsgState(const Nan::FunctionCallbackInfo<v8::Value>& info);
void GetPicBooksInfo(const Nan::FunctionCallbackInfo<v8::Value>& info);
void GetPetsInfo(const Nan::FunctionCallbackInfo<v8::Value>& info);
void GetBankPetsInfo(const Nan::FunctionCallbackInfo<v8::Value>& info);
Expand Down
2 changes: 2 additions & 0 deletions CGANode/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,8 @@ void Init(v8::Local<v8::Object> exports) {
exports->Set(context, Nan::New("IsPetValid").ToLocalChecked(), Nan::New<v8::FunctionTemplate>(IsPetValid)->GetFunction(context).ToLocalChecked());
exports->Set(context, Nan::New("GetPetInfo").ToLocalChecked(), Nan::New<v8::FunctionTemplate>(GetPetInfo)->GetFunction(context).ToLocalChecked());
exports->Set(context, Nan::New("GetCardsInfo").ToLocalChecked(), Nan::New<v8::FunctionTemplate>(GetCardsInfo)->GetFunction(context).ToLocalChecked());
exports->Set(context, Nan::New("GetCardsRecvMsg").ToLocalChecked(), Nan::New<v8::FunctionTemplate>(GetCardsRecvMsg)->GetFunction(context).ToLocalChecked());
exports->Set(context, Nan::New("SetCardRecvMsgState").ToLocalChecked(), Nan::New<v8::FunctionTemplate>(SetCardRecvMsgState)->GetFunction(context).ToLocalChecked());
exports->Set(context, Nan::New("GetPicBooksInfo").ToLocalChecked(), Nan::New<v8::FunctionTemplate>(GetPicBooksInfo)->GetFunction(context).ToLocalChecked());
exports->Set(context, Nan::New("GetPetsInfo").ToLocalChecked(), Nan::New<v8::FunctionTemplate>(GetPetsInfo)->GetFunction(context).ToLocalChecked());
exports->Set(context, Nan::New("GetBankPetsInfo").ToLocalChecked(), Nan::New<v8::FunctionTemplate>(GetBankPetsInfo)->GetFunction(context).ToLocalChecked());
Expand Down
2 changes: 1 addition & 1 deletion CGAssistant/mainwindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;img src=&quot;:/logo.png&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:16px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; line-height:160%; font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Liberation Sans,PingFang SC,Microsoft YaHei,Hiragino Sans GB,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,SimSun,WenQuanYi Zen Hei Sharp,sans-serif'; font-size:16px; color:#40485b; background-color:#ffffff;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:16px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; line-height:160%; background-color:#ffffff;&quot;&gt;&lt;span style=&quot; font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Liberation Sans,PingFang SC,Microsoft YaHei,Hiragino Sans GB,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,SimSun,WenQuanYi Zen Hei Sharp,sans-serif'; font-size:16px; color:#40485b; background-color:#ffffff;&quot;&gt;当前版本:2024-03-01&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:16px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; line-height:160%; background-color:#ffffff;&quot;&gt;&lt;span style=&quot; font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Liberation Sans,PingFang SC,Microsoft YaHei,Hiragino Sans GB,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,SimSun,WenQuanYi Zen Hei Sharp,sans-serif'; font-size:16px; color:#40485b; background-color:#ffffff;&quot;&gt;当前版本:2024-07-21&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:16px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; line-height:160%; background-color:#ffffff;&quot;&gt;&lt;span style=&quot; font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Liberation Sans,PingFang SC,Microsoft YaHei,Hiragino Sans GB,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,SimSun,WenQuanYi Zen Hei Sharp,sans-serif'; font-size:16px; color:#40485b; background-color:#ffffff;&quot;&gt;下载最新版本:群号 300303705&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:16px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; line-height:160%; background-color:#ffffff;&quot;&gt;&lt;span style=&quot; font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Liberation Sans,PingFang SC,Microsoft YaHei,Hiragino Sans GB,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,SimSun,WenQuanYi Zen Hei Sharp,sans-serif'; font-size:16px; color:#40485b; background-color:#ffffff;&quot;&gt;或 &lt;/span&gt;&lt;a href=&quot;https://github.com/hzqst/CGAssistant/&quot;&gt;&lt;span style=&quot; font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Liberation Sans,PingFang SC,Microsoft YaHei,Hiragino Sans GB,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,SimSun,WenQuanYi Zen Hei Sharp,sans-serif'; font-size:16px; text-decoration: underline; color:#005980; background-color:transparent;&quot;&gt;https://github.com/hzqst/CGAssistantJS/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:16px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; line-height:160%; background-color:#ffffff;&quot;&gt;&lt;a href=&quot;https://github.com/hzqst/CGAssistantJS/issues&quot;&gt;&lt;span style=&quot; font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Liberation Sans,PingFang SC,Microsoft YaHei,Hiragino Sans GB,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,SimSun,WenQuanYi Zen Hei Sharp,sans-serif'; font-size:16px; text-decoration: underline; color:#005980; background-color:transparent;&quot;&gt;或 &lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/hzqst/CGAssistant/&quot;&gt;&lt;span style=&quot; font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Liberation Sans,PingFang SC,Microsoft YaHei,Hiragino Sans GB,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,SimSun,WenQuanYi Zen Hei Sharp,sans-serif'; font-size:16px; text-decoration: underline; color:#005980; background-color:transparent;&quot;&gt;https://gitee.com/hzqst/CGAssistantJS/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
Expand Down
Loading

0 comments on commit fe78a0e

Please sign in to comment.