提交 71f77d94 authored 作者: 王鹏飞's avatar 王鹏飞

bug fixes

上级 32f57a04
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCa/rXgu7+M2nPs
WQoCRQO8kb7QgVKUaIS0WUk1u38W7T/vBoo43Lvfl6PO+zbanQa5J3fDMOmcXH4y
UDEpS1rAWH2fIC4qyWBbLZCE7uXt5JvYZH10DdCcQe7eWWW8DlTaVXvbaztLslDY
8tkHWFnTZetbwuXiB+tVhYzuNxHhyv/rOEEpJel8qXMcU0aq7LNlMiCKHFCU88Uc
9DBN8BPqpi6kaTuNIN8UAEWnxsvssz2HdBKe3JKS7H5OXdtd+hGkL3gfwk1vGVV/
jX5sxWbbO6dIR+EdXP/EUTJ08xWm1Fu4wZ2W2mjaZoAE3WEYSvubUBY68x71fzGs
9KK0Vr8fAgMBAAECggEActxlfojEGCbfl3wYjbwFW94KMUxVHUQja99rAJXVRfFF
2uXW0vLJi5Y9v6qtaO7LR7U27IC37rcgkjqZZAfC1h394kmfzPd1H7yxh8HexSAQ
WhmGWtXODa5SzZYkbWuVeEO3SNC7nYokndHCAc54qs+xzkutvoat4K/a08Idz1xQ
a6dg3vQi9N4L4MsiM/2H3q+CtTIoIbi3PX5zItdbJIgnXMjERAv9AyXtU5qthySO
+0VGD4RnsO9MmqD3O8mrKKK8Wprp3XIcxC7bLRHajOTjhEUQSQJcGrAn9zd2a+Nx
xKqYeH4NWPhb57GPtRfba0YANQ3jyZXGRSvFlwq1cQKBgQDEIccL5en56kaSudtJ
awDdwbOWn82OLRVVIY1/bAHidWudRhtNo/i04Hd46Sgmbf81rFKYdkMB79sVUsYg
D6L8X5uvHxaAcn3tT92dzIMV/UxSruEwkv/lTmQQ7v5IugtFV0RL7HbS28yGNF8m
9bTND6VI1cisluewNrur4QhAdwKBgQDKTmPiowqBFGRRHNEWDgAWMpNQsa/BgUlr
U5qDRTwa3eEHXJB0ikVjKOXOJ4pSDgtS/veo+NjHoi65lUSIqbLnxuZV3sFw9miM
808VOfU+i8hwOAKCkNqvnE227gPzkhDa1pb07mNoVMZCPRcnjRdEgRCa71iranAv
LkL8WF+ImQKBgQC93YEGCJ03XM7S7W7WJOriwcgrkSl5cDVNgzyqVJGCe28hAiQe
RhTWbNHbT8KZaTR87gPLKfj2IA7zFn1LvjdmnttkbPDoiW1UVVNRlhB0MhA3nqnK
zxNAFWITbnjlSIzupGsuIIxq1XKpnHtciNFtDa9Q0fwA79j8IhANdLv7QwKBgFGE
Cp1cgrQGKnHAgcM4OvK2yEMghagb1yCG3GB+ejx9INodgxtiR5kv9oD9z69Gd2um
ztXoBzlRcTBYI/hJIIxhyZfaHOnOb8wzka8E3nuoSUhmWSSRB3zxJyNJfpAbT+1N
wB/LGoUEe6pfAUBvimuQ8cbsIDdZuQBZzKXvWfcpAoGAaHe9uStjqC1wSjPWAB/E
vB+pHEf9qBo8pzoFXWa9/ig6nknKs0MOSoilDLeWaF6CBGaUQFG/M+UndW5bLEJL
GuWnfOh1mY46ftu5tOjv9iohyMVhm0YWsGNd5axkNfpAOEMeG5F6q9ncGH31yK7w
an6cmVvy09SAzFVQ3QB2hwU=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIEADCCAmigAwIBAgIQSc3fUaqSO/y4yk7OzuIKLjANBgkqhkiG9w0BAQsFADBP
MR4wHAYDVQQKExVta2NlcnQgZGV2ZWxvcG1lbnQgQ0ExEjAQBgNVBAsMCW1heEBi
b2dvbjEZMBcGA1UEAwwQbWtjZXJ0IG1heEBib2dvbjAeFw0yNTAyMDgwOTU5MDla
Fw0yNzA1MDgwOTU5MDlaMEMxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBj
ZXJ0aWZpY2F0ZTEYMBYGA1UECwwPbWF4QGJvZ29uIChNYXgpMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmv614Lu/jNpz7FkKAkUDvJG+0IFSlGiEtFlJ
Nbt/Fu0/7waKONy735ejzvs22p0GuSd3wzDpnFx+MlAxKUtawFh9nyAuKslgWy2Q
hO7l7eSb2GR9dA3QnEHu3lllvA5U2lV722s7S7JQ2PLZB1hZ02XrW8Ll4gfrVYWM
7jcR4cr/6zhBKSXpfKlzHFNGquyzZTIgihxQlPPFHPQwTfAT6qYupGk7jSDfFABF
p8bL7LM9h3QSntySkux+Tl3bXfoRpC94H8JNbxlVf41+bMVm2zunSEfhHVz/xFEy
dPMVptRbuMGdltpo2maABN1hGEr7m1AWOvMe9X8xrPSitFa/HwIDAQABo2QwYjAO
BgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU
Snxuhaez2tptVFUj9BqqivFtRyIwGgYDVR0RBBMwEYIPZGV2LmV6aWppbmcuY29t
MA0GCSqGSIb3DQEBCwUAA4IBgQB3Jzdi7hdgMO1t/YF10cgmEF6sQw5z19simdHh
MvqhYPxzg77xlurvOESRHFrhJm1RXWb5bt7WRrMh0WUxGRsw6s0KwFkBuKheSp4m
kdenFIORKFkQUMfru5DK/BNYf75KnI+xjVDYhUArmj9QN8i6gYgcsDT9h0XQc+rr
F+TtY67d4K2JKbPc/zFjj5ux8GT7YgtO4fjJR4pfcn0opLZNuFIRv5QeufXlGZ25
EPl3Xh2LMIi+KvNWZ3s1OcQ5ad2ZqzWgyaZ2X3VkObw30x8qMvj0HxlfncObwb0O
b85+0krtO3t49ZarU2xHLzgy0M+Pex9yRYrE0qRKpIVeKuyCRDrSz22mtK+Lj4fM
Raa3iQF2o2kTK7wa5mVe9TZ7z9iXziSz2ZOivGNUphdKyXWvrKhZZXWhWA7fG/o6
1y9bBH39glc7erJleHPl7+/xSJ7kDyOHgGOFwUOnhWXZU0qZa2kAC5xRypA0Q0qi
TiCzAwTFrFuRf9Enkhy8yT3kU68=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAwZGHX8Zg+EP5uwnEBWkQazq8DMnKz3QfcNRUjFsxsZjM/98r
oYYp+K6/i/b8JXAVMqjC9+X/ZajgbDPLTrgDJ4TQ70ajdusqG3swNqG0qLUogNgU
PcgVRKr2Pk+m79GD/nnxFgeaG6eBfLsb73G2cQUwsgi3bjf6mX6b9bjxjqzwX0PW
es27yyqdS9uQFzV5KLTA2FJJjGGbg54ZLxVc01aVXx2gG0eLnOFcDSmgXUN4hBmN
gYF4FYHhOVXdMl2+yGGp6IvtIIrt+cp2/TQePnxB2QYwrlDMajHrKp0x7LsqWwZT
jepPgGWWDssiSgTCYVaPx28ESbotpzR7D+LlHQIDAQABAoIBAQCCvXGrHcmXRgph
62mrodgGJQioto82aZ9mzPNCTcIVyzgDRtAoa/7jSdx0g+CwxLB8pAH0ADPtjQ/v
5VfXlnAC/DFGu/Zittmc8CqTa8si/CEcTVX2mLLMy5BAa/o8Fs5JTkGo+H99WDkc
byCiLLLmSXQne72xQzwO+rYKVN1K2JUfzch5wpv86IgfJm0gNEOOvtToeNeMbOWj
7AFfpqq7bRMIdZZZhm2n33duSCSnAO7/OuKHY2/RUkc6FvamAth/ME5S2eHrB7yb
KOMZTJH73xnZc3gmsBiIfC1BsqzV/37Ptd7ncTxuK5YZPXIyJ/BjnDTe712LAz+r
f3FEmtJdAoGBAOdPpbT1ylZKinxEIP4sUPUUrrlXqQxYn2xTOCSBz1dB7OpeqiD+
OBa6ur5Sh0+Ot/VRqV2MbXaGee/qqBiziFH23wKoFc6kxeH8RCv247y89yOHqpCP
SM4I7d10RpPh/POU0apGNOP4HOLOMY4V11u68em9hQDeN6oUBWKvDWTPAoGBANY6
mZ/EWKOFJSPfJNNtfXDO27P12ENsa9UvDv7f+FrcPqGkJq1qFBr3ySBjUE7hTv1e
jedRHtBg5Y038vj/MTofEPSaa5POFgzwfG5TPYCcrZkDoLosnuQ92yafMxZPAf16
Nt3vimpxV2Hwf1Nl3IAU/BavngdohWJkO+yOuupTAoGBAMxkTrJmdhJl75T6xoSS
OD83tWTFFvV34fdgWb24jrQ15tj6KS7aNEmxWo4Ocs5T+C1nqVamXZtcHKdpHHwn
OA/lKw435H0ikFCuDrcig/4ko+TbXlY6pkSZE0aaFjtad5/tIo9pVhcTCMNJG/TH
S/Mcb+LwunQX5+v7oP6gXB91AoGAFDbjWBgG5ScjIgdkSi8CrypVwN1p0rLgWfVe
zN4FaU1u+4GpxKNF0mWfLNcyNL893NqXOUSGS9NY1cJ5wtURqBJWXz5S+Fdx7Tak
ByUDoKcoGlAlUmvzckYD79kF0Q0Tev+VPcvkm7amMC+pVA1AiTVxtBJOLxTFwUsD
/IZbTNECgYEA5uwkBWpb/2yYk86cfuUWJjZ0k8jZPrdG4d9gTdD1Fj4abS3FniKM
x9eN8BcnH0j4raRo+MESzYf5hLbfHRG01oRtBQFZXEM0k/zkkRYdKWG1Ulg1+iZR
ZG/lblczYEUW/IOPYZKMX8c5nq7F6huLsioIvsYOdCGjLZbyRHjEPv8=
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIGtDCCBZygAwIBAgIQJtN62MbxMBaLhLadTXD/LzANBgkqhkiG9w0BAQsFADBj
MQswCQYDVQQGEwJDTjE2MDQGA1UECgwtQmVpamluZyBYaW5jaGFjaGEgQ3JlZGl0
IE1hbmFnZW1lbnQgQ28uLCBMdGQuMRwwGgYDVQQDDBNYY2MgVHJ1c3QgT1YgU1NM
IENBMB4XDTIzMDkwNzA1NTM0MVoXDTI0MDkwNjA1NTM0MFowgY4xCzAJBgNVBAYT
AkNOMRIwEAYDVQQIDAnljJfkuqzluIIxEjAQBgNVBAcMCeWMl+S6rOW4gjE/MD0G
A1UECgw25riF5o6n57Sr6I2G77yI5YyX5Lqs77yJ5pWZ6IKy56eR5oqA6IKh5Lu9
5pyJ6ZmQ5YWs5Y+4MRYwFAYDVQQDDA0qLmV6aWppbmcuY29tMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwZGHX8Zg+EP5uwnEBWkQazq8DMnKz3QfcNRU
jFsxsZjM/98roYYp+K6/i/b8JXAVMqjC9+X/ZajgbDPLTrgDJ4TQ70ajdusqG3sw
NqG0qLUogNgUPcgVRKr2Pk+m79GD/nnxFgeaG6eBfLsb73G2cQUwsgi3bjf6mX6b
9bjxjqzwX0PWes27yyqdS9uQFzV5KLTA2FJJjGGbg54ZLxVc01aVXx2gG0eLnOFc
DSmgXUN4hBmNgYF4FYHhOVXdMl2+yGGp6IvtIIrt+cp2/TQePnxB2QYwrlDMajHr
Kp0x7LsqWwZTjepPgGWWDssiSgTCYVaPx28ESbotpzR7D+LlHQIDAQABo4IDNjCC
AzIwDAYDVR0TAQH/BAIwADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8veGluY2hh
Y2hhMm92LmNybC5jZXJ0dW0ucGwveGluY2hhY2hhMm92LmNybDB5BggrBgEFBQcB
AQRtMGswLwYIKwYBBQUHMAGGI2h0dHA6Ly94aW5jaGFjaGEyb3Yub2NzcC1jZXJ0
dW0uY29tMDgGCCsGAQUFBzAChixodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwv
eGluY2hhY2hhMm92LmNlcjAfBgNVHSMEGDAWgBT6oMvCx12BtSCSByALtjtwOwkO
VTAdBgNVHQ4EFgQUXm2TAFqEePvMkmcMN+bVXSvLTH8wTAYDVR0gBEUwQzAIBgZn
gQwBAgIwNwYMKoRoAYb2dwIFARYCMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8vd3d3
LmNlcnR1bS5wbC9DUFMwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4G
A1UdDwEB/wQEAwIFoDAlBgNVHREEHjAcgg0qLmV6aWppbmcuY29tggtlemlqaW5n
LmNvbTCCAXwGCisGAQQB1nkCBAIEggFsBIIBaAFmAHUA7s3QZNXbGs7FXLedtM0T
ojKHRny87N7DUUhZRnEftZsAAAGKbjQU6wAABAMARjBEAiAMbEi/VFFT/mgWiXPw
WgVT5THVJCfr9j1oIcfiB5MFHgIgJ2nAv7xTmfoZfcO8sWoGigLdN8QtGksVUSI2
86Wg3O4AdgDatr9rP7W2Ip+bwrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAYpuNBUS
AAAEAwBHMEUCIDmQ1/B1s3jRr+0SvDSWEFN9/b4/W8QV5yULASXqQkYqAiEA0wKZ
lklUASXMM8mluAimD5e4qSXu76+148bfZA2d404AdQBIsONr2qZHNA/lagL6nTDr
HFIBy1bdLIHZu7+rOdiEcwAAAYpuNBefAAAEAwBGMEQCICyokQlEyxPTPYNBZzwv
W8AxbKUJl+I5TbJEJsiFECRUAiA8fA86Hof/yLHhMl4amx5AttDNhpDrCHDK1N7m
NYx9XjANBgkqhkiG9w0BAQsFAAOCAQEAq4Q2vW3Xh5TOYk/DofnV2uRiK08P5a5I
NRE5Tet3J5rp2WnNgXoSAOabqWGI6VrTyenTZxrmS/2Aq2A008WOj4Z7T3P9iDS/
MgJkPmc/REqHr15LIDnyRRfmn9+1ShVMwukYHSmZgPewAzSkKdGFN85t3uCEUnXz
kna3ZmSqgJrSWSO9n/3t/kICsVivjqSUuHtnCSbBa+DTSNxIkbkr1t1RJkF4KvSk
AKkvyojoKoeCd+WWEl2MBHY6TK4CzfyLN5qhQub0XqTOh6cG9TwALcLZ4MQeaeOO
ZkGv9DcyeOz7FwwzFa+vAyzhq2XlDPLlpZ4ELALbaqnq3x7HHpzlpw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEzzCCA7egAwIBAgIRAPJECC2rqQ2ljHLp8pqTQK4wDQYJKoZIhvcNAQELBQAw
fjELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEiMCAG
A1UEAxMZQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQTAeFw0yMjA3MDEwNzQ4NDda
Fw0yNzA2MzAwNzQ4NDdaMGMxCzAJBgNVBAYTAkNOMTYwNAYDVQQKDC1CZWlqaW5n
IFhpbmNoYWNoYSBDcmVkaXQgTWFuYWdlbWVudCBDby4sIEx0ZC4xHDAaBgNVBAMM
E1hjYyBUcnVzdCBPViBTU0wgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCz2nxSPEsMeRBdunf+KZ8CrJIj9DUWGVu05WWyES+QkMHzVHCZt8cB2Blp
qzHHqFsXSDHVzcMxDeXBbudmQwYbg5NpSwY9vJHPTl6vlAlK4UWN4+oPTgP9//RN
N6KLmK3kjZ2Zc9F3kFKVaziSwVNjVvneacoUnz6blwLLBc5QelQ8oDT0eEv0QBAY
I0T8pHDgcvWQqTBaRrOb80plDhYju464XbVhtOHvFCiBIkKnfUBnBfptWjGM8Kis
sq4r8YX35B/pioj9g1YX34MLt+5L3vvWXEb2aMiwwB1Z3bSeeiU3N8aMuSb9E9jp
zd0uhzRameU7jAIAr8uuunb7GUJ7AgMBAAGjggFhMIIBXTASBgNVHRMBAf8ECDAG
AQH/AgEAMB0GA1UdDgQWBBT6oMvCx12BtSCSByALtjtwOwkOVTAfBgNVHSMEGDAW
gBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0lBBYw
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9j
cmwuY2VydHVtLnBsL2N0bmNhLmNybDBrBggrBgEFBQcBAQRfMF0wKAYIKwYBBQUH
MAGGHGh0dHA6Ly9zdWJjYS5vY3NwLWNlcnR1bS5jb20wMQYIKwYBBQUHMAKGJWh0
dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9jdG5jYS5jZXIwOgYDVR0gBDMwMTAv
BgRVHSAAMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8vd3d3LmNlcnR1bS5wbC9DUFMw
DQYJKoZIhvcNAQELBQADggEBACWzdb59JyYc/WivKUcTEZ+H8WOTuv3AiR6rPljB
QUEB/1kxIeBK+276WLJn0nFNFuT9QMUBo/iUvNvuRQqVjouuYB0Oea6zKQpeMWry
oYtbheW+5NYAbdl9tYE4MRRK9zBLMRrQz35q+XfgMInozidhNHCvuulWk38OMM51
O73z53+R1879nnoZZznoYnrnkISVDjlhe6OSMifvIJAwSYwH2z79Y6CTVgtqTDR9
793Gr7UUmk5ydoxClxnku7voTX8iJUPcuAjElxFrhSQoxm6uXXOfItEqGvLkWAcq
IC5mcyU9VpUg1YP+KkDMh+KQM7/k+2ka1em9hO+QHvJ08UQ=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEtDCCA5ygAwIBAgIRAJOShUABZXFflH8oj+/JmygwDQYJKoZIhvcNAQELBQAw
PjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHogby5vLjESMBAG
A1UEAxMJQ2VydHVtIENBMB4XDTA4MTAyMjEyMDczN1oXDTI3MDYxMDEwNDYzOVow
fjELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEiMCAG
A1UEAxMZQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAOP7faNyusLwyRSH9WsBTuFuQAe6bSddf/dbLbNax1Ff
q6QypmGHtm4PhtIwApf412lXoRg5XWpkecYBWaw8MUo4fNIE0kso6CBfOweizE1z
2/OuT8dW1Vqnlon686to1COGWSfPCSe8rG5ygxwwct/gounS4XR1Gb0qnnsVVAQb
10M5rVUoxeIau/TA5K44STPMdoWfOUXSpJ7yEoxR+HzkLX/1rF/rFp+xLdG6zJFC
d0wlyZA4b9vwzPuOHpdZPtVgTuYFKO1JeRNLukjbL/ly0znK/h/YNHL1tEDPMQHD
7N4RLRddH7hQ0V4Zp2neBzMoylCV+adUy1SGUEWp+UkCAwEAAaOCAWswggFnMA8G
A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAh2zcsH/yT2xc3tu5C84oQ3RnX3MFIG
A1UdIwRLMEmhQqRAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNw
LiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQYIDAQAgMA4GA1UdDwEB/wQEAwIB
BjAsBgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vY3JsLmNlcnR1bS5wbC9jYS5jcmww
aAYIKwYBBQUHAQEEXDBaMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1j
ZXJ0dW0uY29tMC4GCCsGAQUFBzAChiJodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0u
cGwvY2EuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQGCCsGAQUFBwIBFhhodHRw
Oi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQELBQADggEBAI3m/UBmo0yc
p6uh2oTdHDAH5tvHLeyDoVbkHTwmoaUJK+h9Yr6ydZTdCPJ/KEHkgGcCToqPwzXQ
1aknKOrS9KsGhkOujOP5iH3g271CgYACEnWy6BdxqyGVMUZCDYgQOdNv7C9C6kBT
Yr/rynieq6LVLgXqM6vp1peUQl4E7Sztapx6lX0FKgV/CF1mrWHUdqx1lpdzY70a
QVkppV4ig8OLWfqaova9ML9yHRyZhpzyhTwd9yaWLy75ArG1qVDoOPqbCl60BMDO
TjksygtbYvBNWFA0meaaLNKQ1wmB1sCqXs7+0vehukvZ1oaOGR+mBkdCcuBWCgAc
eLmNzJkEN0k=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM
MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM
MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E
jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo
ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI
ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu
Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg
AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7
HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA
uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa
TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg
xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q
CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x
O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs
6GAqm4VKQPNriiTsBhYscw==
-----END CERTIFICATE-----
...@@ -7,7 +7,9 @@ import { getNameByValue, groupTypeList, updateStatusRuleList } from '@/utils/dic ...@@ -7,7 +7,9 @@ import { getNameByValue, groupTypeList, updateStatusRuleList } from '@/utils/dic
import { getGroupList, deleteGroup } from '../api' import { getGroupList, deleteGroup } from '../api'
import { useMapStore } from '@/stores/map' import { useMapStore } from '@/stores/map'
import SelectUser from '@/components/SelectUser.vue' import SelectUser from '@/components/SelectUser.vue'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const FormDialog = defineAsyncComponent(() => import('../components/FormDialog.vue')) const FormDialog = defineAsyncComponent(() => import('../components/FormDialog.vue'))
const ViewDialog = defineAsyncComponent(() => import('../components/ViewDialog.vue')) const ViewDialog = defineAsyncComponent(() => import('../components/ViewDialog.vue'))
...@@ -25,13 +27,13 @@ const listOptions = computed(() => { ...@@ -25,13 +27,13 @@ const listOptions = computed(() => {
if (isReset) listParams.updated_operator = '' if (isReset) listParams.updated_operator = ''
params.updated_operator = listParams.updated_operator params.updated_operator = listParams.updated_operator
return params return params
} },
}, },
filters: [ filters: [
{ type: 'input', prop: 'name', placeholder: '请输入群组名称' }, { type: 'input', prop: 'name', placeholder: '请输入群组名称' },
{ type: 'input', prop: 'id', placeholder: '请输入群组ID' }, { type: 'input', prop: 'id', placeholder: '请输入群组ID' },
{ type: 'select', prop: 'status', placeholder: '请选择群组状态', options: statusList }, { type: 'select', prop: 'status', placeholder: '请选择群组状态', options: statusList },
{ type: 'input', prop: 'updated_operator', placeholder: '更新人', slots: 'filter-user' } { type: 'input', prop: 'updated_operator', placeholder: '更新人', slots: 'filter-user' },
], ],
columns: [ columns: [
{ type: 'selection' }, { type: 'selection' },
...@@ -43,14 +45,14 @@ const listOptions = computed(() => { ...@@ -43,14 +45,14 @@ const listOptions = computed(() => {
prop: 'type', prop: 'type',
computed({ row }: { row: Group }) { computed({ row }: { row: Group }) {
return getNameByValue(row.type, groupTypeList) return getNameByValue(row.type, groupTypeList)
} },
}, },
{ {
label: '更新方式', label: '更新方式',
prop: 'update_status', prop: 'update_status',
computed({ row }: { row: Group }) { computed({ row }: { row: Group }) {
return getNameByValue(row.update_status, updateStatusRuleList) return getNameByValue(row.update_status, updateStatusRuleList)
} },
}, },
{ label: '最近计算完成时间', prop: 'record.updated_time' }, { label: '最近计算完成时间', prop: 'record.updated_time' },
{ {
...@@ -59,12 +61,12 @@ const listOptions = computed(() => { ...@@ -59,12 +61,12 @@ const listOptions = computed(() => {
computed({ row }: { row: Group }) { computed({ row }: { row: Group }) {
const color = row.status === '1' ? 'var(--main-success-color)' : 'var(--main-color)' const color = row.status === '1' ? 'var(--main-success-color)' : 'var(--main-color)'
return `<span style="color: ${color}">${getNameByValue(row.status, statusList)}</span>` return `<span style="color: ${color}">${getNameByValue(row.status, statusList)}</span>`
} },
}, },
{ label: '更新人', prop: 'created_operator.real_name' }, { label: '更新人', prop: 'created_operator.real_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', slots: 'table-x', width: 240 } { label: '操作', slots: 'table-x', width: 240 },
] ],
} }
}) })
...@@ -94,7 +96,7 @@ function handleUpdate(row: Group) { ...@@ -94,7 +96,7 @@ function handleUpdate(row: Group) {
// 删除 // 删除
function handleRemove(rows: Group[]) { function handleRemove(rows: Group[]) {
ElMessageBox.confirm(rows.length > 1 ? '确定要删除勾选群组吗?' : '确定要删除该群组吗?', '提示').then(() => { ElMessageBox.confirm(rows.length > 1 ? '确定要删除勾选群组吗?' : '确定要删除该群组吗?', '提示').then(() => {
const ids = rows.map(item => item.id) const ids = rows.map((item) => item.id)
deleteGroup({ ids }).then(() => { deleteGroup({ ids }).then(() => {
ElMessage({ message: '删除成功', type: 'success' }) ElMessage({ message: '删除成功', type: 'success' })
handleRefresh() handleRefresh()
...@@ -114,7 +116,7 @@ function handleView(row: Group) { ...@@ -114,7 +116,7 @@ function handleView(row: Group) {
<AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange"> <AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange">
<template #header-buttons> <template #header-buttons>
<el-space> <el-space>
<el-dropdown v-permission="['experiment_group_create_dynamic_group', 'experiment_group_create_static_group']"> <el-dropdown v-if="!userStore.status.group_status">
<el-button type="primary" :icon="Plus">新建</el-button> <el-button type="primary" :icon="Plus">新建</el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
......
...@@ -9,7 +9,9 @@ import { useMapStore } from '@/stores/map' ...@@ -9,7 +9,9 @@ import { useMapStore } from '@/stores/map'
import { getNameByValue, updateStatusRuleList } from '@/utils/dictionary' import { getNameByValue, updateStatusRuleList } from '@/utils/dictionary'
import { useLabelType } from '../composables/useLabelType' import { useLabelType } from '../composables/useLabelType'
import SelectUser from '@/components/SelectUser.vue' import SelectUser from '@/components/SelectUser.vue'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const LabelFormDialog = defineAsyncComponent(() => import('../components/LabelFormDialog.vue')) const LabelFormDialog = defineAsyncComponent(() => import('../components/LabelFormDialog.vue'))
const LabelViewDialog = defineAsyncComponent(() => import('../components/LabelViewDialog.vue')) const LabelViewDialog = defineAsyncComponent(() => import('../components/LabelViewDialog.vue'))
const LabelRuleDialog = defineAsyncComponent(() => import('../components/LabelRuleDialog.vue')) const LabelRuleDialog = defineAsyncComponent(() => import('../components/LabelRuleDialog.vue'))
...@@ -33,7 +35,7 @@ const listOptions = computed(() => { ...@@ -33,7 +35,7 @@ const listOptions = computed(() => {
params.updated_operator = listParams.updated_operator params.updated_operator = listParams.updated_operator
} }
return params return params
} },
}, },
filters: [ filters: [
{ type: 'input', prop: 'name', placeholder: '请输入标签名称' }, { type: 'input', prop: 'name', placeholder: '请输入标签名称' },
...@@ -43,10 +45,10 @@ const listOptions = computed(() => { ...@@ -43,10 +45,10 @@ const listOptions = computed(() => {
placeholder: '请选择标签类型', placeholder: '请选择标签类型',
options: typeList.value, options: typeList.value,
labelKey: 'name', labelKey: 'name',
valueKey: 'id' valueKey: 'id',
}, },
{ type: 'select', prop: 'status', placeholder: '请选择标签状态', options: statusList }, { type: 'select', prop: 'status', placeholder: '请选择标签状态', options: statusList },
{ type: 'input', prop: 'updated_operator', placeholder: '更新人', slots: 'filter-user' } { type: 'input', prop: 'updated_operator', placeholder: '更新人', slots: 'filter-user' },
], ],
columns: [ columns: [
{ label: '序号', type: 'index', width: 60 }, { label: '序号', type: 'index', width: 60 },
...@@ -58,7 +60,7 @@ const listOptions = computed(() => { ...@@ -58,7 +60,7 @@ const listOptions = computed(() => {
prop: 'update_status', prop: 'update_status',
computed({ row }: { row: Label }) { computed({ row }: { row: Label }) {
return getNameByValue(row.update_status, updateStatusRuleList) return getNameByValue(row.update_status, updateStatusRuleList)
} },
}, },
{ {
label: '状态', label: '状态',
...@@ -66,12 +68,12 @@ const listOptions = computed(() => { ...@@ -66,12 +68,12 @@ const listOptions = computed(() => {
computed({ row }: { row: Label }) { computed({ row }: { row: Label }) {
const color = row.status === '1' ? 'var(--main-success-color)' : 'var(--main-color)' const color = row.status === '1' ? 'var(--main-success-color)' : 'var(--main-color)'
return `<span style="color: ${color}">${getNameByValue(row.status, statusList)}</span>` return `<span style="color: ${color}">${getNameByValue(row.status, statusList)}</span>`
} },
}, },
{ label: '更新人', prop: 'updated_operator.real_name' }, { label: '更新人', prop: 'updated_operator.real_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', slots: 'table-x', width: 320 } { label: '操作', slots: 'table-x', width: 320 },
] ],
} }
}) })
// 刷新 // 刷新
...@@ -128,7 +130,7 @@ function handleSelect(id: string) { ...@@ -128,7 +130,7 @@ function handleSelect(id: string) {
<div class="label-left"><LabelType :active-id="listParams.type_id" @select="handleSelect"></LabelType></div> <div class="label-left"><LabelType :active-id="listParams.type_id" @select="handleSelect"></LabelType></div>
<AppList v-bind="listOptions" ref="appList" class="label-right"> <AppList v-bind="listOptions" ref="appList" class="label-right">
<template #header-buttons> <template #header-buttons>
<el-button type="primary" :icon="Plus" @click="handleAdd" v-permission="'experiment_tag_create'">新建</el-button> <el-button type="primary" :icon="Plus" @click="handleAdd" v-if="!userStore.status.tag_status">新建</el-button>
</template> </template>
<template #filter-user> <template #filter-user>
<SelectUser v-model="listParams.updated_operator" placeholder="更新人" @change="handleRefresh"></SelectUser> <SelectUser v-model="listParams.updated_operator" placeholder="更新人" @change="handleRefresh"></SelectUser>
...@@ -137,14 +139,22 @@ function handleSelect(id: string) { ...@@ -137,14 +139,22 @@ function handleSelect(id: string) {
<template #table-x="{ row }"> <template #table-x="{ row }">
<el-button type="primary" plain @click="handleRule(row)">规则</el-button> <el-button type="primary" plain @click="handleRule(row)">规则</el-button>
<el-button type="primary" plain @click="handleView(row)">查看</el-button> <el-button type="primary" plain @click="handleView(row)">查看</el-button>
<el-button type="primary" plain @click="handleUpdate(row)" v-permission="'experiment_tag_update'">编辑</el-button> <el-button type="primary" plain @click="handleUpdate(row)" v-permission="'experiment_tag_update'"
<el-button type="primary" plain @click="handleRemove(row)" v-permission="'experiment_tag_delete'">删除</el-button> >编辑</el-button
>
<el-button type="primary" plain @click="handleRemove(row)" v-permission="'experiment_tag_delete'"
>删除</el-button
>
</template> </template>
</AppList> </AppList>
</div> </div>
</AppCard> </AppCard>
<!-- 新建/修改标签 --> <!-- 新建/修改标签 -->
<LabelFormDialog v-model="formVisible" :data="currentRow" @update="handleRefresh" v-if="formVisible"></LabelFormDialog> <LabelFormDialog
v-model="formVisible"
:data="currentRow"
@update="handleRefresh"
v-if="formVisible"></LabelFormDialog>
<!-- 查看标签 --> <!-- 查看标签 -->
<LabelViewDialog v-model="viewVisible" :data="currentRow" v-if="viewVisible && currentRow"></LabelViewDialog> <LabelViewDialog v-model="viewVisible" :data="currentRow" v-if="viewVisible && currentRow"></LabelViewDialog>
<!-- 规则 --> <!-- 规则 -->
......
...@@ -4,6 +4,9 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,6 +4,9 @@ import AppList from '@/components/base/AppList.vue'
import { getMaterialList, deleteMaterial } from '@/api/base' import { getMaterialList, deleteMaterial } from '@/api/base'
import type { MaterialProp } from '@/types' import type { MaterialProp } from '@/types'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue')) const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue'))
...@@ -120,7 +123,7 @@ const deleteMembers = function (ids: string) { ...@@ -120,7 +123,7 @@ const deleteMembers = function (ids: string) {
type="primary" type="primary"
:icon="Plus" :icon="Plus"
@click="handleAdd" @click="handleAdd"
v-permission="'v1-experiment-marketing-material-create'" v-if="!userStore.status.material_status"
>新建</el-button >新建</el-button
> >
<!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()" <!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()"
......
...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue'
import { getMaterialList, deleteMaterial } from '@/api/base' import { getMaterialList, deleteMaterial } from '@/api/base'
import type { MaterialProp } from '@/types' import type { MaterialProp } from '@/types'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue')) const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
...@@ -17,7 +19,7 @@ const listOptions = computed(() => { ...@@ -17,7 +19,7 @@ const listOptions = computed(() => {
return { return {
remote: { remote: {
httpRequest: getMaterialList, httpRequest: getMaterialList,
params: { name: '', id: '', status: '', type: materialType, updated_operator: '' } params: { name: '', id: '', status: '', type: materialType, updated_operator: '' },
}, },
filters: [ filters: [
{ type: 'input', prop: 'name', placeholder: '请输入资料名称' }, { type: 'input', prop: 'name', placeholder: '请输入资料名称' },
...@@ -28,10 +30,10 @@ const listOptions = computed(() => { ...@@ -28,10 +30,10 @@ const listOptions = computed(() => {
placeholder: '请选择资料状态', placeholder: '请选择资料状态',
options: [ options: [
{ label: '有效', value: '1' }, { label: '有效', value: '1' },
{ label: '失效', value: '0' } { label: '失效', value: '0' },
] ],
}, },
{ type: 'input', prop: 'updated_operator', placeholder: '更新人' } { type: 'input', prop: 'updated_operator', placeholder: '更新人' },
], ],
columns: [ columns: [
// { type: 'selection' }, // { type: 'selection' },
...@@ -46,12 +48,12 @@ const listOptions = computed(() => { ...@@ -46,12 +48,12 @@ const listOptions = computed(() => {
return row.row.status === '0' return row.row.status === '0'
? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>` ? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>`
: `<span style="color: #00ac27">${row.row.status_name}</span>` : `<span style="color: #00ac27">${row.row.status_name}</span>`
} },
}, },
{ label: '更新人', prop: 'updated_operator_name' }, { label: '更新人', prop: 'updated_operator_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', slots: 'table-x', width: 240 } { label: '操作', slots: 'table-x', width: 240 },
] ],
} }
}) })
...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) { ...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) {
<AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange"> <AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange">
<template #header-buttons> <template #header-buttons>
<el-space> <el-space>
<el-button <el-button type="primary" :icon="Plus" @click="handleAdd" v-if="!userStore.status.material_status"
type="primary"
:icon="Plus"
@click="handleAdd"
v-permission="'v1-experiment-marketing-material-create'"
>新建</el-button >新建</el-button
> >
<!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()" <!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()"
......
...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue'
import { getMaterialList, deleteMaterial } from '@/api/base' import { getMaterialList, deleteMaterial } from '@/api/base'
import type { MaterialProp } from '@/types' import type { MaterialProp } from '@/types'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue')) const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
...@@ -17,7 +19,7 @@ const listOptions = computed(() => { ...@@ -17,7 +19,7 @@ const listOptions = computed(() => {
return { return {
remote: { remote: {
httpRequest: getMaterialList, httpRequest: getMaterialList,
params: { name: '', id: '', status: '', type: materialType, updated_operator: '' } params: { name: '', id: '', status: '', type: materialType, updated_operator: '' },
}, },
filters: [ filters: [
{ type: 'input', prop: 'name', placeholder: '请输入资料名称' }, { type: 'input', prop: 'name', placeholder: '请输入资料名称' },
...@@ -28,10 +30,10 @@ const listOptions = computed(() => { ...@@ -28,10 +30,10 @@ const listOptions = computed(() => {
placeholder: '请选择资料状态', placeholder: '请选择资料状态',
options: [ options: [
{ label: '有效', value: '1' }, { label: '有效', value: '1' },
{ label: '失效', value: '0' } { label: '失效', value: '0' },
] ],
}, },
{ type: 'input', prop: 'updated_operator', placeholder: '更新人' } { type: 'input', prop: 'updated_operator', placeholder: '更新人' },
], ],
columns: [ columns: [
// { type: 'selection' }, // { type: 'selection' },
...@@ -46,12 +48,12 @@ const listOptions = computed(() => { ...@@ -46,12 +48,12 @@ const listOptions = computed(() => {
return row.row.status === '0' return row.row.status === '0'
? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>` ? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>`
: `<span style="color: #00ac27">${row.row.status_name}</span>` : `<span style="color: #00ac27">${row.row.status_name}</span>`
} },
}, },
{ label: '更新人', prop: 'updated_operator_name' }, { label: '更新人', prop: 'updated_operator_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', slots: 'table-x', width: 240 } { label: '操作', slots: 'table-x', width: 240 },
] ],
} }
}) })
...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) { ...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) {
<AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange"> <AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange">
<template #header-buttons> <template #header-buttons>
<el-space> <el-space>
<el-button <el-button type="primary" :icon="Plus" @click="handleAdd" v-if="!userStore.status.material_status"
type="primary"
:icon="Plus"
@click="handleAdd"
v-permission="'v1-experiment-marketing-material-create'"
>新建</el-button >新建</el-button
> >
<!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()" <!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()"
......
...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue'
import { getMaterialList, deleteMaterial } from '@/api/base' import { getMaterialList, deleteMaterial } from '@/api/base'
import type { MaterialProp } from '@/types' import type { MaterialProp } from '@/types'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue')) const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
...@@ -17,7 +19,7 @@ const listOptions = computed(() => { ...@@ -17,7 +19,7 @@ const listOptions = computed(() => {
return { return {
remote: { remote: {
httpRequest: getMaterialList, httpRequest: getMaterialList,
params: { name: '', id: '', status: '', type: materialType, updated_operator: '' } params: { name: '', id: '', status: '', type: materialType, updated_operator: '' },
}, },
filters: [ filters: [
{ type: 'input', prop: 'name', placeholder: '请输入资料名称' }, { type: 'input', prop: 'name', placeholder: '请输入资料名称' },
...@@ -28,10 +30,10 @@ const listOptions = computed(() => { ...@@ -28,10 +30,10 @@ const listOptions = computed(() => {
placeholder: '请选择资料状态', placeholder: '请选择资料状态',
options: [ options: [
{ label: '有效', value: '1' }, { label: '有效', value: '1' },
{ label: '失效', value: '0' } { label: '失效', value: '0' },
] ],
}, },
{ type: 'input', prop: 'updated_operator', placeholder: '更新人' } { type: 'input', prop: 'updated_operator', placeholder: '更新人' },
], ],
columns: [ columns: [
// { type: 'selection' }, // { type: 'selection' },
...@@ -46,12 +48,12 @@ const listOptions = computed(() => { ...@@ -46,12 +48,12 @@ const listOptions = computed(() => {
return row.row.status === '0' return row.row.status === '0'
? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>` ? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>`
: `<span style="color: #00ac27">${row.row.status_name}</span>` : `<span style="color: #00ac27">${row.row.status_name}</span>`
} },
}, },
{ label: '更新人', prop: 'updated_operator_name' }, { label: '更新人', prop: 'updated_operator_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', slots: 'table-x', width: 240 } { label: '操作', slots: 'table-x', width: 240 },
] ],
} }
}) })
...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) { ...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) {
<AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange"> <AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange">
<template #header-buttons> <template #header-buttons>
<el-space> <el-space>
<el-button <el-button type="primary" :icon="Plus" @click="handleAdd" v-if="!userStore.status.material_status"
type="primary"
:icon="Plus"
@click="handleAdd"
v-permission="'v1-experiment-marketing-material-create'"
>新建</el-button >新建</el-button
> >
<!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()" <!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()"
......
...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue'
import { getMaterialList, deleteMaterial } from '@/api/base' import { getMaterialList, deleteMaterial } from '@/api/base'
import type { MaterialProp } from '@/types' import type { MaterialProp } from '@/types'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue')) const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
...@@ -17,7 +19,7 @@ const listOptions = computed(() => { ...@@ -17,7 +19,7 @@ const listOptions = computed(() => {
return { return {
remote: { remote: {
httpRequest: getMaterialList, httpRequest: getMaterialList,
params: { name: '', id: '', status: '', type: materialType, updated_operator: '' } params: { name: '', id: '', status: '', type: materialType, updated_operator: '' },
}, },
filters: [ filters: [
{ type: 'input', prop: 'name', placeholder: '请输入资料名称' }, { type: 'input', prop: 'name', placeholder: '请输入资料名称' },
...@@ -28,10 +30,10 @@ const listOptions = computed(() => { ...@@ -28,10 +30,10 @@ const listOptions = computed(() => {
placeholder: '请选择资料状态', placeholder: '请选择资料状态',
options: [ options: [
{ label: '有效', value: '1' }, { label: '有效', value: '1' },
{ label: '失效', value: '0' } { label: '失效', value: '0' },
] ],
}, },
{ type: 'input', prop: 'updated_operator', placeholder: '更新人' } { type: 'input', prop: 'updated_operator', placeholder: '更新人' },
], ],
columns: [ columns: [
// { type: 'selection' }, // { type: 'selection' },
...@@ -46,12 +48,12 @@ const listOptions = computed(() => { ...@@ -46,12 +48,12 @@ const listOptions = computed(() => {
return row.row.status === '0' return row.row.status === '0'
? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>` ? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>`
: `<span style="color: #00ac27">${row.row.status_name}</span>` : `<span style="color: #00ac27">${row.row.status_name}</span>`
} },
}, },
{ label: '更新人', prop: 'updated_operator_name' }, { label: '更新人', prop: 'updated_operator_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', slots: 'table-x', width: 240 } { label: '操作', slots: 'table-x', width: 240 },
] ],
} }
}) })
...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) { ...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) {
<AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange"> <AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange">
<template #header-buttons> <template #header-buttons>
<el-space> <el-space>
<el-button <el-button type="primary" :icon="Plus" @click="handleAdd" v-if="!userStore.status.material_status"
type="primary"
:icon="Plus"
@click="handleAdd"
v-permission="'v1-experiment-marketing-material-create'"
>新建</el-button >新建</el-button
> >
<!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()" <!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()"
......
...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue'
import { getMaterialList, deleteMaterial } from '@/api/base' import { getMaterialList, deleteMaterial } from '@/api/base'
import type { MaterialProp } from '@/types' import type { MaterialProp } from '@/types'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue')) const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
...@@ -17,7 +19,7 @@ const listOptions = computed(() => { ...@@ -17,7 +19,7 @@ const listOptions = computed(() => {
return { return {
remote: { remote: {
httpRequest: getMaterialList, httpRequest: getMaterialList,
params: { name: '', id: '', status: '', type: materialType, updated_operator: '' } params: { name: '', id: '', status: '', type: materialType, updated_operator: '' },
}, },
filters: [ filters: [
{ type: 'input', prop: 'name', placeholder: '请输入资料名称' }, { type: 'input', prop: 'name', placeholder: '请输入资料名称' },
...@@ -28,10 +30,10 @@ const listOptions = computed(() => { ...@@ -28,10 +30,10 @@ const listOptions = computed(() => {
placeholder: '请选择资料状态', placeholder: '请选择资料状态',
options: [ options: [
{ label: '有效', value: '1' }, { label: '有效', value: '1' },
{ label: '失效', value: '0' } { label: '失效', value: '0' },
] ],
}, },
{ type: 'input', prop: 'updated_operator', placeholder: '更新人' } { type: 'input', prop: 'updated_operator', placeholder: '更新人' },
], ],
columns: [ columns: [
// { type: 'selection' }, // { type: 'selection' },
...@@ -46,12 +48,12 @@ const listOptions = computed(() => { ...@@ -46,12 +48,12 @@ const listOptions = computed(() => {
return row.row.status === '0' return row.row.status === '0'
? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>` ? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>`
: `<span style="color: #00ac27">${row.row.status_name}</span>` : `<span style="color: #00ac27">${row.row.status_name}</span>`
} },
}, },
{ label: '更新人', prop: 'updated_operator_name' }, { label: '更新人', prop: 'updated_operator_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', slots: 'table-x', width: 240 } { label: '操作', slots: 'table-x', width: 240 },
] ],
} }
}) })
...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) { ...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) {
<AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange"> <AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange">
<template #header-buttons> <template #header-buttons>
<el-space> <el-space>
<el-button <el-button type="primary" :icon="Plus" @click="handleAdd" v-if="!userStore.status.material_status"
type="primary"
:icon="Plus"
@click="handleAdd"
v-permission="'v1-experiment-marketing-material-create'"
>新建</el-button >新建</el-button
> >
<!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()" <!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()"
......
...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue'
import { getMaterialList, deleteMaterial } from '@/api/base' import { getMaterialList, deleteMaterial } from '@/api/base'
import type { MaterialProp } from '@/types' import type { MaterialProp } from '@/types'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue')) const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
...@@ -17,7 +19,7 @@ const listOptions = computed(() => { ...@@ -17,7 +19,7 @@ const listOptions = computed(() => {
return { return {
remote: { remote: {
httpRequest: getMaterialList, httpRequest: getMaterialList,
params: { name: '', id: '', status: '', type: materialType, updated_operator: '' } params: { name: '', id: '', status: '', type: materialType, updated_operator: '' },
}, },
filters: [ filters: [
{ type: 'input', prop: 'name', placeholder: '请输入资料名称' }, { type: 'input', prop: 'name', placeholder: '请输入资料名称' },
...@@ -28,10 +30,10 @@ const listOptions = computed(() => { ...@@ -28,10 +30,10 @@ const listOptions = computed(() => {
placeholder: '请选择资料状态', placeholder: '请选择资料状态',
options: [ options: [
{ label: '有效', value: '1' }, { label: '有效', value: '1' },
{ label: '失效', value: '0' } { label: '失效', value: '0' },
] ],
}, },
{ type: 'input', prop: 'updated_operator', placeholder: '更新人' } { type: 'input', prop: 'updated_operator', placeholder: '更新人' },
], ],
columns: [ columns: [
// { type: 'selection' }, // { type: 'selection' },
...@@ -46,12 +48,12 @@ const listOptions = computed(() => { ...@@ -46,12 +48,12 @@ const listOptions = computed(() => {
return row.row.status === '0' return row.row.status === '0'
? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>` ? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>`
: `<span style="color: #00ac27">${row.row.status_name}</span>` : `<span style="color: #00ac27">${row.row.status_name}</span>`
} },
}, },
{ label: '更新人', prop: 'updated_operator_name' }, { label: '更新人', prop: 'updated_operator_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', slots: 'table-x', width: 240 } { label: '操作', slots: 'table-x', width: 240 },
] ],
} }
}) })
...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) { ...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) {
<AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange"> <AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange">
<template #header-buttons> <template #header-buttons>
<el-space> <el-space>
<el-button <el-button type="primary" :icon="Plus" @click="handleAdd" v-if="!userStore.status.material_status"
type="primary"
:icon="Plus"
@click="handleAdd"
v-permission="'v1-experiment-marketing-material-create'"
>新建</el-button >新建</el-button
> >
<!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()" <!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()"
......
...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,7 +4,9 @@ import AppList from '@/components/base/AppList.vue'
import { getMaterialList, deleteMaterial } from '@/api/base' import { getMaterialList, deleteMaterial } from '@/api/base'
import type { MaterialProp } from '@/types' import type { MaterialProp } from '@/types'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue')) const UpdateMaterialDialog = defineAsyncComponent(() => import('@/components/base/UpdateMaterialDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
...@@ -17,7 +19,7 @@ const listOptions = computed(() => { ...@@ -17,7 +19,7 @@ const listOptions = computed(() => {
return { return {
remote: { remote: {
httpRequest: getMaterialList, httpRequest: getMaterialList,
params: { name: '', id: '', status: '', type: materialType, updated_operator: '' } params: { name: '', id: '', status: '', type: materialType, updated_operator: '' },
}, },
filters: [ filters: [
{ type: 'input', prop: 'name', placeholder: '请输入资料名称' }, { type: 'input', prop: 'name', placeholder: '请输入资料名称' },
...@@ -28,10 +30,10 @@ const listOptions = computed(() => { ...@@ -28,10 +30,10 @@ const listOptions = computed(() => {
placeholder: '请选择资料状态', placeholder: '请选择资料状态',
options: [ options: [
{ label: '有效', value: '1' }, { label: '有效', value: '1' },
{ label: '失效', value: '0' } { label: '失效', value: '0' },
] ],
}, },
{ type: 'input', prop: 'updated_operator', placeholder: '更新人' } { type: 'input', prop: 'updated_operator', placeholder: '更新人' },
], ],
columns: [ columns: [
// { type: 'selection' }, // { type: 'selection' },
...@@ -46,12 +48,12 @@ const listOptions = computed(() => { ...@@ -46,12 +48,12 @@ const listOptions = computed(() => {
return row.row.status === '0' return row.row.status === '0'
? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>` ? `<span style="color: rgb(170, 2, 49)">${row.row.status_name}</span>`
: `<span style="color: #00ac27">${row.row.status_name}</span>` : `<span style="color: #00ac27">${row.row.status_name}</span>`
} },
}, },
{ label: '更新人', prop: 'updated_operator_name' }, { label: '更新人', prop: 'updated_operator_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', slots: 'table-x', width: 240 } { label: '操作', slots: 'table-x', width: 240 },
] ],
} }
}) })
...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) { ...@@ -116,11 +118,7 @@ const deleteMembers = function (ids: string) {
<AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange"> <AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange">
<template #header-buttons> <template #header-buttons>
<el-space> <el-space>
<el-button <el-button type="primary" :icon="Plus" @click="handleAdd" v-if="!userStore.status.material_status"
type="primary"
:icon="Plus"
@click="handleAdd"
v-permission="'v1-experiment-marketing-material-create'"
>新建</el-button >新建</el-button
> >
<!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()" <!-- <el-button type="danger" plain :icon="Delete" :disabled="!multipleSelection.length" @click="handleRemoves()"
......
...@@ -4,6 +4,9 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,6 +4,9 @@ import AppList from '@/components/base/AppList.vue'
import { getMemberList, deleteMember, getMemberConnectionsList } from '../api' import { getMemberList, deleteMember, getMemberConnectionsList } from '../api'
import { ElMessage, ElMessageBox, ElLoading } from 'element-plus' import { ElMessage, ElMessageBox, ElLoading } from 'element-plus'
import type { MemberProp, ConnectionsProp } from '../types' import type { MemberProp, ConnectionsProp } from '../types'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const UpdateDialog = defineAsyncComponent(() => import('../components/UpdateDialog.vue')) const UpdateDialog = defineAsyncComponent(() => import('../components/UpdateDialog.vue'))
const UploadEventsDialog = defineAsyncComponent(() => import('../components/UploadEventsDialog.vue')) const UploadEventsDialog = defineAsyncComponent(() => import('../components/UploadEventsDialog.vue'))
...@@ -204,7 +207,7 @@ const downloadMember = function (isAll?: boolean) { ...@@ -204,7 +207,7 @@ const downloadMember = function (isAll?: boolean) {
<AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange"> <AppList v-bind="listOptions" ref="appList" @selection-change="handleSelectionChange">
<template #header-buttons> <template #header-buttons>
<el-space> <el-space>
<el-button type="primary" :icon="Plus" @click="handleAdd" v-permission="'v1-experiment-member-create'">新建</el-button> <el-button v-if="!userStore.status.status" type="primary" :icon="Plus" @click="handleAdd" v-permission="'v1-experiment-member-create'">新建</el-button>
<el-dropdown v-permission="'v1-experiment-member-download'"> <el-dropdown v-permission="'v1-experiment-member-download'">
<el-button type="primary" :icon="Download">导出</el-button> <el-button type="primary" :icon="Download">导出</el-button>
<template #dropdown> <template #dropdown>
......
...@@ -15,7 +15,7 @@ interface State { ...@@ -15,7 +15,7 @@ interface State {
organization: OrganizationType | null organization: OrganizationType | null
roles: RoleType[] roles: RoleType[]
permissions: PermissionType[] permissions: PermissionType[]
status: boolean status: any
} }
export const useUserStore = defineStore({ export const useUserStore = defineStore({
...@@ -27,10 +27,10 @@ export const useUserStore = defineStore({ ...@@ -27,10 +27,10 @@ export const useUserStore = defineStore({
project: null, project: null,
roles: [], roles: [],
permissions: [], permissions: [],
status: false status: {},
}), }),
getters: { getters: {
isLogin: state => !!state.user isLogin: (state) => !!state.user,
}, },
actions: { actions: {
async getUser() { async getUser() {
...@@ -44,13 +44,13 @@ export const useUserStore = defineStore({ ...@@ -44,13 +44,13 @@ export const useUserStore = defineStore({
this.roles = roles this.roles = roles
this.permissions = permissions this.permissions = permissions
await useMapStore().getMapList() await useMapStore().getMapList()
await checkDataStatus().then(res => { await checkDataStatus().then((res) => {
this.status = res.data.status this.status = res.data
}) })
}, },
async logout() { async logout() {
await logout() await logout()
this.user = null this.user = null
} },
} },
}) })
...@@ -5,7 +5,7 @@ import type { DirectiveBinding } from 'vue' ...@@ -5,7 +5,7 @@ import type { DirectiveBinding } from 'vue'
export function checkPermission(value: string | string[]): boolean { export function checkPermission(value: string | string[]): boolean {
const userStore = useUserStore() const userStore = useUserStore()
// true 是学员且使用公共数据(学员不能自己创建数据) false 学员可以自己创建数据 // true 是学员且使用公共数据(学员不能自己创建数据) false 学员可以自己创建数据
if (!userStore.status) return true if (!userStore.status.status || !userStore.status.group_status || !userStore.status.material_status || !userStore.status.tag_status) return true
const permissions = userStore.permissions const permissions = userStore.permissions
if (Array.isArray(value)) { if (Array.isArray(value)) {
return permissions.some(item => value.includes(item.tag)) return permissions.some(item => value.includes(item.tag))
......
...@@ -14,16 +14,16 @@ export default defineConfig(({ mode }) => ({ ...@@ -14,16 +14,16 @@ export default defineConfig(({ mode }) => ({
AutoImport({ AutoImport({
imports: ['vue', 'vue/macros', 'vue-router', '@vueuse/core'], imports: ['vue', 'vue/macros', 'vue-router', '@vueuse/core'],
dts: true, dts: true,
eslintrc: { enabled: true } eslintrc: { enabled: true },
}) }),
// checker({ vueTsc: true, eslint: { lintCommand: 'eslint "./src/**/*.{vue,js,jsx,ts,tsx}"' } }) // checker({ vueTsc: true, eslint: { lintCommand: 'eslint "./src/**/*.{vue,js,jsx,ts,tsx}"' } })
], ],
server: { server: {
open: true, open: true,
host: 'dev.ezijing.com', host: 'dev.ezijing.com',
https: { https: {
key: fs.readFileSync(path.join(__dirname, './https/ezijing.com.key')), key: fs.readFileSync(path.join(__dirname, './https/dev.ezijing.com-key.pem')),
cert: fs.readFileSync(path.join(__dirname, './https/ezijing.com.pem')) cert: fs.readFileSync(path.join(__dirname, './https/dev.ezijing.com.pem')),
}, },
proxy: { proxy: {
// '/api/resource': { // '/api/resource': {
...@@ -31,12 +31,12 @@ export default defineConfig(({ mode }) => ({ ...@@ -31,12 +31,12 @@ export default defineConfig(({ mode }) => ({
// changeOrigin: true, // changeOrigin: true,
// rewrite: path => path.replace(/^\/api\/resource/, '') // rewrite: path => path.replace(/^\/api\/resource/, '')
// }, // },
'/api': 'https://saas-dml.ezijing.com' '/api': 'https://saas-dml.ezijing.com',
} },
}, },
resolve: { resolve: {
alias: { alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)) '@': fileURLToPath(new URL('./src', import.meta.url)),
} },
} },
})) }))
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论