This commit is contained in:
2025-12-27 11:44:50 +08:00
commit ccd43fac1f
1193 changed files with 384161 additions and 0 deletions
@@ -0,0 +1,66 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==
# Excalidraw Data
## Text Elements
外部系统 ^VzHnJsBH
Secret
^D63jlbEA
OpenIM ^h1X1055C
CyyProxyIM ^z720J8KW
CyyProxyWebSocket ^ekpfxqPP
%%
## Drawing
```compressed-json
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
```
%%
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 86 KiB

@@ -0,0 +1,372 @@
{
"nodes": [
{
"id": "1819f6006c105b97",
"type": "group",
"styleAttributes": {},
"x": -1247,
"y": 435,
"width": 798,
"height": 600,
"label": "Untitled group"
},
{
"id": "afec6eac97ddc232",
"type": "group",
"styleAttributes": {},
"x": -360,
"y": 80,
"width": 650,
"height": 140,
"label": "入口:OpenIM-API服务"
},
{
"id": "3c5b4941a138e482",
"type": "text",
"text": "系统",
"styleAttributes": {},
"x": -1200,
"y": 215,
"width": 97,
"height": 50
},
{
"id": "027fda29d0beb7f6",
"type": "text",
"text": "OpenImUser",
"styleAttributes": {},
"x": -606,
"y": 335,
"width": 164,
"height": 60
},
{
"id": "d9c524b81ec25e69",
"type": "text",
"text": "租户",
"styleAttributes": {},
"x": -980,
"y": 215,
"width": 97,
"height": 50
},
{
"id": "d145337e257371f1",
"type": "text",
"text": "子账户",
"styleAttributes": {},
"x": -790,
"y": 215,
"width": 109,
"height": 50
},
{
"id": "81d539ef35a017ab",
"type": "text",
"text": "SystemUserId",
"styleAttributes": {},
"x": -815,
"y": 335,
"width": 160,
"height": 60
},
{
"id": "f4a8912e49eeec6c",
"type": "text",
"text": "#### <center>SPOL定制Gin.router</center>",
"styleAttributes": {},
"x": -348,
"y": 100,
"width": 301,
"height": 50
},
{
"id": "d03b05fbdc2281bc",
"type": "text",
"text": "用户信息、状态对接",
"styleAttributes": {},
"x": -348,
"y": 160,
"width": 301,
"height": 50
},
{
"id": "74bd85fccec6045f",
"type": "text",
"text": "#### <center>原Gin.router</center>",
"styleAttributes": {},
"x": -23,
"y": 100,
"width": 301,
"height": 50
},
{
"id": "d0dd290062af2567",
"type": "text",
"text": "System\nSystemSecret",
"styleAttributes": {},
"x": -1253,
"y": 335,
"width": 203,
"height": 60
},
{
"id": "d2f84247eb18da62",
"type": "text",
"text": "通信对接",
"styleAttributes": {},
"x": -23,
"y": 160,
"width": 301,
"height": 50
},
{
"id": "03552be7dcca965c",
"type": "text",
"text": "CyyUserToken,转换用户信息,生成token,建立token映射\n1. 解析并验证SystemId & SystemSecret\n2. 调UserToken生\n4. 缓存用户",
"styleAttributes": {},
"x": -911,
"y": 585,
"width": 442,
"height": 160
},
{
"id": "79d8c3c4e74c9625",
"type": "text",
"text": "ProxyWebSocketHandler",
"styleAttributes": {},
"x": -911,
"y": 911,
"width": 442,
"height": 104
},
{
"id": "1a6180a2a139feef",
"type": "text",
"text": "CyySystem用户的会话校验",
"styleAttributes": {},
"x": -815,
"y": 799,
"width": 250,
"height": 60
},
{
"id": "693a875b5ade1b67",
"type": "text",
"text": "HTTP",
"styleAttributes": {},
"x": -1179,
"y": 640,
"width": 112,
"height": 50
},
{
"id": "9017e0c1833cc977",
"type": "text",
"text": "1. 注册账户\n2. 帐户存在检查\n3. 更新用户信息\n4. 同步用户Token",
"styleAttributes": {},
"x": -1538,
"y": 610,
"width": 198,
"height": 110
},
{
"id": "348070443194b74c",
"type": "text",
"text": "Web\nSocket",
"styleAttributes": {},
"x": -1179,
"y": 941,
"width": 112,
"height": 47
},
{
"id": "aabfc53144faf7d6",
"type": "text",
"text": "同步系统用户Token\nparams\n* SystemId\n* SystemSecret\n* UserId\n* Token\n",
"styleAttributes": {},
"x": -1227,
"y": 455,
"width": 209,
"height": 155
},
{
"id": "ec55fc53ded7cc62",
"type": "text",
"text": "OpenIM Token验证. \n通过GinParseToken方法,验证Token,转换已登录的用户信息",
"styleAttributes": {},
"x": -23,
"y": 310,
"width": 301,
"height": 80,
"color": "4"
},
{
"id": "3f63f6ddf30bfa15",
"type": "text",
"text": "OpenIM Token生成\nrpc.Auth.UserToken()验证系统级别的secret,成功后为输入的用户创建一个token",
"styleAttributes": {},
"x": -23,
"y": 615,
"width": 301,
"height": 100,
"color": "4"
},
{
"id": "e1a130793c70044b",
"type": "text",
"text": "Secret from config",
"styleAttributes": {},
"x": -322,
"y": 320,
"width": 250,
"height": 60
},
{
"id": "38cf93dae65fd21f",
"type": "text",
"text": "LongConnectionHandler",
"styleAttributes": {},
"x": -23,
"y": 934,
"width": 250,
"height": 60,
"color": "4"
},
{
"id": "a9dcf0f03171a92f",
"type": "text",
"text": "WebSocket Handler",
"styleAttributes": {},
"x": -360,
"y": 934,
"width": 250,
"height": 60,
"color": "4"
}
],
"edges": [
{
"id": "a38587cea1fb24b3",
"fromNode": "81d539ef35a017ab",
"fromSide": "right",
"toNode": "027fda29d0beb7f6",
"toSide": "left"
},
{
"id": "56871e8f23867827",
"fromNode": "d9c524b81ec25e69",
"fromSide": "right",
"toNode": "d145337e257371f1",
"toSide": "left"
},
{
"id": "b4437f12459848b8",
"fromNode": "3c5b4941a138e482",
"fromSide": "right",
"toNode": "d9c524b81ec25e69",
"toSide": "left"
},
{
"id": "9d94a844b6341f44",
"fromNode": "3c5b4941a138e482",
"fromSide": "bottom",
"toNode": "d0dd290062af2567",
"toSide": "top"
},
{
"id": "7322046e8d8d562d",
"fromNode": "d145337e257371f1",
"fromSide": "bottom",
"toNode": "81d539ef35a017ab",
"toSide": "top"
},
{
"id": "3285eed2d86a2b7d",
"fromNode": "d145337e257371f1",
"fromSide": "right",
"toNode": "027fda29d0beb7f6",
"toSide": "top"
},
{
"id": "59a16da93d9b0128",
"fromNode": "03552be7dcca965c",
"fromSide": "right",
"toNode": "3f63f6ddf30bfa15",
"toSide": "left"
},
{
"id": "cb45ccf7e23892c1",
"fromNode": "693a875b5ade1b67",
"fromSide": "right",
"toNode": "03552be7dcca965c",
"toSide": "left"
},
{
"id": "bbbf27258fa8a712",
"fromNode": "9017e0c1833cc977",
"fromSide": "right",
"toNode": "693a875b5ade1b67",
"toSide": "left"
},
{
"id": "bacebe4a362a592f",
"fromNode": "a9dcf0f03171a92f",
"fromSide": "right",
"toNode": "38cf93dae65fd21f",
"toSide": "left"
},
{
"id": "fd8a60755ec645cf",
"fromNode": "79d8c3c4e74c9625",
"fromSide": "bottom",
"toNode": "38cf93dae65fd21f",
"toSide": "bottom"
},
{
"id": "d1403831a1694b5f",
"fromNode": "348070443194b74c",
"fromSide": "right",
"toNode": "79d8c3c4e74c9625",
"toSide": "left",
"label": "123"
},
{
"id": "af04b4dbba65b630",
"fromNode": "03552be7dcca965c",
"fromSide": "bottom",
"toNode": "1a6180a2a139feef",
"toSide": "top"
},
{
"id": "b5b29389f8e9b8e5",
"fromNode": "79d8c3c4e74c9625",
"fromSide": "top",
"toNode": "1a6180a2a139feef",
"toSide": "bottom"
},
{
"id": "1fc22f8680621202",
"fromNode": "aabfc53144faf7d6",
"fromSide": "bottom",
"toNode": "693a875b5ade1b67",
"toSide": "top"
},
{
"id": "a1bb2a309fcb956c",
"fromNode": "d0dd290062af2567",
"fromSide": "right",
"toNode": "81d539ef35a017ab",
"toSide": "left"
},
{
"id": "8735e44bc6af23a8",
"fromNode": "3f63f6ddf30bfa15",
"fromSide": "bottom",
"toNode": "1a6180a2a139feef",
"toSide": "right",
"label": "abc"
}
],
"metadata": {}
}
@@ -0,0 +1,6 @@
# 系统关系
![[系统对接示意图|center]]
# 账户映射
@@ -0,0 +1,74 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==
# Excalidraw Data
## Text Elements
CYYIM代理 ^IZ6kt6K5
综合服务平台
平台统一接入 ^sUswdWNC
独立系统 ^EHsIvP5z
OpenIM系统 ^iu3razac
%%
## Drawing
```compressed-json
N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTieGjoghH0EDihmbgBtcDBQMELoeHF0QOwojmVgpMLIRhZ2LjQeAE4Adn4ihtZOADlOMW4ARgBWADZW1rH2nk68yEIOYixu
CFwABlqiwmYAERSoBGJuADMCMK7Fk4kARQBHAGYYU77mduUN3HCATQBpADiAGV9MMABqabaQU6EfD4IGwGoSQQeKEQZhQUhsADWCAA6iR1Nw+At0ZicQgETAkegUSQ0Vi/JIOOEsmhhlcIGw4LhsGoYCMNhtOdZqqVhaTMNxnI9xhttAAOR6jVqPdqjTkCtCPR7aCbjAAsG3GPA1pIxWNxAGE2Pg2KQ1gBiYYIF0utGaXnY5SM5Y2u0OiSY6zMHm
BDJoiiEyTcdXy2bjCamoUpjmkyQIQjKaSxhXaYYbUYG8YK9WcsLHbijIWl1obHhpuoQH3COAASWIbNQ2QAupzTuQ0h3uBwhHDOb7iCzmF2Ck3YIhuI8FgBfTmaYTLACiwTSGS7uTq+QWRQXpWgWCgUJ2N3QbYAWuNsVBxn9RhAT2uT3Om/SJMMhD6AAVP52kwKA9gACQAMVaAB9ZhMFICg4E0AB5AA1a9IDPNZcFILEqE/K5jyPa41gBbBoL+DCf
iAmAAEEhAAK30AAlVorXuMFHk0PYwWw4pFwkfDCI/I8vyPH8bzWNjmIAVWY+4ACFnFuDY0IAKUwe9cFGTB9HwZSwTbQTcJEgi2CIiSFj7UkhDgYhcCOW9hnaYZWiTcY1QVVVOSIDhsRHMd8H8thsFxW9znwMI8kk0jTxKNYjnAtEeiaYlxkbbomF6DgBg4IY0CmOtS0ePzSSWFYpRE4Y0V2A5ghcs4LgQTk/zvR9n1fd9+1heFEXPOkTnLclcQJY
giRaUbLUpQa1mGhlhGzacu2yyBuV5flBQlJtRRpXaihq1AZVGbRHgNHhvKyjYlVaJUFU1bg5XzDzhiNE0zSbC0KX9e0nTdV0kHXL0WyEP1bX+oNyA4UN8PSK9OSjSaY2K1ptHacrPI6YZxnaVoS0e9NM2zK8Wi+ooK1cw1q1VJV5ibMH207HI7KbAdcCHW9R3HUlJ1W4LeabDdweIHdUgRg82aKBynOa9l3M8k1vPaXzHn8pYgrQHnQtJO0IsrNB
osuUlTk4KAgUIIxSh4Q7oXN6DOdhLVUHWi9UokK0fh+NsAFlAGO5QAwFwZSggMvNYvZ9gPg85FKoAYohlGadAxAyJg0qYKBzAIBOs2TiB9BIYgak5PQMlwJYmGHO4nheN4Pi+X5ARBcFIU5e0syWAgw499BI79oO0VwIQoDYNjwit0pMSENq9cryCSZzdl4lGOKuh/ITz3KSoxQzxpOFjK7OXS/pBlKOsEwNWUGZ2ZZVhExJ2v2Q5DdQY3Z9/W8I
ANBf2kgn5ngUAwpoP2QI2KnAQAABXoGwR4aIYRwipDSdEtp6QzQpBNKavB0G4iQUNVBI0+bLWZKyEY7ceR8lgDtEUVQDqcmOs4Bs6NEwKgbKrAsYwNgGiemgZw70EiYx4I8DyGxVatANO0bh5oxoID+oGdAzogbuhBhFMGEMAzJRhnDcMiNSTIywW5cY2gsruVLBTSAGYsxL1QATbQBo3IEzMeWBAr8ZgGlGAqLKEjORMw7FLfsg4EDV1QDrCcm4
pykLQNJTeS5VzrnCeLPcmQcjfhPDhJKQZw4kXIsieSzAKDEDxH0K04k6jxUKNJHJ6AALAVAuBKCsEEJIRQuhLC2SYkWTEp+WynJZbOVcYrLyPkKpNgClrEJIUwoGyiq1NeeQN7mXQHHPeeVYzGmPrlJoBUio2J4JdU0+N1aVTvsddYcCn6NQQPLN+rV2pf2YHkgpRSSl9UQfNZEBC0Q/XGtGYkOC5rUnwaiMJTIBbsnIVtKh7IhQ0N3mgO2EAGFv
XOgaAmezjQbE4VIpsLs+EeW0MaS6EjRiPB4L5CR2LKYyLkQDJRwNSSelUZOGl0MQxhgRpGX57JbacksaTKsCKqYjCEe46YoqfGMmZv402gTgmhKIaLMFEyhZFBFtuXcktWa9Mcv01ygzlbDKOaMzWgtdajPCpFFqMUP5FDNhkS21tiQIrtVAR2hd8AuzdssiQgAfv0ABAqgBYc0AIVKgBnPUAA/KAAdDg4bAD7foAADlAClxoAU0UQ4UB7mTdA/r
g3hqjbGxNKbY6XlzknNYqcjgOg2aQLO7hi350LsQYu9KmxlyiJXUgwTv6/3/oA4BoDwFQJgec0kHd/Dd3Dr6wNobI3RrDfG5NQ8R5jwno6tA08bWQACggBeViM3DBXnMippJFkQG3vtJtOV97J3GImSteVtmlHeu0fG1ZlRuyqvfdAuADT1Wfk1V+787lrD6KMCgww4LKHoJBfAygjD3gQO2IRWJcbwP6nghanz/mYNRtg6Rs00MfOBQqlakTXYQ
soZ6mFpIz3cARcda9eoFSlmGG0VUl0CyUsgLi/hxiDQKiLPWAmhYj64d+pDeREBFGAw9KDZlYnNFsvhhGJGXLXYlnOnjYYTjiY7u4LY+x+MSxlnNC428JZTT2O8uY5skq/FaplZzIJ3NJkKuWEq6JizlxlPiaLRJmq0CHjqJUjpSyslpIgB1CAW5ILMDbPQSBowjClMKOUhKn8KJURonRRiLF2KcW4rxfiZkMmfsstZMpPT7I6uuW5DyQyxFGqKG
M01UzLVG1mcl9eR7ivu10U2E+V7vGkn6/eqsTGeBtGGA1xYJy8K9Uqr+q5/7bmVS/lFmLcWEsobeYC9DhHvoyKw38kTuD3m0gw0RkhM4yHDoodtaFCLqPwvoSMAsGNZiPGNJIi6DYuE8JOgWIxqpPKjBVD90Ywn9uzRZQowGyiGUyfCdD6AWj2VKb0SphUCK+XWNNM41xzHMUbDrHMCVrZbP+eltCWVTmVWQH5iR+VwsEkav3HZpsfTqv6quoajW
gVmt6wtUt61/ZzYOpts6h2TsPXXfnOO9AgAbp0ANNegBvnxjam9Nawleq7RHHWtpaEbp0rdWnOic61FxLqSFtFcWTtq/sB0D4HIPQdg/BtsiG2DIfbqQTuHAx29wgFrtXIpF3j1YCu1Aa7edbsXru/dHX5ldeEmUBAFRqO3oytqDYU2GCbNPoVUo16FRX1EXjdqM2RLjB/Zc65AGVtrFaIhZwAIAT3n0OB8YfRbi3B4Nge89BmAABkh3s1Q6dlBe
2qWzUO9NY7ALkGLRBcRq74KbuQoow92h4pnu8OVMwmrWmcUjCVNoTywx99Gch6JjREhJNA2k0yxHcnWWw1R71oo+jsNxgxldJM1YUyYt5Rj1zHzELGLAP0phMxGA+3cV3wVDdl8RZgpwCQczlWcybHp2X1QHc2K083jyZx8xZ2SX81STImCx60Egi0ICEEeHICMF5CSzABSyCwizkkUhUjUg0m0l0n0kMmMlMnaWPVEisgYJXAq3ZyqwGVqwNXq1
53GUZ0a0FxmWtQPVSzIOWXTwPhaHcg0PyjPidTmHG28kLDL2qjwnaCrxfiUJNjSwkCoJoNwDoOwC2wGh2wIzQVn2nxw0vxO1cLOwnzp2ISVTdk2nI2oSo03xo23xOnKmMTpnYUxlYUxxvk42JFexfTrE+n+SR1vzh2FgR1FiR2DBf0Uzf0gA/xe3lFrHEUeCL3aETEyO035XJjxz1VtllGTFaFJwcnJ27EpwgA5i5n53QPCSVXkMgDVTFkIOlXEL
lkkKVm5xkLnj521jQIUOmStWsNtVF0nidRFwyDdWdhl1PDlwgDQkQA4D9m1wnFDhOLOPSEuKDyPSLVN31zTgrSG0zmznwD1wkHrUbTRCtzbQ7Qb0wCbxbzb2UA7y7x7z70H2HyKBHS7nwA1wkDuIuN9iuKoxD2XSnlIBnij23SaNdjj0YM63nG6yEKoB0O4FRXGB0JG3ZGvk8SNEG1/HL0/QVAsL/SsPXXCy/hqRAjAgghgngkQmQlQkwmcPwz8P
cO8PxBUxJDlOlPH1lKKEZCXzWjIzu1dkoz2giKe0lGlGYzzETEm3VHciunelYT+2cCNHzF4yERETEQpSyKfxhzpXv29Fk2vyWRRxKM5RRho0VEkUY1ESulNKyjdmxwzXozmGrFYSERLDYw43REgLQEmCfXaCzzci6KlTZ1tWpyGLVJGJI2wKTx4DiQZWZwllZyQMq1mL1SkIWI6ARSaxWNpwgH1laxuWF2kXwigGUiqiWGUG4GiRSCSQ7R/gQD/g
ARgCARAV9jAQgWgVgWvGbFwDgCrAxlEWzL2RKhKim3tmwCEC7GcHlHrCESJzgI8VGEkRDIukrKbHSGIEHOWGHNHJPAwEII7QeGeFeHeE+G+GYH+GBFBAhDXOUA3NjDsXKhB1BwLHBzlE6M/LNmPNPPlDVEmAmEY1aDJVEXKgrK8z1lCCgBtH0ELhkGOEgTYCWAzTGLJH7IYlKwzFwBpzNSKGfKYsIhYq/kpLRDgBotrO7BPACzqDtkKA2BPEpzAF
EokuDN4ySPDNGFxjP2yVjLjATNlCLwbANCktshUIWQpNKxWQz1QGVGz2Gz0PZFvPxjmAkTfXZPWFaC5MWx5MAwkEomolonoiYlYg4i4h4j4gEleRcPn3OzlM8MVMnwpGVIXwuyCK1KhR1I3zhVQFoxGHB3Okxyuk8UwqEW0NJFxUugJUx00yJzBwh2iutDdIk1h3PXGPyPUShl9IUx0QDIMW/xNDgLKuUvEVwuQqbGjOejzH1A+lx2M1cSmA+zVG
rGSOszJ0QN6OQMGPbPYoCMVVLM/MWUIrwNVWrKSWmJlgkMbPmJVhbNkKLI3UUI2N5IxH7NfMcCqA/KPC/JrKgA7XtzAwgygxgzgwQxoI90rxInXM3LQANHzHSONHGpetQpPOlHPO+0TExizyzJYz40fI4uWAevfKiU/PHIRh/Nrn/IbiApApbnAuBsgtBtQHaBKsxUx1woQqunrGBthq7Awo8SynEXG00w6HsWGAxo3RIrIoopcmotosuoYqrS4q
sh4sls4uYpCF4uMs5AEtooPBErSXErAEkqPGktkrAD4U6rJTP0x16tRTaDUpGuvTGtXj1v0t2sMqT3WBVo+MvWegGovTvSsp1NVDVHwqs3fVOVwAYhcpr2WxsPQFYKUlUnUi0h0j0gMiMhMilLHzioioVP+VivCuLNBRI2CNuySoLBSroUNPZCMXrExivgvyKE9Tcj1HYWhqqtkRqpyPqogEZS9Mfx9OR1ao5WU0DOXiLEMysyGvTN1HEXeihqsy
FXZCNFYShr41zJ6N7GWsc0lowNnC2uKx2tJKrIILesOsgA5zmLq3OqWLkNWKuvWLa17P23uqHKetxpevxoyEJr/PrkAqblAtbggqgrQDOgyKbq2LQvhoJUJ08ifRJQ8VRSvPrEFowCxsfpHOfqfO/K/hBLBNb3b07271737yHz/upriCvlxlttZvCjhvhXAfVD3KmC6tByFFaAQfwGFoMFFqosEroqvqlvjkVtYvluWBlooDls6WENVq4Y1qPANu
1t1rqH1rST3WHvALqG8hP3sVtr0vkbinADZnWDgDgARH6WepwgzDSDWEThzC6AYEIAQAoGUkauIGyNOBcdce2AgGPIIgJqOH0ARCh1brqvcc8Z0TbB8YcYfwKJqqKO0X7ryA8ZEBCZ8eglH18JVMISKGCe8dSD8YwUzricybfp8ZyZ8LCon3ia8cKdSDYkCPzusYKfep8bOLXzCIyYSayf0Ggkl3dU9TqbacqY6e2PDx5Xyb6YadSHTR+PQGCFOD
f3KcSeyaiGlv4bYt6YqbGf0C3CEeWbwldspmwCxDhAEjBq4UVG8hNroZKkpXRH2dtHwB+GJGLEVGLExgLD40QoawgCMDYAMBMfqAIBnmJBULmfaeqY2swJPXCXcZ9BIDFyLOsxIGhw3mUltC/kdCtE4gxegmgjRHHmUDHHwidC3D2CJaJaxdKXimBftRkTOKzk4C7HkIgDgECDMGEGYABG92IFhdWusYGIQHHjvm9yfqwNJHSFwE0GCFvEj0tyIG
pqlabF93MdXTxN5OECgE3W4DXSBbsGYhT0yCBF9zgF9jYBWE2bFYlZuvAEkn6NhHCFHNEJXCAA==
```
%%
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 88 KiB