Initial commit

This commit is contained in:
oscarz
2024-08-12 15:32:16 +08:00
commit f2ab7f054c
78 changed files with 2242 additions and 0 deletions

8
XCode 配置.txt Normal file
View File

@ -0,0 +1,8 @@
## 安装 CocoaPods
https://blog.csdn.net/BlackMonkey_xj/article/details/124466716
## SDK does not contain 'libarclite' at the path '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a'; try increasing the minimum deployment target
M3芯片上不知道什么原因报错把旧机器x86上的 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/ 目录下的静态库,拷贝过来,可以用。

59
iap.txt Normal file
View File

@ -0,0 +1,59 @@
//verify
{"transactionId":"2000000636724653","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000065291589","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1719216929000,"originalPurchaseDate":1718783687000,"expiresDate":1719217109000,"quantity":1,"type":"Auto-Renewable Subscription","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1719223181779,"storefront":"USA","storefrontId":"143441","transactionReason":"RENEWAL","environment":"Sandbox","price":4990,"currency":"USD"}
// callback
{"Payload":{"notificationType":"SUBSCRIBED","subtype":"RESUBSCRIBE","notificationUUID":"ba289004-33f5-4622-a1ed-ee6699ef8c01","version":"2.0","signedDate":1719053019214,"summary":{"requestIdentifier":"","appAppleId":"","bundleId":"","productId":"","environment":"","storefrontCountryCodes":null,"failedCount":0,"succeededCount":0},"data":{"appAppleId":6504465465,"bundleId":"com.easyprompts.aigrammar","bundleVersion":"1","environment":"Sandbox","signedRenewalInfo":"..","signedTransactionInfo":"..","status":1},"externalPurchaseToken":{"externalPurchaseId":"","tokenCreationDate":0,"appAppleId":"","bundleId":""}},"TransactionInfo":{"appAccountToken":"","bundleId":"com.easyprompts.aigrammar","currency":"USD","environment":"Sandbox","expiresDate":1719053192000,"inAppOwnershipType":"PURCHASED","isUpgraded":false,"offerDiscountType":"","offerIdentifier":"","offerType":0,"originalPurchaseDate":1718783687000,"originalTransactionId":"2000000632564540","price":4990,"productId":"grammar_1_week","purchaseDate":1719053012000,"quantity":1,"revocationDate":0,"revocationReason":0,"signedDate":1719053019185,"storefront":"USA","storefrontId":"143441","subscriptionGroupIdentifier":"21501008","transactionId":"2000000635829288","transactionReason":"PURCHASE","type":"Auto-Renewable Subscription","webOrderLineItemId":"2000000065075723"},"RenewalInfo":{"autoRenewProductId":"grammar_1_week","autoRenewStatus":1,"environment":"Sandbox","expirationIntent":0,"gracePeriodExpiresDate":0,"isInBillingRetryPeriod":false,"offerIdentifier":"","offerType":0,"originalTransactionId":"2000000632564540","priceIncreaseStatus":0,"productId":"grammar_1_week","recentSubscriptionStartDate":1719053012000,"renewalDate":1719053192000,"signedDate":1719053019185},"IsValid":true,"IsTest":false}
16:03:59 🟢 2000000648192679: {"transactionId":"2000000648192679","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066437481","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720166630000,"originalPurchaseDate":1718783687000,"expiresDate":1720166810000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"oKZZXZuzZ5QAFwsiNSg56fq292UfDPFkqCpGhsjYh5QAuOMtVy419BiQSuLTq5J4","deviceVerificationNonce":"b8d63d5e-b6e1-4c73-a72c-2ba319582b23","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720166638832,"environment":"Sandbox","transactionReason":"PURCHASE","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:04:01 🟢
16:04:01 🟢 2000000648192679: {"transactionId":"2000000648192679","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066437481","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720166630000,"originalPurchaseDate":1718783687000,"expiresDate":1720166810000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"5Nl99gKQxpFSlYC2twMwPmgP5OC2obpBtOfs6p+bR+fJyQRnoVE4C3ZnWtrmQmo9","deviceVerificationNonce":"e9fe05f7-3305-4f91-bbff-539bbe147624","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720166641120,"environment":"Sandbox","transactionReason":"PURCHASE","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:04:02 🟢
16:05:51 🟢 2000000648192679: {"transactionId":"2000000648192679","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066437481","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720166630000,"originalPurchaseDate":1718783687000,"expiresDate":1720166810000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"9A2Si6WNj3/HHObhoO9kv9Egyd3W4BcG1uDh3fKgN5IvMvIeWzhh7A9drx7ENl1d","deviceVerificationNonce":"b3013f02-27b2-4310-a0bd-6ac6ad57b318","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720166630546,"environment":"Sandbox","transactionReason":"PURCHASE","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:05:53 🟢
16:06:12 🟢 2000000648196624: {"transactionId":"2000000648196624","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066547746","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720166810000,"originalPurchaseDate":1718783687000,"expiresDate":1720166990000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"WHAS3tP9Dc2HBSB5Q0M+RyyYYC+LHjD4/5cSoa2ks3Oz+kGE660dTnp5unBQlye6","deviceVerificationNonce":"9113a837-b4b9-4621-b2ac-fbcc1eb56420","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720166772253,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:06:13 🟢
16:06:14 🟢 2000000648196624: {"transactionId":"2000000648196624","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066547746","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720166810000,"originalPurchaseDate":1718783687000,"expiresDate":1720166990000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"Idgut4CTAptacnz6ZefN2A92ZS09bQa6hY1E31HhcHts8cpQfWiGW39bo0M2UXRc","deviceVerificationNonce":"262bf285-c91d-41b5-af59-3714ce22ff4a","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720166774275,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:06:15 🟢
16:09:47 🟢 2000000648203889: {"transactionId":"2000000648203889","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066548067","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720166990000,"originalPurchaseDate":1718783687000,"expiresDate":1720167170000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"a2BNPlCByC4MNv98BEl/kGYjtT58TZys790kJO7o6qdGNjiLEeIfcnC7rLjPa3sc","deviceVerificationNonce":"507204f3-dd3a-4ec0-8157-14f002f019b4","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720166987200,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:09:49 🟢 2000000648203889: {"transactionId":"2000000648203889","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066548067","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720166990000,"originalPurchaseDate":1718783687000,"expiresDate":1720167170000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"eLDlklVORVW9VaQGxGR4dI2mRDcf2OVmMUA4MWG0mOZaNlADuSS8nGfTEJE0y5/e","deviceVerificationNonce":"3cef9383-7173-48ae-abdd-2c01cc6fab4b","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720166989055,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:09:50 🟢
16:09:52 🟢
16:12:05 🟢 2000000648206215: {"transactionId":"2000000648206215","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066548546","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167170000,"originalPurchaseDate":1718783687000,"expiresDate":1720167350000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"aBbhrdwdMuyenE+u9mqeGuINM8kAA7AlG2fZr2LX6HCoa8YUTRGlFgpvitlieSKJ","deviceVerificationNonce":"38200a1e-df42-4b0d-99f1-5368406ae0be","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167125125,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:12:06 🟢
16:12:07 🟢 2000000648206215: {"transactionId":"2000000648206215","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066548546","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167170000,"originalPurchaseDate":1718783687000,"expiresDate":1720167350000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"7PMlOFa6beNQ+HDOAQMYAa5kKufJuDk+M9EhRG70daro3vpp5Z/hlp9gxb1Y5i15","deviceVerificationNonce":"51baef36-0b96-457d-a8bf-555cefb08efc","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167127337,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:12:08 🟢
16:14:59 🟢 2000000648211980: {"transactionId":"2000000648211980","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066548851","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167350000,"originalPurchaseDate":1718783687000,"expiresDate":1720167530000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"CPCpjEekqAkMz59cnTT29YQlE0PWMLqWMje6I3gmlgZgQiP6RLGPf0HZgFD8l3v+","deviceVerificationNonce":"e0e4b830-f3c3-438a-9d5a-fe9d1cef030c","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167299009,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:15:02 🟢 2000000648211980: {"transactionId":"2000000648211980","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066548851","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167350000,"originalPurchaseDate":1718783687000,"expiresDate":1720167530000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"96C3gSNEHxq/u3RsKMY9FuNVD0p585mTOQfG82k+rCPgwaLa0Wl2jTOk8i6XT3+x","deviceVerificationNonce":"1f5a5e0c-24ce-4d32-a43a-a8099e65b449","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167301561,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:15:02 🟢
16:15:04 🟢
16:18:22 🟢 2000000648216487: {"transactionId":"2000000648216487","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066549319","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167530000,"originalPurchaseDate":1718783687000,"expiresDate":1720167710000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"zoTIunllByJY4uXxF1hPc2v1AWBFVaEpfpPEU+aaGSX/Es/USxbO0tHF2MRFr5is","deviceVerificationNonce":"7214bd17-7de5-447b-9867-c0519d93eabd","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167501980,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:18:24 🟢
16:18:24 🟢 2000000648216487: {"transactionId":"2000000648216487","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066549319","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167530000,"originalPurchaseDate":1718783687000,"expiresDate":1720167710000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"GJZyCWVnPfkfL9gXYXLRHwdGOapJEVCpd0npneJur/IZLhzPtJ4YWpxm1ioK3IAT","deviceVerificationNonce":"c536e66b-4f50-4347-9fc7-7c4aad3f6fc4","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167504431,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:18:25 🟢
16:21:27 🟢 2000000648221268: {"transactionId":"2000000648221268","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066549756","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167710000,"originalPurchaseDate":1718783687000,"expiresDate":1720167890000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"n43w4+ooPn4hx4IJXdtRoH2MaMA4x99pQSOkMA954KNrZb3jUDMuWyUjbGUdDomw","deviceVerificationNonce":"64e42b80-84d4-47d5-b15d-4b8e16551373","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167687515,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:21:30 🟢 2000000648221268: {"transactionId":"2000000648221268","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066549756","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167710000,"originalPurchaseDate":1718783687000,"expiresDate":1720167890000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"PPLM9lTbspKODw++7uU8917bUMvPNIYsvwEOMEALq1bHhoKbaRsOv+VtGVNslDVS","deviceVerificationNonce":"bf51f0c5-da1e-4171-8655-b2d0e9f4215b","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167689653,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:21:30 🟢
16:21:31 🟢
16:24:32 🟢 2000000648227718: {"transactionId":"2000000648227718","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066550193","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167890000,"originalPurchaseDate":1718783687000,"expiresDate":1720168070000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"hrUNB5gc/93oL6IYILpbveD1zngojP+APyQGKNm6Ke8nzA0ie75GyYm1c0jFWA7L","deviceVerificationNonce":"625bcd1d-29ac-416a-a7a9-916d06051ee0","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167872211,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:24:35 🟢 2000000648227718: {"transactionId":"2000000648227718","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066550193","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720167890000,"originalPurchaseDate":1718783687000,"expiresDate":1720168070000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"hhMGShRuGJnUKTdu+KTN1CVxIvOXuLYgVafVl++n2GBogY85aCeMcf56n1KkHe97","deviceVerificationNonce":"23668f3a-9bf6-4077-959e-e0937fdda4fb","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720167874971,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:24:35 🟢
16:24:36 🟢
16:27:01 🟢 2000000648230389: {"transactionId":"2000000648230389","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066550650","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720168070000,"originalPurchaseDate":1718783687000,"expiresDate":1720168250000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"MDjK7SJlHF0eBgsx0PRmsvrUHpFXfYsTGu7mtae+vJf9BGyx0nacJLvViEm6nfuf","deviceVerificationNonce":"ec158d27-2478-4fe8-9785-0c682a7dc208","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720168021545,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:27:03 🟢
16:27:04 🟢 2000000648230389: {"transactionId":"2000000648230389","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066550650","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720168070000,"originalPurchaseDate":1718783687000,"expiresDate":1720168250000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"qZL5dEo0FYsC1ueiRMXUvP7u70X7vtEG1bNJ4oJmf/qQkvgq4TxNctcBbRz8Hofu","deviceVerificationNonce":"5e0c62dc-5c93-43be-8703-423e80b67123","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720168023899,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:27:04 🟢
16:30:27 🟢 2000000648234357: {"transactionId":"2000000648234357","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066550993","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720168250000,"originalPurchaseDate":1718783687000,"expiresDate":1720168430000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"ypumjlD+TNfCkaqnczNKcMFPDWXA//Y+Ce8X+NsmIneKxNkj3SkxrA3NF2lR/oaY","deviceVerificationNonce":"40735101-1a31-4151-b455-6ed545f81cb6","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720168227071,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:30:29 🟢 2000000648234357: {"transactionId":"2000000648234357","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066550993","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720168250000,"originalPurchaseDate":1718783687000,"expiresDate":1720168430000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"2juKkmbGcifKOsEI/JC49IYIhEcunm8Lx2n+atiheSbCE9qBO65l6ohhE78FcW+X","deviceVerificationNonce":"9e607faa-1c2c-4883-9962-796631f05b0f","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720168228994,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:30:29 🟢
16:30:30 🟢
16:33:23 🟢 2000000648239292: {"transactionId":"2000000648239292","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066551484","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720168430000,"originalPurchaseDate":1718783687000,"expiresDate":1720168610000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"FFkQLukIjsTI1uyoZKwC2zplSqvg3JIchJuMqveIV/yi3WP7PHSLvVfAm6IjjABW","deviceVerificationNonce":"43f11dae-3fb7-4029-baa8-fb459dbd5671","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720168402693,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:33:25 🟢 2000000648239292: {"transactionId":"2000000648239292","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066551484","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720168430000,"originalPurchaseDate":1718783687000,"expiresDate":1720168610000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"NGqD8Fz9iUG2w7NYD3ScgsFSsyihJeiCpJwviF98HxPFe//iYHK05Zheu0jnkr52","deviceVerificationNonce":"fae2aadc-eca1-4f76-bcb5-ffe5a53f7458","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720168404782,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:33:25 🟢
16:33:26 🟢
16:36:24 🟢 2000000648246489: {"transactionId":"2000000648246489","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066551897","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720168610000,"originalPurchaseDate":1718783687000,"expiresDate":1720168790000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"cx9Vr0UJDKuGe5cs+l2CI/F3mKwpmzdkbjIklMibx6uB6IxJIb5exywk7beIExpu","deviceVerificationNonce":"ae30fdf6-d17b-4dff-a380-c4fa5be64209","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720168584040,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:36:26 🟢
16:36:26 🟢 2000000648246489: {"transactionId":"2000000648246489","originalTransactionId":"2000000632564540","webOrderLineItemId":"2000000066551897","bundleId":"com.easyprompts.aigrammar","productId":"grammar_1_week","subscriptionGroupIdentifier":"21501008","purchaseDate":1720168610000,"originalPurchaseDate":1718783687000,"expiresDate":1720168790000,"quantity":1,"type":"Auto-Renewable Subscription","deviceVerification":"PYZx9g8PH1kOz45iTn0oB7QbpJQ5+ICoUQ8wSu05uQAZCb0ZMXIwNCGOrcYVfJMf","deviceVerificationNonce":"1a80065a-1b7b-4d21-ba1a-5c5ccaabccb9","appAccountToken":"e2fde03b-c5ab-46a3-aacc-2d96c6bbeb84","inAppOwnershipType":"PURCHASED","signedDate":1720168586170,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"USA","storefrontId":"143441","price":4990,"currency":"USD"}
16:36:27 🟢

73
mysql.txt Normal file
View File

@ -0,0 +1,73 @@
CREATE USER 'devops'@'localhost' IDENTIFIED BY 'b5hs945wXjHr';
mysql -uroot -pehKK3lDXo5jx
CREATE TABLE aigrammar.`user` (
ID INT UNSIGNED DEFAULT 10000 auto_increment NOT NULL,
UserID varchar(100) NULL COMMENT 'UserID',
UserName varchar(100) NULL COMMENT 'username',
DeviceID varchar(256) NULL COMMENT 'DeviceID',
RegChannel varchar(100) NULL COMMENT 'Email, Apple, Google',
OpenID varchar(100) NULL COMMENT 'ID from other channels',
RegTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL,
UpdateTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT user_pk PRIMARY KEY (ID)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
AUTO_INCREMENT 10000
COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE aigrammar.vip (
ID INT UNSIGNED NOT NULL,
IsVIP INT DEFAULT 0 NULL COMMENT '1-VIP; 0-not vip',
AppStore varchar(100) DEFAULT 'apple' NULL COMMENT 'apple;google',
ProductID varchar(100) NULL,
ProductType varchar(100) NULL COMMENT 'yearly;monthly;weekly;',
Environment varchar(100) NULL COMMENT 'prod;sandbox',
PurchaseDate TIMESTAMP NULL,
Price INT NULL,
Currency varchar(100) NULL,
Storefront varchar(100) NULL COMMENT 'USA',
ExpDate TIMESTAMP NULL,
AutoRenew INT NULL COMMENT '1-yes;0-no',
OriginalTransactionID varchar(100) NULL COMMENT 'applestore originalTransactionId',
CONSTRAINT vip_pk PRIMARY KEY (ID)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE aigrammar.oder_log (
LogID INT UNSIGNED auto_increment NOT NULL,
AppStore varchar(100) NULL COMMENT 'apple;google',
NotificationType varchar(100) NULL,
Subtype varchar(100) NULL,
Environment varchar(100) NULL COMMENT 'product;sandbox',
AppAccountToken varchar(100) NULL,
CreateTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL,
TransactionInfo TEXT NULL,
RenewalInfo TEXT NULL,
Payload TEXT NULL,
CONSTRAINT oder_log_pk PRIMARY KEY (LogID)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE aigrammar.product (
ProductID varchar(100) NOT NULL,
AppStore varchar(100) DEFAULT 'apple' NOT NULL,
Duration INT DEFAULT 0 NULL COMMENT '订阅天数',
ProductName varchar(100) NULL COMMENT '自定义商品名称',
Price INT NULL COMMENT '定价,分',
Currency varchar(100) NULL COMMENT '币种',
CONSTRAINT product_pk PRIMARY KEY (ProductID,AppStore)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci;

BIN
pic/crown.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -0,0 +1,120 @@
{
"images": [
{
"size": "20x20",
"idiom": "universal",
"filename": "icon-20@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "20x20",
"idiom": "universal",
"filename": "icon-20@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "29x29",
"idiom": "universal",
"filename": "icon-29@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "29x29",
"idiom": "universal",
"filename": "icon-29@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "38x38",
"idiom": "universal",
"filename": "icon-38@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "38x38",
"idiom": "universal",
"filename": "icon-38@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "40x40",
"idiom": "universal",
"filename": "icon-40@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "40x40",
"idiom": "universal",
"filename": "icon-40@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "60x60",
"idiom": "universal",
"filename": "icon-60@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "60x60",
"idiom": "universal",
"filename": "icon-60@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "64x64",
"idiom": "universal",
"filename": "icon-64@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "64x64",
"idiom": "universal",
"filename": "icon-64@3x.png",
"scale": "3x",
"platform": "ios"
},
{
"size": "68x68",
"idiom": "universal",
"filename": "icon-68@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "76x76",
"idiom": "universal",
"filename": "icon-76@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "83.5x83.5",
"idiom": "universal",
"filename": "icon-83.5@2x.png",
"scale": "2x",
"platform": "ios"
},
{
"size": "1024x1024",
"idiom": "universal",
"filename": "icon-1024.png",
"scale": "1x",
"platform": "ios"
}
],
"info": {
"version": 1,
"author": "icon.wuruihong.com"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
pic/logo-easypropmt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
pic/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
pic/其他/WechatIMG380.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
pic/其他/camera.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
pic/其他/hand-mirror.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
pic/其他/mirror.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
pic/其他/mirror2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
pic/其他/mirror_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
pic/官网/图标.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
pic/官网/应用列表.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

367
prompts.md Normal file
View File

@ -0,0 +1,367 @@
## 查看正在调试的 iPhone 的日志:
cd /Users/oscar/Downloads/brew-4.3.8/bin
./ios-deploy --bundle_id com.easyprompts.aigrammar --download=/Library/Caches/swiftybeaver.log --to ~/Downloads/
对应目录下的 Library/Caches/swiftybeaver.log 既是
## 需要一个菊花转动,与后台交互
我们继续工作。先回忆一下我们之前都做了哪些。我们编写了GrammarCheckViewTranslateViewWordsView和SettingsView。他们分别完成不同的功能。现在我们需要一个统一的组建它需要在客户端有点击事件与服务端交互时弹出使得整个页面不可点击和操作等服务端结果出来之后再刷新页面。这个组建通常是一个转动的齿轮。它需要在我们上面提到的每个View中用到所以我们需要一个比较好的封装。请你以 WordsView 页面为例,给出实现的方法。
# 付费页面
## quest1
我们继续在APP中增加付费功能。在首页也就是GrammarCheckView中我们有个"Try for Free" 按钮我们希望用户点击后能弹出一个付费界面。这个页面是全屏的并且会在其他页面上弹出比如SettingsView。所以我们希望它能够被多个地方引用。
这个页面的布局最上面左侧是一个VIP的图片标记可以用Text来包装背景是淡黄色文字是VIP金黄色。右侧是一个关闭按钮点击后关闭付费页面。
下面是个表格有四行三列。表头的三行分别是Features、Free、Premium。下面是一些功能的对比。
在下面是个VIP的商品列表这里可能有三个或者两个商品要展示的信息是商品名称、付费金额以及单价。它分为两列左边的主要字体是商品名称下面一行小字是付费金额右边的主要字体是单价。
最下面是一个购买的按钮,居中显示,点击后拉起应用商店的支付。
按钮下面可以加一行小字显示“Billed YearlyCancel Anytime.” 注意这个字会随着用户选择的商品变化而变化。
现在,我们可以先生成一下页面看看效果了。
## quest2
# 单词页面
## Q1
首先我们希望把搜索框和右边的Cancel按钮放到一个组件中让它看起来像个整体。为此我们在它们的背景上增加一个矩形框它与整体的背景颜色相同但会有比较细的边框用于和背景区分然后我们把文本框的底色设置跟背景色接近Cancel按钮只显示白色文字即可
其次我们现在用HStack封装了ListList是我们所需要的动态填充的数据。但现在的页面比较难看我们希望封装List的部分跟背景色完全重合这样从视觉上看会只有几个List的内容。
请你帮忙修改一下代码,然后我们观察一下效果。有问题可以问我。
# SettingsView 页面
首先我们使用了List来展示几个功能但我不希望有header这一行我希望能够把Section的内容直接衔接到页面顶端。这应该如何设置 还是说我们可以更换其他组件来实现这个功能?
好的。我们继续来修改。
首先我希望这个ScrollView能撑满整个页面这样能保持背景颜色的一致性
其次,我们需要对每个功能增加一些效果:
"Upgrade to Premium" ,我们在文字的左侧需要增加一个向上的箭头图标,用户点击这段文本,弹出我们之前写好的 VIPPaymentView
"Feedback", 我们在文字的左侧同样加一个反馈的图标用户点击后调用appstore的反馈入口
"About",我们在文字的左侧也加一个图标,用户点击后,会弹出一个包含 Privacy Policy 和 User Terms 的页面;
"Restore Pruchases",左侧增加一个向上的箭头图标,用户点击后,调用我们已经开发完成的 IapManager 中的 restorePurchases 方法。
现在,请你理解需求,并在上面的代码上完成修改。
## Term of Use
我们的AIGrammar应用已经开发了一段时间了。为了准备把它上架到app store应用中我们需要准备两个文案其中一个是用户服务条款也就是 Term of Use。现在我们的应用会上架到除中国大陆以外的市场它主要会包含对英语文本的语法和拼写纠错翻译英文到中文的互相翻译英文单词的词典功能等。并且它会提供免费的基础服务以及付费订阅的高级服务。除此之外我们还希望用户可以使用他们的google或者apple账户来注册AIGrammar这样会更好的完善付费功能与历史数据保存等。基于以上的内容你可以用英语帮我写一篇Term of Use吗
好的,那能继续给我一个 Privacy Policy 吗?
## NetworkManager
在 NetworkManager 的 checkGrammar 函数中它的header是这样的
let headers: HTTPHeaders = createAuthorizationHeader()
现在我们需要在headers中增加两个参数一个是 timezone 它是一个字符串,是用户所在的时区;另一个是 secondsfromgmt ,它表示用户所在市区与格林威治时间的差。
请正确获取这两个参数并把它拼接到headers中。
另外,考虑到我们可能有若干个接口都需要增加这两个参数,所以可以把他们封装成一个函数。
很好。你还记得我们统一封装的网络应答吧,它是这样的:
struct APIResponse<T: Decodable>: Decodable {
let ret: Int
let message: String
let data: T?
}
现在我们有个问题。服务端的接口它的data字段直接是一个json格式的数组比如返回的是我们之前定义过的 GrammarRes 数组。
// 确保GrammarRes遵循Codable协议以支持JSON解析
struct GrammarRes: Codable {
var plain: String
var type: String
var reason: String
var correction: [String]
}
那么,我们应该调用 performRequest 时,应该怎么传递 completion 部分?
我们根据之前编写的 NetWorkManager 类的代码在其中增加了一个函数它用来处理IAP的验证代码如下
// 查询VIP订单属于 NetWorkManager 类。
func IapVerify(receiptData: Data, appAccountToken: UUID?, productId: String, transactionId: UInt64, completion: @escaping (Result<IAPVerifyRsp, Error>) -> Void) {
let url = globalEnvironment.iapVerifyURL
let parameters: [String: Any] = ["transid":transactionId, "appaccounttoken": appAccountToken ?? "", "productid":productId, "receiptData":receiptData]
let headers: HTTPHeaders = createAuthorizationHeader()
performRequest(
endpoint: url,
parameters: parameters,
method: .post,
encoding: URLEncoding.httpBody,
headers: headers, // 示例使用JWT token
completion: { (result: Result<IAPVerifyRsp, Error>) in
switch result {
case .success(let rsp):
logger.info("verify succ: \(rsp.ret)")
completion(.success(rsp))
case .failure(let error):
logger.error("Error: \(error.localizedDescription)")
completion(.failure(error))
}
}
)
}
现在,我们需要在 IapManager中完成 validateReceipt 函数,它功能是调用上面的 IapVerify并且获得其返回根据返回结果来控制一些界面的行为比如弹出成功页面等。现在请你完成代码。
现在我们调整一下它的输出。如果服务器端的http响应码是200那么它正确处理的数据格式如下
{
"ret": 0,
"message": "success",
"data": {
"id": 10002,
"userid": "",
"username": "",
"vip": 0
}
}
如果服务器端处理出错了,它会返回这样的格式:
{
"ret": 500,
"message": "bad request",
"data": nil
}
现在我们需要按照这个格式处理数据。处理逻辑是如果服务器成功响应即返回了200状态码那么先解析ret字段如果ret为0那么继续匹配我们之前定义的结构体比如
struct VIPStatusResponse: Codable {
var isvip: Int
}
如果ret不为0需要按照出错来处理并不需要解析data字段。请调整你的代码。
class InitApp {
static let shared = InitApp()
private let userDefaults = UserDefaults.standard
private let deviceIDKey = "DeviceID"
init() {
initializeApp()
}
private func initializeApp() {
// do something
print("init")
}
}
这是一个用swift5编写的类。请问它的 shared 变量是什么作用? 如果我想在app启动时就进行这个类的初始化那应该怎么调用
我们创建 user.go 文件,它完成我们的用户相关的功能,并被 main.go 中的echo入口函数调用。第一个功能是当用户启动app时发送的查询请求
1函数名是 queryUserHandler 他读取 echo框架中的 请求参数,分别是 deviceid 和 userid类型为string
2我们使用 deviceid 查询 user表以deviceid匹配 user.DeviceID如果查询到记录则返回 IDUserIDUserName 如果查询不到则说明该用户不存在需要插入一条记录user.DeviceID=deviceid返回 ID
3我们用查询到的ID来查询 vip表如果查询到则返回 vip = vip.IsVIP, 如果查询不到,则 vip=0
4我们定义个json结构体作为函数的整体返回格式为 {"userid" : ID, "username": UserName, "vip": vip}
现在,请完成这部分的代码。
我们在使用swift5开发iOS应用。我们打算创建一个swift文件它里面有一个initAPP类用于执行在app启动时的各种初始化动作。包括
1获取 DeviceID。如果本地的 UserDefaults 中没有数据,那么需要调用 TrustDecision 来获取DeviceID如果 UserDefaults 中有,则直接使用;
2获取用户的VIP状态它需要发起一个网络访问我们使用 Alamofire 网络框架包,来发起查询;获取到的 VIP 状态,保存为一个内部的变量即可,这样我们每次启动都会查询一次;
现在,请你帮我写出 initAPP 的代码框架,并且完成初步的工作。
我们需要在里面增加一个函数,它的功能是从服务器端获取用户的付费状态:
1后端服务器的地址是 http://localhost:1080/user/queryvip 使用POST提交参数使用 x-www-form-urlencoded 编码。
2提交的参数user 是个字符串它是用户注册的用户名deviceID是设备ID它是一个字符串。
3服务器返回的结果如果 http code 为200表示正常返回body内容为 {"isvip":"%d"} 对应的%d就是我们要的结果其他http code 表示为异常;
4使用之前写的基于 Alamofire 和 SwiftJWT 的代码完成服务器访问注意要处理正常和异常的返回情况并且我们需要设定服务器访问的超时时间为10s
5我们在一个 initAPP 类的函数 queryVIP 中调用上面的函数,如果正确返回,则设置 initAPP 类中的 变量 vipStatus它是一个bool类型对应上面body中的 isvip 的值。
请结合已完成的NetworkManager代码实现上述功能。
好的,我们调整一下当前的实现:
1我们不需要使用echo框架因为在我们的主程序中已经包含了NewUserBenefits 只需要完成特定功能即可;
2我们需要修改返回内容明确区分用户是否有权益、权益已正常消耗以及其他的错误为此我们除了error还要增加一个返回值可以是 int返回 0 表示成功,其他值表示失败;
3我们的输入参数除了userID, timeZone之外还需要增加一个 secondsFromGMT 它是一个 int类型的值表示为 传入的时区,与格林威治时间的偏移;
4我们增加一下代码逻辑time.LoadLocation(timeZone) 这里增加一下错误处理如果失败了比如传入的timezone无法匹配等那么 我们用 secondsFromGMT 来计算传入的时区;
5我们需要增加一个 query 函数,它有一个输入参数 userID用于查询数据库中所有与之相关的key并以json格式的数据进行返回
6考虑到 redis 的处理性能问题,我们希望把当前的创建连接方法,改为有最大连接限制的连接池,每次查询时,从连接池中获取;
请你按照上面的修改意见,继续完善代码。
我在使用apple的 IAP功能接入storekit2在购买接口时这样传入 appAccountToken
let uuid = Product.PurchaseOption.appAccountToken(UUID.init(uuidString: "xxxxx")!)
let result = try await product.purchase(options: [uuid])
但在运行时报错了显示Fatal error: Unexpectedly found nil while unwrapping an Optional value 。这是为什么?如何才能正确的传入 appAccountToken 以及如何设置appAccountToken才能更好的完成交易
我在打印 StoreKit2 返回的交易结果时,期望能把交易的 jsonRepresentation 整体打印出来,但是用下面的方式:
if let receiptData = try? transaction.jsonRepresentation {
print("Transaction Receipt: \(receiptData)")
}
它的输出只是 Transaction Receipt: 769 bytes 。如何才能详细打印出 jsonRepresentation
很棒!我已经引入了 TrustDecision使用它来获取 DeviceID的相关代码是这样的
import TrustDecision
var options = [String : NSObject]()
let responseCallback: ([String : Any])-> Void = { response in
// Response in sub-thread, do something with the response
// Get DeviceId
let deviceId = response["device_id"]
// Get DeviceRiskLabel
let deviceRisk = response["device_risk_label"]
// Get DeviceDetail
let deviceDetail = response["device_detail"]
}
options["callback"] = unsafeBitCast(responseCallback as @convention(block) ([String : Any]) -> Void, to: AnyObject.self) as? NSObject
let manager = TDMobRiskManager.sharedManager()
manager?.pointee.initWithOptions(options)
应用到我们的App中我希望在App启动时就调用以上的相关代码来获取DeviceID然后把这个DeviceID存储在一个公共的变量中使得每个功能模块都能很方便的使用它但不能修改它。请帮我实现以上代码。
作为提醒,我们回顾一下当前的代码结构:
一个AIGrammarApp view用来引用 AllTabView
AllTabView实现了底部导航栏它有四个功能模块GrammarCheckView、WordsView、TranslateView、SettingsView
我们给之前写的代码加一些网络请求。当用户点击“赞”或者“踩”的按钮时我们发起一个Http请求它使用POST方法发送的参数有
product值为“trans”表示为翻译模块
input 和 output分别为该点击对应的原文和译文
res当动作为点赞时为“good”点踩时为“bad”。
发送之后可以不用等待应答,就返回到主应用中。这个请求的地址是 http://localhost:1080/grammar/feedback使用x-www-form-urlencoded提交参数。
请注意,我们希望使用 Alamofire 网络框架来实现它,并且希望请求的地址是写在配置文件中,而不是在代码里。这意味着我们可以在之前定义的 GlobalEnvironment 中加入这个变量。
很好。现在我们要继续在这个请求上加上鉴权。
我们在早些时候写完了生成DeviceID并把它存入全局变量的工作。我们为AF.request中加入jwt鉴权。参与鉴权的信息
jwt token secret 是一个变量我们可以放在GlobalEnvironment中它的值是your_jwt_secret
jwt采用HS256加密payload 是:
{
"deviceID": "%s",
"gid": "%s",
"exp1": %d
}
其中 deviceID 是我们之前取到的值gid 是用户ID目前保留为空 exp1是时间戳字段我们设置为当前的时间戳加一天。
现在我们需要把这个鉴权过程加上去并设置合适的http header重新发起请求。
SubmitTextEditor 的功能需求是,把用户输入的文本 inputText提交到后端的服务器上等服务器返回了结果之后解析结果并显示到界面上来。为此我们需要
1后端服务器的地址是 http://localhost:1080/grammar/translate 使用POST提交参数使用 x-www-form-urlencoded 编码。
2提交的参数input 的值是 $inputText也就是用户输入的内容 lang 的值我们先传入字符串 chs后面我们将处理它。
3服务器返回的结果如果 http code 为200表示正常返回body内容为 {"translation":"%s"} 对应的%s就是我们要的结果output其他http code 表示为异常;
4使用之前写的基于 Alamofire 和 SwiftJWT 的代码完成服务器访问注意要处理正常和异常的返回情况并且我们需要设定服务器访问的超时时间为10s
5当服务器正常返回时我们调用addTranslation此时需要把返回结果output传入如果是异常返回弹出toast提示用户“network errorplease retry later.”
请结合刚才的代码,实现上述功能。
TextField("word", text: $searchText, onCommit 这里,我们对 onCommit事件加上与服务器端的交互
1我们读取 searchText 的值,把它作为参数提交到服务端;
2后端服务器的地址是 http://localhost:1080/grammar/words 使用POST提交参数使用 x-www-form-urlencoded 编码。
3提交的参数input 的值是 $searchText也就是用户输入的内容 lang 的值我们先传入字符串 eng后面我们将处理它。
4服务器返回的结果如果 http code 为200表示正常返回body内容为 {"word":"$word", "explain":["$exp1", "exp2", ...], "phrase": ["$p1", "$p2", "p3", ...], "sync": ["$s1", "s2", ...]} ,我们需要解析结果,并把 explain, phrase, sync 分别赋值给 wordDefinitions, commonPhrases, synonyms。请注意我们可能需要修改这几个变量的声明方式。
5当 http code 为200 以外的值时表示为结果异常需要弹出toast提示用户“network errorplease retry later.”
6我们的网络交互部分可以在刚刚完成的 NetworkManager 中添加;这样 wordsview中只需要调用接口即可保持代码简洁。
现在,请你理解上面的需求,并输出相关的代码。
let wordDefinitions = ["Definition 1", "Definition 2", "Definition 3", "Definition 4", "Definition 5"]
let commonPhrases = ["Phrase 1", "Phrase 2", "Phrase 3"]
let synonyms = ["Synonym 1", "Synonym 2", "Synonym 3"]
很好。我们现在优化一下globalEnvironment它现在是这样写的
import Foundation
import SwiftUI
class GlobalConfig : ObservableObject{
@Published var backgroundColor : UInt = 0xFFE4E1
}
class GlobalEnvironment: ObservableObject {
@Published var deviceID: String = ""
var jwtSecret: String = "your_jwt_secret"
// 请求地址
var baseHost: String = "http://localhost:1080"
var feedbackURL: String = "http://192.168.2.2:1080/grammar/feedback"
var translateURL: String = "http://192.168.2.2:1080/grammar/translate"
var dictURL: String = "http://192.168.2.2:1080/grammar/words"
var grammarURL: String = "http://192.168.2.2:1080/grammar/grammar"
}
// 全局实例
let globalEnvironment = GlobalEnvironment()
我们可能有多个URL地址他们的基础路径可能是一样的比如域名端口等这些所以我们不希望每个地址变量都写一遍而是有一个baseHost定义公共的部分后续的URL都以此为基础加上自己的相对路径。现在请你帮我优化一下上面的写法。
我们要在 InputView 中的 Button("Check") 事件里,增加对服务器端的访问。整个过程是:
1我们读取textInput的值把它作为参数提交到服务端
2后端服务器的地址是 http://localhost:1080/grammar/grammar 使用POST提交参数使用 x-www-form-urlencoded 编码。
3提交的参数input 的值是 $textInput也就是用户输入的内容 lang 的值我们先传入字符串 eng后面我们将处理它。
4服务器返回的结果如果 http code 为200表示正常返回body内容格式为 [{"plain":"%s", "type":"%s", "reason":"%s", correction":["%s", "%s"]}, {"plain":"%s", "type":"%s", "reason":"%s", "correction":["%s", "%s"]}, ……] 这是一个json数组。我们需要解析它并赋值给 GrammarCheckView 中的 $results。它是一个数组格式为GrammarRes请注意为了适配解析我们可能要对 GrammarRes 的定义做调整。
5当我们处理完服务器交互之后可以继续 Button("Check") 里的几个现有的设置,这样,页面会切换到 ResultView显示结果。
6当 http code 为200 以外的值时表示为结果异常需要弹出toast提示用户“network errorplease retry later.”
7我们的网络交互部分可以在刚刚完成的 NetworkManager 中添加;这样 wordsview中只需要调用接口即可保持代码简洁。
现在,请你理解上面的需求,并输出相关的代码。
textContent
在 ResultView 中,我们有个函数 func styledText() -> Text ,它的作用是检查结果中的字符串,并且拼接出一个完整的输出。现在我们调整一下它的实现:
1我们的 outstr 默认为 textContent这意味着我们有完整的 textInput
2对results的每一次遍历我们可以用 res.plain 去匹配 outstr如果匹配的到那么用 getColoredText 转换之后的字符串,替换被匹配到的 outstr 中的子串;
3这样遍历完毕之后我们的到的 outstr是完整的 textInput并在每个results的输出部分被做了标注标注的方式是 getColoredText。
4请注意res.plain 去匹配 outstr 的时候,我们认为每个 res.plain 出现的顺序,与其在 textInput 中出现的顺序是匹配的;这意味着,如果 results 的第一个 res.plain 被匹配到了,那么第二个 res.plain 去匹配时,无需从 outstr的开头匹配只需从上一次匹配到的位置之后开始。
它报错了。我们换个实现:
1首先我们遍历 results ,使用 res.plain 去分隔 textContent使它成为一个数组这个数组不被 res.plain 命中的子串,使用 textContent 中的原文;
2被 res.plain 命中的子串,我们使用 getColoredText 转换之后的字符串,来替代它,存储到数组中;
3最后我们按顺序把整个数组拼接起来。
好了,重新实现一遍。
我们有一个字符串 textContent和一个由若干个textContent的子串组成的数组 results。这些子串在数组中的顺序与其在textContent中出现的顺序一致。现在我们的需求是把textContent中出现在results 中的子串,换成 getColoredText(str: res.plain, type: res.type, index: index) 的结果而其他不匹配的子串保持不变。请使用swift5写出你的代码。
举个例子:
textContent = "This is a demo text with more complex grammar checking algorithm of the pro version. This app have been designed to help you to write correctly and appear more professional. I work really hard to make this app as god as possible. If you are happy with the results, please consider supporting the app by subscribing to the PRO plan. The text writen here is to show you how much the app is capable of with the pro version. is this something you would like to use?"
results =
[{"plain":"This app have", "type":"grammar", "reason":"verb agreement error", "correction":["This app has"]},
{"plain":"god", "type":"spell", "reason":"spelling error", "correction":["good"]},
{"plain":"The text writen here", "type":"spell", "reason":"spelling error", "correction":["The text written here"]},
{"plain":"is this something", "type":"grammar", "reason":"start of sentence punctuation error", "correction":["Is this something"]}]

123
prompts_server.txt Normal file
View File

@ -0,0 +1,123 @@
prompts_server.txt
现在我们需要增加一个函数 QueryUserBenefits它的输入参数与 QueryUserBenefits 类似ID保持一致增加一个 datestr 参数,它的格式类似于 '20240705', 默认值是'*'。函数的作用是删除 ID:datastr的redis key如果datestr为默认值的话则表示全部。请完成你的代码
到现在为止,我们的代码中包含了多个.go文件并且每个文件完成了不同的功能它还使用了 echo框架来处理http请求。
我们想在工程里面加入日志以更好的记录发生了什么。go.uber.org/zap 是一个高性能的日志库github.com/natefinch/lumberjack 可以进行日志文件的切割所以我们想把这两个引入到我们的代码中并且对日志格式做一定的调整比如json格式加入日期日志级别打印日志的文件和代码行等等。
现在,请你给出相关的代码。
根据我们使用的全局变量的logger.go版本我们现在需要在init()时传入一些变量使得日志可以配置。这些变量包括lumberjack.Logger中使用的Filename, MaxSize, MaxBackups, MaxAge, Compress ,以及 atomicLevel.SetLevel 使用的日志级别。
配置项会在config.toml中使用我们已经实现的config.go来完成配置的读取并且在 main.go 中获取配置调用init()时传入。
请注意,这里面可能会涉及到类型转换,比如把配置项中的 日志级别字符串,转换成 atomicLevel.SetLevel 所需要的枚举值。
type LoggerConfig struct {
// 在 Go 中,只有首字母大写的字段才能被外部包(如 viper访问。
LogFile string `mapstructure:"log_file"`
MaxSize int `mapstructure:"max_size"`
MaxBackups int `mapstructure:"max_backups"`
MaxAge int `mapstructure:"max_age"`
Compress bool `mapstructure:"compress"`
Level string `mapstructure:"level"`
}
我们在config.go 中解析toml文件的上面一段报错了显示 toml: incomplete number 这是什么问题,应该如何解决?
for _, response := range responses {
transantions, err := client.ParseSignedTransactions(response.SignedTransactions)
if err != nil {
logger.Error("ParseSignedTransactions error.", zap.Error(err))
return c.JSON(http.StatusInternalServerError, "ParseSignedTransactions error")
}
logger.Debug("transantions", zap.Any("transantions", transantions)) // 打印
//buff, _ := json.Marshal(&transantions)
//fmt.Println(string(buff))
}
transantions 的类型是 []*api.JWSTransaction。现在我们想定义一个变量它把每次for循环所产生的 transantions ,全部放到一起,形成一个大的数组。请问应该怎么写
我们在使用golang编写服务端程序使用echo框架处理http请求并返回给客户端。对于注册到echo上的每个处理函数它的返回有两种一是出错了会返回
echo.NewHTTPError(http.StatusBadRequest, err.Error())
二是正常处理了请求,返回 c.JSON(http.StatusOK, map[string]string{"translation": translation})
现在我们想统一返回格式以便于客户端进行正确的处理。我们希望返回的http状态码都是 200但返回结果是 json 数据: {"ret": %d, "message":"%s", "data":%v} 其中ret为错误吗它是一个数字data也是json格式的数据。
要实现以上的功能我们需要怎么在echo框架上注册函数并且在每个接口处理中应该怎么返回
我用了这种方法,然后在接口函数中返回 return echo.NewHTTPError(http.StatusBadRequest, "no benifits left."),可是最后的输出确是这样:
{
"message": "no benifits left."
}
{
"ret": 400,
"message": "no benifits left.",
"data": null
}
为什么,是哪里出错了吗?
timezone Asia/Shanghai
secondsfromgmt 28800
// 从苹果校验订单后插入vip表中
func UpdateOrderByVerify(ID int, AppAcountToken string, OriginTransID string, transantion *api.JWSTransaction) error {
// 写入vip表如果ID对应记录不存在则插入否则更新
}
这是我们需要完成的函数需要把数据写入到VIP表如果ID对应的记录不存在则插入否则更新写入时IsVIP为1Appstore 为'Apple'ProductID 从transantion中获取
CREATE TABLE aigrammar.vip (
ID INT UNSIGNED NOT NULL,
IsVIP INT DEFAULT 0 NULL COMMENT '1-VIP; 0-not vip',
AppStore varchar(100) DEFAULT 'apple' NULL COMMENT 'apple;google',
ProductID varchar(100) NULL,
ProductType varchar(100) NULL COMMENT 'yearly;monthly;weekly;',
Environment varchar(100) NULL COMMENT 'prod;sandbox',
PurchaseDate TIMESTAMP NULL,
Price INT NULL,
Currency varchar(100) NULL,
Storefront varchar(100) NULL COMMENT 'USA',
ExpDate TIMESTAMP NULL,
AutoRenew INT NULL COMMENT '1-yes;0-no',
OriginalTransactionID varchar(100) NULL COMMENT 'applestore originalTransactionId',
CONSTRAINT vip_pk PRIMARY KEY (ID)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci;
type JWSTransaction struct {
TransactionID string `json:"transactionId,omitempty"`
OriginalTransactionId string `json:"originalTransactionId,omitempty"`
WebOrderLineItemId string `json:"webOrderLineItemId,omitempty"`
BundleID string `json:"bundleId,omitempty"`
ProductID string `json:"productId,omitempty"`
SubscriptionGroupIdentifier string `json:"subscriptionGroupIdentifier,omitempty"`
PurchaseDate int64 `json:"purchaseDate,omitempty"`
OriginalPurchaseDate int64 `json:"originalPurchaseDate,omitempty"`
ExpiresDate int64 `json:"expiresDate,omitempty"`
Quantity int32 `json:"quantity,omitempty"`
Type IAPType `json:"type,omitempty"`
AppAccountToken string `json:"appAccountToken,omitempty"`
InAppOwnershipType string `json:"inAppOwnershipType,omitempty"`
SignedDate int64 `json:"signedDate,omitempty"`
OfferType int32 `json:"offerType,omitempty"`
OfferIdentifier string `json:"offerIdentifier,omitempty"`
RevocationDate int64 `json:"revocationDate,omitempty"`
RevocationReason *int32 `json:"revocationReason,omitempty"`
IsUpgraded bool `json:"isUpgraded,omitempty"`
Storefront string `json:"storefront,omitempty"`
StorefrontId string `json:"storefrontId,omitempty"`
TransactionReason TransactionReason `json:"transactionReason,omitempty"`
Environment Environment `json:"environment,omitempty"`
Price int64 `json:"price,omitempty"`
Currency string `json:"currency,omitempty"`
OfferDiscountType OfferDiscountType `json:"offerDiscountType,omitempty"`
}

58
server.txt Normal file
View File

@ -0,0 +1,58 @@
轻量服务器gz
IP 101.33.230.186
pass: Oscar@123
wordpress_username = admin
wordpress_password = (xBwWp,C1355
mariadb_password = J33mHT26=da!
azure portal:
francecentral
https://grammar.openai.azure.com/
8b68c235b737488ab9a99983a14f8cca
0274ccde58aa47b189f0d13349885ad3
gpt4
gpt35
硅谷服务器ubuntu
49.51.178.206
Tester@123
硅谷服务器centos
170.106.194.18
Tester@123
wordpress_username = admin
wordpress_password = 92#9M$2VsEkx
mariadb_password = if4Uy04.M8L5
腾讯云代码仓库
oscar@easyprompt8.com
Oscar@123
传文件
scp aigrammar ubuntu@49.51.178.206:/usr/local/aigrammar/
# 启动
sudo systemctl start nginx
# 加入到开机自启
sudo systemctl enable nginx
# 输出状态
sudo systemctl status nginx
# 停止
sudo systemctl stop nginx
# 重新加载
sudo systemctl reload nginx
# 配置文件
sudo vi /etc/nginx/conf.d/dev.easyprompt8.com.conf

42
website/about/index.html Normal file
View File

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About AIGrammar</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f4f4f4;
color: #333;
}
.container {
text-align: center;
}
a {
color: #007BFF;
text-decoration: none;
font-size: 1.2em;
}
a:hover {
text-decoration: underline;
}
.spacer {
height: 20px; /* 空行的高度 */
}
</style>
</head>
<body>
<div class="container">
<a href="./terms.html">Term of Use</a>
<div class="spacer"></div>
<a href="./privacy.html">Privacy Policy</a>
</div>
</body>
</html>

View File

@ -0,0 +1,73 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AIGrammar - Privacy Policy</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f4;
color: #333;
}
.container {
width: 80%;
margin: 20px auto;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
h1, h2 {
color: #007BFF;
}
p {
line-height: 1.6;
}
</style>
</head>
<body>
<div class="container">
<h1>Privacy Policy</h1>
<h2>Introduction</h2>
<p>Welcome to AIGrammar. This Privacy Policy explains how we collect, use, disclose, and protect your information when you use our application ("App"). By using the App, you agree to the collection and use of information in accordance with this policy. If you do not agree with the terms of this Privacy Policy, please do not use the App.</p>
<h2>1. Information We Collect</h2>
<p><strong>1.1 Personal Information:</strong> When you register for an account or use our services, we may collect personal information such as your name, email address, and account details.</p>
<p><strong>1.2 Usage Data:</strong> We collect information about your interactions with the App, including the features you use, the content you view, and the actions you take.</p>
<p><strong>1.3 Device Information:</strong> We collect information about the device you use to access the App, including the device type, operating system, and unique device identifiers.</p>
<p><strong>1.4 Log Data:</strong> Our servers automatically collect log data when you access the App. This may include your IP address, browser type, and other usage information.</p>
<h2>2. How We Use Your Information</h2>
<p><strong>2.1 To Provide and Maintain Our Services:</strong> We use your information to operate, maintain, and improve the App.</p>
<p><strong>2.2 To Communicate with You:</strong> We may use your information to communicate with you about your account, our services, and promotional offers.</p>
<p><strong>2.3 To Personalize Your Experience:</strong> We use your information to personalize your experience and provide content and features that match your interests.</p>
<p><strong>2.4 To Improve Our Services:</strong> We analyze usage data and feedback to improve our services and develop new features.</p>
<p><strong>2.5 To Protect Our Services:</strong> We use your information to detect and prevent fraud, abuse, and other harmful activities.</p>
<h2>3. Sharing Your Information</h2>
<p><strong>3.1 Service Providers:</strong> We may share your information with third-party service providers who perform services on our behalf, such as hosting, data analysis, and customer support.</p>
<p><strong>3.2 Legal Requirements:</strong> We may disclose your information if required by law or in response to valid requests by public authorities.</p>
<p><strong>3.3 Business Transfers:</strong> In the event of a merger, acquisition, or sale of assets, your information may be transferred as part of the transaction.</p>
<p><strong>3.4 With Your Consent:</strong> We may share your information with your consent or at your direction.</p>
<h2>4. Data Security</h2>
<p>We take reasonable measures to protect your information from unauthorized access, use, or disclosure. However, no internet or email transmission is ever fully secure or error-free.</p>
<h2>5. Your Rights</h2>
<p>You have the right to access, update, and delete your personal information. You can manage your account settings and preferences within the App or by contacting us at support@aigrammar.com.</p>
<h2>6. Children's Privacy</h2>
<p>Our services are not intended for use by children under the age of 13. We do not knowingly collect personal information from children under 13. If we become aware that we have collected personal information from a child under 13, we will take steps to delete such information.</p>
<h2>7. Changes to This Privacy Policy</h2>
<p>We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on the App. Your continued use of the App after the changes have been posted constitutes your acceptance of the new Privacy Policy.</p>
<h2>8. Contact Us</h2>
<p>If you have any questions about this Privacy Policy, please contact us at service@easyprompt8.com</p>
</div>
</body>
</html>

76
website/about/terms.html Normal file
View File

@ -0,0 +1,76 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AIGrammar - Term of Use</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f4;
color: #333;
}
.container {
width: 80%;
margin: 20px auto;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
h1, h2 {
color: #007BFF;
}
p {
line-height: 1.6;
}
</style>
</head>
<body>
<div class="container">
<h1>Term of Use</h1>
<h2>Welcome to AIGrammar</h2>
<p>These Terms of Use ("Terms") govern your use of the AIGrammar application ("App"), which is designed to provide grammar and spelling correction, translation services (English to Chinese and vice versa), and dictionary features for English words. By accessing or using the App, you agree to be bound by these Terms. If you do not agree with these Terms, please do not use the App.</p>
<h2>1. Services Provided</h2>
<p><strong>1.1 Grammar and Spelling Correction:</strong> The App offers tools to correct grammar and spelling errors in English texts.</p>
<p><strong>1.2 Translation Services:</strong> The App provides translation services between English and Chinese.</p>
<p><strong>1.3 Dictionary Features:</strong> Users can look up English words, their definitions, and synonyms.</p>
<p><strong>1.4 Subscription Services:</strong> In addition to the free basic services, the App offers premium services through a subscription model.</p>
<h2>2. Account Registration</h2>
<p><strong>2.1 Google and Apple Account Registration:</strong> Users can register and log in to the App using their Google or Apple accounts.</p>
<p><strong>2.2 User Responsibilities:</strong> You are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account.</p>
<h2>3. Subscription and Payment</h2>
<p><strong>3.1 Subscription Plans:</strong> The App offers various subscription plans for premium services. Details of the subscription plans are provided within the App.</p>
<p><strong>3.2 Payment:</strong> Payment for subscriptions can be made through the App Store. All payments are subject to the terms and conditions of the App Store.</p>
<p><strong>3.3 Cancellation:</strong> You can cancel your subscription at any time through your App Store account settings.</p>
<h2>4. User Conduct</h2>
<p><strong>4.1 Acceptable Use:</strong> You agree to use the App only for lawful purposes and in accordance with these Terms.</p>
<p><strong>4.2 Prohibited Activities:</strong> You agree not to engage in any activity that interferes with or disrupts the App or its services.</p>
<h2>5. Intellectual Property</h2>
<p><strong>5.1 Ownership:</strong> The App and its content, features, and functionality are owned by AIGrammar and its licensors.</p>
<p><strong>5.2 Restrictions:</strong> You may not copy, modify, distribute, sell, or lease any part of the App.</p>
<h2>6. Privacy</h2>
<p>Your use of the App is also governed by our <a href="./privacy.html" >Privacy Policy.</a> </p>
<h2>7. Termination</h2>
<p>We reserve the right to terminate or suspend your access to the App at any time, without notice, for conduct that we believe violates these Terms or is harmful to other users of the App.</p>
<h2>8. Limitation of Liability</h2>
<p>To the fullest extent permitted by law, AIGrammar shall not be liable for any indirect, incidental, special, consequential, or punitive damages, or any loss of profits or revenues, whether incurred directly or indirectly, or any loss of data, use, goodwill, or other intangible losses, resulting from your use of the App.</p>
<h2>9. Changes to the Terms</h2>
<p>We may modify these Terms from time to time. We will notify you of any changes by posting the new Terms on the App. Your continued use of the App after the changes have been posted constitutes your acceptance of the new Terms.</p>
<h2>10. Contact Us</h2>
<p>If you have any questions about these Terms, please contact us at service@easyprompt8.com</p>
</div>
</body>
</html>

View File

@ -0,0 +1,98 @@
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name api.easyprompt8.com;
#请填写证书文件的相对路径或绝对路径
ssl_certificate ./crt/api.easyprompt8.com_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key ./crt/api.easyprompt8.com.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location /iap/callback {
rewrite ^/iap/callback /pub/iap/callback break;
proxy_pass http://localhost:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~* ^/iap/((?!callback).*)$ {
proxy_pass http://localhost:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# location /iap/ {
location ~* ^/(pub|grammar|user)/ {
proxy_pass http://localhost:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_log /var/log/nginx/api_aigrammar_error.log;
access_log /var/log/nginx/api_aigrammar_access.log;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}

Binary file not shown.

View File

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIDBjCCAe4CAQAwgY8xCzAJBgNVBAYTAkNOMRAwDgYDVQQIEwdCZWlqaW5nMRAw
DgYDVQQHEwdCZWlqaW5nMQ8wDQYDVQQKEwZxY2xvdWQxDzANBgNVBAsTBnFjbG91
ZDEcMBoGA1UEAxMTYXBpLmVhc3lwcm9tcHQ4LmNvbTEcMBoGA1UEBRMTNjA0MDcw
OTMyMzMzMDk2OTg5ODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK78
qfQYzTMKn781PluGmTqrqyNXAbjSZiwLWW7CriXe1XwqQkZw4sSeM+Ih1rkfp2mP
ocZ+Gv9zXuDFuiRxy8ouYE5ACXE760Xv9PqzZJlQzD87y3y/4ISGQ1HzagQzRysn
TAlus3tqtc5eO/TCfYLDBBJKgZ3RCQiGQyMaeYOG0tAL+WGLG5VWY7qrabmmAvfN
lyf1gv/RvL6mVdT5Jaq1cUrhYrqGH6YbEd1IG9JGQJ6FWAwgLF1s09YW5sDhhhHM
6dKLUN4+0zo7m/nN4PivsQJUXYqH/hry2dlanfmcp+Kr787+5Y6tyuOKsU4Yyhvd
lIO7n/AWioIxLO5bAJkCAwEAAaAxMC8GCSqGSIb3DQEJDjEiMCAwHgYDVR0RBBcw
FYITYXBpLmVhc3lwcm9tcHQ4LmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAOKrBzwtK
7/ZMNsKD4suIXlDJOtbZAe/BI7RUkhvPzLkWuA/PNn32am9vHrnhfPVQjWM0hnri
nfJM9ZeWvIcvBSQ3H1xXzAGpClAhqo8jtLIFdhJzunTUk4pN5neZOcWT8B3hdTpJ
lKLB4ui127u0jn0sGnrN4rb3FkoJ8l+2sS1a3Ath0tJ+PtW/fhK3Ai0r1eZPBfQO
umx9fAC0+LEH0WALMyZQp0Oeam+wIE7so28BjtwJMS/auZnoRfQtCJioWyt2ynBI
y8+gxvKQFBqppLljUFbX7iKIbG/GKJche9McS6OZhZbic9QB6GBzX11je9LCS3pi
jucSBjNQ9ooUuQ==
-----END CERTIFICATE REQUEST-----

View File

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEArvyp9BjNMwqfvzU+W4aZOqurI1cBuNJmLAtZbsKuJd7VfCpC
RnDixJ4z4iHWuR+naY+hxn4a/3Ne4MW6JHHLyi5gTkAJcTvrRe/0+rNkmVDMPzvL
fL/ghIZDUfNqBDNHKydMCW6ze2q1zl479MJ9gsMEEkqBndEJCIZDIxp5g4bS0Av5
YYsblVZjuqtpuaYC982XJ/WC/9G8vqZV1PklqrVxSuFiuoYfphsR3Ugb0kZAnoVY
DCAsXWzT1hbmwOGGEczp0otQ3j7TOjub+c3g+K+xAlRdiof+GvLZ2Vqd+Zyn4qvv
zv7ljq3K44qxThjKG92Ug7uf8BaKgjEs7lsAmQIDAQABAoIBABBTHf/ZuHsEiLar
3u9m9TCWB1c6rLxzVHjTbjp5CwoZac01nA06Rs2U/L4h7ghDPbkJX0xHQ3mFZ9qM
V7tCqoJoJS/npXnc3ywdILuqtL3g3c0gZPF0bRuv8uPYU5GkvwT1m5BdtXzUDbX8
8Jb69f6W9vBF5yWz9KXI8MZ7l85/Q97P9r/h3sZQTXRzQQjm6Gzr3OGHSGklLref
70I/IFr+T7/0t1rTpNTWIgBt3y1gfUjPAP/h1bSKkEjfKno40pnk+2KeeQGcPe5/
6sDU5uWFWN85Tvhu6eAKWasNG2KlwbPgZ7h7lxPThEvR2sQB8/TjuCRDxmceKqOX
Ygw23OkCgYEA47P5btV8dNnRd6HDq8U8sOZpu9oYEsq1h9iSajXXqyhqCQiiMK6e
CF8KyFhLWnfLCDkXOzj6cmZUp40Fv26rO3rEDhguVgm9V4I5vLvUcKOl3RaZiVoc
Lqc1o7KH4knx/5H6BK3nSIzW4u7LupmxQV63jCuior6a7aovFRzsA5cCgYEAxLub
urSQAWrqAkHoxLs3xfltfstjQs0ejqL5FfzSfALlCwrfrKoNygwRl4swhkNMduW2
DiH/Y8dZn/UDR5ZoVbKabrZZenMlIoCTh/OKvjHbQCz1GvZPEuiM0hrQye7CrUV4
EcfvhOnytBBKdCgFuYZ6fD552dESW9605ddB408CgYEAu+rd4bBiQ/U3P6nK2Emw
qrWdcSCuWWPdqLz9KJZC5Mg3qjjr0Y1qcrItLeZgWcsfTiv/liqR1jPJjXV+1tu4
iR/qCU+/fdYP4tZgW/gPfN4xlmJ+V7J8K6xnQi+moQQxqZ+JXK9Afsls1mAI1njc
pnxKsm2YjQMMzTN0I9J4nQUCgYBz0JIT7rob64nJPG3AawqhZH4eN7O+nqxPggeq
9wQed0HJJ2SX7CBkAojUst8lGzdHg2GSnlcPsUrEzONaYGQZlyQs6vJwEJsa3aB8
V1YlM4qEFDNS5Q+V7QsBoUGqrwEyKgROS2poz6TOdgyupuT/2/f9bnYjUV5CcTAD
Yp5qJwKBgQCggn69LomQuCqAD0yf/Adu5guycRkIGI1kFeHFh9JjQGAjp9KerLxH
73jNWIeMsVmLd6fNZ/0nm1/+hOUGQ81pkZA1f64bNxGKZkdkl1kDfHTTOQXYGaQb
09UHPqCM+9sn7KEWTRsa+AvPvTZYZWsgDOsCc3M4TTYU6BTMc4VqrQ==
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,63 @@
-----BEGIN CERTIFICATE-----
MIIF9TCCBF2gAwIBAgIQU6lc/OHZRHICpAP1Pq66VDANBgkqhkiG9w0BAQwFADBZ
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEjMCEGA1UEAxMaVHJ1c3RBc2lhIFJTQSBEViBUTFMgQ0EgRzIwHhcNMjQw
ODA4MDAwMDAwWhcNMjQxMTA2MjM1OTU5WjAeMRwwGgYDVQQDExNhcGkuZWFzeXBy
b21wdDguY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArvyp9BjN
MwqfvzU+W4aZOqurI1cBuNJmLAtZbsKuJd7VfCpCRnDixJ4z4iHWuR+naY+hxn4a
/3Ne4MW6JHHLyi5gTkAJcTvrRe/0+rNkmVDMPzvLfL/ghIZDUfNqBDNHKydMCW6z
e2q1zl479MJ9gsMEEkqBndEJCIZDIxp5g4bS0Av5YYsblVZjuqtpuaYC982XJ/WC
/9G8vqZV1PklqrVxSuFiuoYfphsR3Ugb0kZAnoVYDCAsXWzT1hbmwOGGEczp0otQ
3j7TOjub+c3g+K+xAlRdiof+GvLZ2Vqd+Zyn4qvvzv7ljq3K44qxThjKG92Ug7uf
8BaKgjEs7lsAmQIDAQABo4ICcjCCAm4wHwYDVR0jBBgwFoAUXzp8ERB+DGdxYdyL
o7UAA2f1VxwwHQYDVR0OBBYEFEqHxb0vjDhHmNp8rmo8sgHkPHDUMA4GA1UdDwEB
/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
BQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIxMCUwIwYIKwYBBQUHAgEWF2h0
dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATB9BggrBgEFBQcBAQRxMG8w
QgYIKwYBBQUHMAKGNmh0dHA6Ly9jcnQudHJ1c3QtcHJvdmlkZXIuY24vVHJ1c3RB
c2lhUlNBRFZUTFNDQUcyLmNydDApBggrBgEFBQcwAYYdaHR0cDovL29jc3AudHJ1
c3QtcHJvdmlkZXIuY24wggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdgB2/4g/Crb7
lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAZExpcB8AAAEAwBHMEUCICrkS+w7
TDM2pfX9jVmC+TPYt30WicTcl5PLnGEKh7iIAiEAwPXO5r4eAFXAd6nRLsWQZlI6
VLKeMlcp3lHoghh7VVEAdQA/F0tP1yJHWJQdZRyEvg0S7ZA3fx+FauvBvyiF7Phk
bgAAAZExpcA/AAAEAwBGMEQCIDaSJLwmJkBe3P5hFQGEEQl4yOdFunm6ovGeKkps
4YqkAiBEwGw8Wztd0d6Gcxln93Gc8Rw1I4OZdvUDaaC2TVQD3zAeBgNVHREEFzAV
ghNhcGkuZWFzeXByb21wdDguY29tMA0GCSqGSIb3DQEBDAUAA4IBgQAgUjBTbSF1
ojnPYYKgp8v0Zp2W6b6Kxwq45Bo1T0jTCI1fgUtJUOhCe7CiYE7jCj2Jd3xsbssQ
ZYbtEVOXg98fi9aKSrqoQqgyHHicJ6IJDVJzx1X+WjE/A9qlIWn08ELfA0cPe1eR
dW0qxntcAI9s1QFQj9lO4j//YOz4hUwCE5dnvt9GT0aaPjzuRwWjHbJUgY8Svq7g
b0v7KT7GyJ4oblTZIrAeXk4e+f4o0jc5SK48gIRmbrghH1OZ52Uq3Jt+3dkgYwGU
WBX46L+4/bucpq+GXUZjxw6LCJqAW+A3iT1NmqlWj+bZHdxLpUk2rOJ8YQx0y5i4
YVryMefLekDHBTODlg9FkhthFk7k6waSTvoqGvsXOS8Nm7nsDN1vgJHnk9Ssyg4c
WcQdDuS6dLhZ10fUnbGFk+ohhv8CdZjYco2asg84UHYPYrM8OUtssguRuV4cJxS9
TQGtzyYMkM38UU1DvxI2jXU7VHaj1vXxLUWVFm3WC5Z/qo1ExTEzBOA=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
-----END CERTIFICATE-----

View File

@ -0,0 +1,63 @@
-----BEGIN CERTIFICATE-----
MIIF9TCCBF2gAwIBAgIQU6lc/OHZRHICpAP1Pq66VDANBgkqhkiG9w0BAQwFADBZ
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEjMCEGA1UEAxMaVHJ1c3RBc2lhIFJTQSBEViBUTFMgQ0EgRzIwHhcNMjQw
ODA4MDAwMDAwWhcNMjQxMTA2MjM1OTU5WjAeMRwwGgYDVQQDExNhcGkuZWFzeXBy
b21wdDguY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArvyp9BjN
MwqfvzU+W4aZOqurI1cBuNJmLAtZbsKuJd7VfCpCRnDixJ4z4iHWuR+naY+hxn4a
/3Ne4MW6JHHLyi5gTkAJcTvrRe/0+rNkmVDMPzvLfL/ghIZDUfNqBDNHKydMCW6z
e2q1zl479MJ9gsMEEkqBndEJCIZDIxp5g4bS0Av5YYsblVZjuqtpuaYC982XJ/WC
/9G8vqZV1PklqrVxSuFiuoYfphsR3Ugb0kZAnoVYDCAsXWzT1hbmwOGGEczp0otQ
3j7TOjub+c3g+K+xAlRdiof+GvLZ2Vqd+Zyn4qvvzv7ljq3K44qxThjKG92Ug7uf
8BaKgjEs7lsAmQIDAQABo4ICcjCCAm4wHwYDVR0jBBgwFoAUXzp8ERB+DGdxYdyL
o7UAA2f1VxwwHQYDVR0OBBYEFEqHxb0vjDhHmNp8rmo8sgHkPHDUMA4GA1UdDwEB
/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
BQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIxMCUwIwYIKwYBBQUHAgEWF2h0
dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATB9BggrBgEFBQcBAQRxMG8w
QgYIKwYBBQUHMAKGNmh0dHA6Ly9jcnQudHJ1c3QtcHJvdmlkZXIuY24vVHJ1c3RB
c2lhUlNBRFZUTFNDQUcyLmNydDApBggrBgEFBQcwAYYdaHR0cDovL29jc3AudHJ1
c3QtcHJvdmlkZXIuY24wggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdgB2/4g/Crb7
lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAZExpcB8AAAEAwBHMEUCICrkS+w7
TDM2pfX9jVmC+TPYt30WicTcl5PLnGEKh7iIAiEAwPXO5r4eAFXAd6nRLsWQZlI6
VLKeMlcp3lHoghh7VVEAdQA/F0tP1yJHWJQdZRyEvg0S7ZA3fx+FauvBvyiF7Phk
bgAAAZExpcA/AAAEAwBGMEQCIDaSJLwmJkBe3P5hFQGEEQl4yOdFunm6ovGeKkps
4YqkAiBEwGw8Wztd0d6Gcxln93Gc8Rw1I4OZdvUDaaC2TVQD3zAeBgNVHREEFzAV
ghNhcGkuZWFzeXByb21wdDguY29tMA0GCSqGSIb3DQEBDAUAA4IBgQAgUjBTbSF1
ojnPYYKgp8v0Zp2W6b6Kxwq45Bo1T0jTCI1fgUtJUOhCe7CiYE7jCj2Jd3xsbssQ
ZYbtEVOXg98fi9aKSrqoQqgyHHicJ6IJDVJzx1X+WjE/A9qlIWn08ELfA0cPe1eR
dW0qxntcAI9s1QFQj9lO4j//YOz4hUwCE5dnvt9GT0aaPjzuRwWjHbJUgY8Svq7g
b0v7KT7GyJ4oblTZIrAeXk4e+f4o0jc5SK48gIRmbrghH1OZ52Uq3Jt+3dkgYwGU
WBX46L+4/bucpq+GXUZjxw6LCJqAW+A3iT1NmqlWj+bZHdxLpUk2rOJ8YQx0y5i4
YVryMefLekDHBTODlg9FkhthFk7k6waSTvoqGvsXOS8Nm7nsDN1vgJHnk9Ssyg4c
WcQdDuS6dLhZ10fUnbGFk+ohhv8CdZjYco2asg84UHYPYrM8OUtssguRuV4cJxS9
TQGtzyYMkM38UU1DvxI2jXU7VHaj1vXxLUWVFm3WC5Z/qo1ExTEzBOA=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
-----END CERTIFICATE-----

View File

@ -0,0 +1,98 @@
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name dev.easyprompt8.com;
#请填写证书文件的相对路径或绝对路径
ssl_certificate ./crt/dev.easyprompt8.com_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key ./crt/dev.easyprompt8.com.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location /iap/callback {
rewrite ^/iap/callback /pub/iap/callback break;
proxy_pass http://localhost:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~* ^/iap/((?!callback).*)$ {
proxy_pass http://localhost:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# location /iap/ {
location ~* ^/(pub|grammar|user)/ {
proxy_pass http://localhost:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_log /var/log/nginx/dev_aigrammar_error.log;
access_log /var/log/nginx/dev_aigrammar_access.log;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}

Binary file not shown.

View File

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIDBjCCAe4CAQAwgY8xCzAJBgNVBAYTAkNOMRAwDgYDVQQIEwdCZWlqaW5nMRAw
DgYDVQQHEwdCZWlqaW5nMQ8wDQYDVQQKEwZxY2xvdWQxDzANBgNVBAsTBnFjbG91
ZDEcMBoGA1UEAxMTZGV2LmVhc3lwcm9tcHQ4LmNvbTEcMBoGA1UEBRMTNTc4NDc2
Njk1MTAwMDI3MDUwOTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3l
c1ZidUjux1JnSZ6PAWGcMML8FmZkHNKpXTFKpECSEIwlsSN4oM04Px190chRar2K
03H1dCXtdsxSF/uCfVwGCexaFn1c1lWJfzn8/JrTwEu4sj3g1kpEu1hkwWePQo7/
Ue/i1lAgnavdrNSgc/sGV2BiS3QymcvWClAO+EQ5AUylgB7+j53vY5TZF7s7AK3K
KhnwdqLwM6o1hN/ENGWxIAj9lSDK8SMy5VNQr1TqfHFaKp+9oYPjV/6LGE1sZuq9
SEmR7lk/J+jDGLVJVdgSbuLUQ+Y1kgxr6wIUTCZqn6GpU49UPZNC1YWQtYFF0Mbd
nQrGluoTLLmXFaefYxkCAwEAAaAxMC8GCSqGSIb3DQEJDjEiMCAwHgYDVR0RBBcw
FYITZGV2LmVhc3lwcm9tcHQ4LmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAbOOic75Z
yO8FZ6CJXU5q9U8cAnhWL5pvi9MYMZ5+DDbX7Ey/0Zxkff6PcpksBv7RKQBzgFnk
b38rbfdgFjAfpUAI8xhjMDd5FTrXLJWh3mxgZL/hwYlmzkFDnDlETpPhCFjcoDab
FKxWtmU5O4wQsjOHRb7lqLI7F1EnBxmGQs3AKlJypqseKiwW0WoR/NKSrj1gJ/TU
McbqNC4AVsk7o1hxQGhPrP0VABklWANsxUM/K/tsonXTTL2CfaocKA6XvgRb03Hp
G7+GSVPJmOxcXij3WB2tnu8l4AAkzJMtOOnuxd96uVYzw+SRNIlHNberFwzwzA2o
niUghUlAvNrMag==
-----END CERTIFICATE REQUEST-----

View File

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAveVzVmJ1SO7HUmdJno8BYZwwwvwWZmQc0qldMUqkQJIQjCWx
I3igzTg/HX3RyFFqvYrTcfV0Je12zFIX+4J9XAYJ7FoWfVzWVYl/Ofz8mtPAS7iy
PeDWSkS7WGTBZ49Cjv9R7+LWUCCdq92s1KBz+wZXYGJLdDKZy9YKUA74RDkBTKWA
Hv6Pne9jlNkXuzsArcoqGfB2ovAzqjWE38Q0ZbEgCP2VIMrxIzLlU1CvVOp8cVoq
n72hg+NX/osYTWxm6r1ISZHuWT8n6MMYtUlV2BJu4tRD5jWSDGvrAhRMJmqfoalT
j1Q9k0LVhZC1gUXQxt2dCsaW6hMsuZcVp59jGQIDAQABAoIBAB2Drht9DhGZ2yz5
lL2qKGLNbd7AY5LieIBdhniEy2alzSCbMx76PrPmzBh/V720ucxf6WFK7xR+BfrX
v5Z9v5Iv9hbgIaK2bTG6PyX6JiDCTJ74Q+vOKEA+0od4kX7RC11CXa/VJ84oY5k0
yQn7LkuTvrziSivzOWgvCkdLLFcd6HdABA4wqrkliiWs6plROGzFNmXegcOAhVnE
9WUmmI4wSrW4uErGGkXtHYIiSDfZw9CMUI4sfHuCfGqruc55NrX8m1b2bwpKISfu
+UoceHf9P1WiXted0sRSSJ74nO4nn/eO4IQsxC184lxMW1/aa06jEWT6BeDFtcY+
ZBu5JwECgYEA5boG3dBb0WS2TwQ5adW6gn17mgqAv/X+xwQRV8Vy4+Y3bbOhP2no
JCLY5P3liHkG0w/BmGCYGk7eudKE0KXGtPWhcq/8QcuMwYtA4Vel20hwD1o0FFVG
G8iaz7fgIRxrlri1C83DaFbrAgWTZbVIAM+XY/fS4hEoz4o5jY7ySvECgYEA051D
hVlsr2Znl+CEuvWkPOUE2EOWun7XxI4oN+g0Himzrg+BrnHpj20KPq5km8WsLWtx
1uV/b5UmmVFEch+0cXzKkpuAHDlsWCN/35Ngwy66+ERfiG9kUZFZc7mPZtXOoGER
B7ElqLHJLX62/8UCghQq0+OqzPRe3VyzRmWmiqkCgYAkcc+3DuASJxUZEgV9uc99
9iROus3UJlWGAyoxL3zblOFEQRQauFWArhqUsYbhkLm5cC15XBGlUs/Y0QILC9Gr
UbCMPkkZsw4gglQHq9z/Hc3RUbEjbKfTro6I15XyCs0yuxjVx43xlqBv0KyinRDQ
OB6/WEiXXruHuVkKERx1MQKBgFxr8AR6lPRaRl5XycCZ7jxGTgJiKp+TLIuFBt28
BZ8y2W3pCdt1lut0VSghJIHAKL3BknunyiuiubP2gW1SmY2DUjoLvj0Ve1NXVc8A
4B7+9tvdiNfexrK1R5s6bP4d3VvAaR6x6N+vnkzHbgdxNPI4+qeGZJ+VDyWhCg9x
7/XZAoGAWfd0+jKWVkfa7c9dtPVEwKFF3BGbxNWzGGJeH3bQCHPbUBdaLrwW/JmK
oZqjJJ8lKjCIt2n6MFKoqg9VOdqJ7w5c4i9VKx5+w/wksbs2xdedvy1Ot4QsWs2N
He2xsb8SDYxqMnYhQYA9pyIne98Axsg5E8hkpxgwnn8Iv3KhSks=
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,63 @@
-----BEGIN CERTIFICATE-----
MIIF9TCCBF2gAwIBAgIQRO3YkMMhxvj3S5Mm6reknjANBgkqhkiG9w0BAQwFADBZ
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEjMCEGA1UEAxMaVHJ1c3RBc2lhIFJTQSBEViBUTFMgQ0EgRzIwHhcNMjQw
NjIwMDAwMDAwWhcNMjQwOTE4MjM1OTU5WjAeMRwwGgYDVQQDExNkZXYuZWFzeXBy
b21wdDguY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAveVzVmJ1
SO7HUmdJno8BYZwwwvwWZmQc0qldMUqkQJIQjCWxI3igzTg/HX3RyFFqvYrTcfV0
Je12zFIX+4J9XAYJ7FoWfVzWVYl/Ofz8mtPAS7iyPeDWSkS7WGTBZ49Cjv9R7+LW
UCCdq92s1KBz+wZXYGJLdDKZy9YKUA74RDkBTKWAHv6Pne9jlNkXuzsArcoqGfB2
ovAzqjWE38Q0ZbEgCP2VIMrxIzLlU1CvVOp8cVoqn72hg+NX/osYTWxm6r1ISZHu
WT8n6MMYtUlV2BJu4tRD5jWSDGvrAhRMJmqfoalTj1Q9k0LVhZC1gUXQxt2dCsaW
6hMsuZcVp59jGQIDAQABo4ICcjCCAm4wHwYDVR0jBBgwFoAUXzp8ERB+DGdxYdyL
o7UAA2f1VxwwHQYDVR0OBBYEFCoS0871zEoi3JotpResnWcN8RYVMA4GA1UdDwEB
/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
BQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIxMCUwIwYIKwYBBQUHAgEWF2h0
dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATB9BggrBgEFBQcBAQRxMG8w
QgYIKwYBBQUHMAKGNmh0dHA6Ly9jcnQudHJ1c3QtcHJvdmlkZXIuY24vVHJ1c3RB
c2lhUlNBRFZUTFNDQUcyLmNydDApBggrBgEFBQcwAYYdaHR0cDovL29jc3AudHJ1
c3QtcHJvdmlkZXIuY24wggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdgB2/4g/Crb7
lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAZAzRyDFAAAEAwBHMEUCIG5UsHSS
d90O5Qjy1eBdV6e+uTLdH15qqo7RAeqVXtMnAiEAnuVgOPBXIqmxEmjLSw40SI/T
qKfwqsFOdkk56UNy14wAdQA/F0tP1yJHWJQdZRyEvg0S7ZA3fx+FauvBvyiF7Phk
bgAAAZAzRyCIAAAEAwBGMEQCIFUHRoPkt41l1dn8IVs70/Ev5hprQ8JyuLPVdcq2
nrKIAiBlSPeaCLA/3chZBaCThAc3wmCEXps3oToaVUeh2uN4XTAeBgNVHREEFzAV
ghNkZXYuZWFzeXByb21wdDguY29tMA0GCSqGSIb3DQEBDAUAA4IBgQCOQVmJUNDd
gJVNVR+tQ50H8T0h6j6cN4RANzN6I4ns3g2t8MlxCr7faI/NAgHNtd7Pb6Bwm1Vn
AdqelLvntxt05Zf0PCNrqTLEocGCCo038lOz6C1NT3U+in4A/NL1nMs733jgSh7N
BXy9MqLed+NTijoL2w37hsSuyx781ZaTJuiZ764e/R6g/GTF4JDyM+w+P2EEOJKV
UyVZ83dV1ks9QOsbH9R9yFEzW05j09EBIreTgaM8xq16ylfTaA5l4OgMRbEd1OwH
NbVPz1bi3iFVHXlGzlwOhmNV/C0FxOul5bclLImRG0urHlY6tpsz1tkrrS0pITQJ
8hnlkO31jLSmOuSEiv9HaHwm2DS0uuOt0hgdyHG+gj6SYwtHg3B6MPltdQhmFq35
ArYZQA8K2F9vhhv/8q72h9S+/XWz0kcWux4wyZLJWbMQ9CEhJ48qEOyGt4WSZmGE
wPP7Yl3kixpENSRYIqCvO9LkzZPtg902TfQSMLG+aibz2BpbisYcYlM=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
-----END CERTIFICATE-----

View File

@ -0,0 +1,63 @@
-----BEGIN CERTIFICATE-----
MIIF9TCCBF2gAwIBAgIQRO3YkMMhxvj3S5Mm6reknjANBgkqhkiG9w0BAQwFADBZ
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEjMCEGA1UEAxMaVHJ1c3RBc2lhIFJTQSBEViBUTFMgQ0EgRzIwHhcNMjQw
NjIwMDAwMDAwWhcNMjQwOTE4MjM1OTU5WjAeMRwwGgYDVQQDExNkZXYuZWFzeXBy
b21wdDguY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAveVzVmJ1
SO7HUmdJno8BYZwwwvwWZmQc0qldMUqkQJIQjCWxI3igzTg/HX3RyFFqvYrTcfV0
Je12zFIX+4J9XAYJ7FoWfVzWVYl/Ofz8mtPAS7iyPeDWSkS7WGTBZ49Cjv9R7+LW
UCCdq92s1KBz+wZXYGJLdDKZy9YKUA74RDkBTKWAHv6Pne9jlNkXuzsArcoqGfB2
ovAzqjWE38Q0ZbEgCP2VIMrxIzLlU1CvVOp8cVoqn72hg+NX/osYTWxm6r1ISZHu
WT8n6MMYtUlV2BJu4tRD5jWSDGvrAhRMJmqfoalTj1Q9k0LVhZC1gUXQxt2dCsaW
6hMsuZcVp59jGQIDAQABo4ICcjCCAm4wHwYDVR0jBBgwFoAUXzp8ERB+DGdxYdyL
o7UAA2f1VxwwHQYDVR0OBBYEFCoS0871zEoi3JotpResnWcN8RYVMA4GA1UdDwEB
/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
BQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIxMCUwIwYIKwYBBQUHAgEWF2h0
dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATB9BggrBgEFBQcBAQRxMG8w
QgYIKwYBBQUHMAKGNmh0dHA6Ly9jcnQudHJ1c3QtcHJvdmlkZXIuY24vVHJ1c3RB
c2lhUlNBRFZUTFNDQUcyLmNydDApBggrBgEFBQcwAYYdaHR0cDovL29jc3AudHJ1
c3QtcHJvdmlkZXIuY24wggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdgB2/4g/Crb7
lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAZAzRyDFAAAEAwBHMEUCIG5UsHSS
d90O5Qjy1eBdV6e+uTLdH15qqo7RAeqVXtMnAiEAnuVgOPBXIqmxEmjLSw40SI/T
qKfwqsFOdkk56UNy14wAdQA/F0tP1yJHWJQdZRyEvg0S7ZA3fx+FauvBvyiF7Phk
bgAAAZAzRyCIAAAEAwBGMEQCIFUHRoPkt41l1dn8IVs70/Ev5hprQ8JyuLPVdcq2
nrKIAiBlSPeaCLA/3chZBaCThAc3wmCEXps3oToaVUeh2uN4XTAeBgNVHREEFzAV
ghNkZXYuZWFzeXByb21wdDguY29tMA0GCSqGSIb3DQEBDAUAA4IBgQCOQVmJUNDd
gJVNVR+tQ50H8T0h6j6cN4RANzN6I4ns3g2t8MlxCr7faI/NAgHNtd7Pb6Bwm1Vn
AdqelLvntxt05Zf0PCNrqTLEocGCCo038lOz6C1NT3U+in4A/NL1nMs733jgSh7N
BXy9MqLed+NTijoL2w37hsSuyx781ZaTJuiZ764e/R6g/GTF4JDyM+w+P2EEOJKV
UyVZ83dV1ks9QOsbH9R9yFEzW05j09EBIreTgaM8xq16ylfTaA5l4OgMRbEd1OwH
NbVPz1bi3iFVHXlGzlwOhmNV/C0FxOul5bclLImRG0urHlY6tpsz1tkrrS0pITQJ
8hnlkO31jLSmOuSEiv9HaHwm2DS0uuOt0hgdyHG+gj6SYwtHg3B6MPltdQhmFq35
ArYZQA8K2F9vhhv/8q72h9S+/XWz0kcWux4wyZLJWbMQ9CEhJ48qEOyGt4WSZmGE
wPP7Yl3kixpENSRYIqCvO9LkzZPtg902TfQSMLG+aibz2BpbisYcYlM=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
-----END CERTIFICATE-----

View File

@ -0,0 +1,98 @@
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name grammar.easyprompt8.com;
#请填写证书文件的相对路径或绝对路径
ssl_certificate ./crt/grammar.easyprompt8.com_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key ./crt/grammar.easyprompt8.com.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
error_log /var/log/nginx/aigrammar_error.log;
access_log /var/log/nginx/aigrammar_access.log;
location = / {
proxy_pass http://170.106.194.18/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Location for assets like CSS, JS, images (assuming they are stored under a specific directory)
location /wp-content/ {
proxy_pass http://170.106.194.18/wp-content/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Location for assets like CSS, JS, images (assuming they are stored under a specific directory)
location /wp-includes/ {
proxy_pass http://170.106.194.18/wp-includes/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}

Binary file not shown.

View File

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIDDjCCAfYCAQAwgZMxCzAJBgNVBAYTAkNOMRAwDgYDVQQIEwdCZWlqaW5nMRAw
DgYDVQQHEwdCZWlqaW5nMQ8wDQYDVQQKEwZxY2xvdWQxDzANBgNVBAsTBnFjbG91
ZDEgMB4GA1UEAxMXZ3JhbW1hci5lYXN5cHJvbXB0OC5jb20xHDAaBgNVBAUTEzc4
NDEyNzAwMDg3MTI2NjA2ODIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDViE8x0kAAmonRx1LrFwflVDIFkOhLltiO61iwB/uo7NDo8NElkWuID2/+dqEJ
HZ0r9TDOHpxKCB2/7ahkzPE0FvZqUGG2YGdoEXd8i9BUTUAhYj3uTka/ycBqZ+TP
jRXS+9cSpr94xxh12h3RTr7q06gUEpG27BVGDicWtAVASdigx/CLLUZqKvia3hWI
k3uIgUIWcVcuaT/VwiBu1ascpNI8XQYqpsu+riGBPZvc+tbty7i/WQI8tN43O5jD
rjIMu5FnzBXtdD35h/u1JPeGm6W2prk/aXBsfYjg3dtuq3l3MESKYmdTuNVloDo/
hdt/a+k4iO3CSBvLbZncFaA7AgMBAAGgNTAzBgkqhkiG9w0BCQ4xJjAkMCIGA1Ud
EQQbMBmCF2dyYW1tYXIuZWFzeXByb21wdDguY29tMA0GCSqGSIb3DQEBCwUAA4IB
AQAq6rKHFnaCgEHLH7Yc05RrwVdgyjRVdy8CPIXfZy8Ma69AhcZygq+NCi37PGj2
d77ohgdXWjmyVpg7BuewXs5GOJMsAoBA/81UDWKp3sXfOGTTVkDSTyQN8CbajIP8
sNHcuBpvPdoe1vaJYDXprBLTuVNArHOAwV2K1OzBxFEFZ703RtsdGluJE7hNJgCK
CCNDAbEctdpPqWqmzfBd86COS2m3KVPY71MbD5h7+nVVkjzwvP05emc+dRgqXg53
qcuSZhYOUlSihYStiOH9PqG3rZDKPSbSCSXwueOfrMvTiKR5Z8C/PKtgPEapSSgq
aCw1ZRS+bOlKIFil5DX3oWGl
-----END CERTIFICATE REQUEST-----

View File

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA1YhPMdJAAJqJ0cdS6xcH5VQyBZDoS5bYjutYsAf7qOzQ6PDR
JZFriA9v/nahCR2dK/Uwzh6cSggdv+2oZMzxNBb2alBhtmBnaBF3fIvQVE1AIWI9
7k5Gv8nAamfkz40V0vvXEqa/eMcYddod0U6+6tOoFBKRtuwVRg4nFrQFQEnYoMfw
iy1Gair4mt4ViJN7iIFCFnFXLmk/1cIgbtWrHKTSPF0GKqbLvq4hgT2b3PrW7cu4
v1kCPLTeNzuYw64yDLuRZ8wV7XQ9+Yf7tST3hpultqa5P2lwbH2I4N3bbqt5dzBE
imJnU7jVZaA6P4Xbf2vpOIjtwkgby22Z3BWgOwIDAQABAoIBAA5WCHsf0ow30+jx
qO9/rFgJPxKAmBf7GK7/vgSThKHixGPfRytuh/mqj6pV7JngEx1QaOZtx7Bwuw6X
tiaOW+NTZ1fb7bOA5XBnO85w1JvUU+np3p6RQs69jN2X/BSzNDPmFJp79370XwAK
lNXoo4jAjRhL5tyRHRyG9rjffTrDmxERH4h6HuoZ3x0TIXmFg2OxFMF3UrLeR0cq
0ohR4yCn/Sgii1EzHUf6ZKlt2Sguo48UOEyBLyOuQyypDKfIJD7uEu9Ww4qHiFqw
6dEy+9Hsbpj1soeNxi81z0u5+yBGyJfJ6x9Z06TX13tCLxv+RoJsPZI9MSmnLKnK
2bvwa4ECgYEA5SvcipmCtnH4k8VM1XL6INbQ7agpUuMDyc/KrE2n7PrtcaomWd7v
gAX3uXFrtiNUI4sOmSw76zacwEO8NOE79aebYrDMpEjY+9NMJih57e5VwNmQRBul
N987ZrlsPrQIBCEpJIYPb2ciXhDFZnB8/qoOMygYsvqcsDj41wucbvcCgYEA7ofC
Zz9NCpqYQfyI9OAhcly3SRyW5tfoIP5lqt7TtZsExRokyO+lsmg1NKOwO/Lp+VYv
MiaTkZ7qGoXeu1d2MNALmA7esczsFGfKAD+WuxzptCSEkToXNBKchL22Gc4TlRHs
4+Y/PsAqscxhNLq072k4eaTB86Hyu5LzKNG+k90CgYAQF6Zi7SiqmxIzfjVI/8vk
pnEBXz+XnG1VrIu00bcrAuvNgX8z7F2xBbpBgV9o6M4tuMQLqXmDqNAVCCydIfvN
4jkdEwErwBnMhSfhvhHhzUykQCLLRY2ygLBxJDAfrxCpCZMUB33p+roFFPRnnxqH
33Ujznr9hm+eSEHhB+WyPQKBgC47BcS5EheCCwyPA4RihFkD+0oiTmUDZ6wtYksR
0PqbxvrkrEh9miHP7K/9IcUcuZhnydHwhB1vLXRiid7JftDLIdQg3aycSQ1TaGVP
7cjqO6l8gm0bUy/2g3t+wXKS7FyyErXBBHUHDb9UG2r63OKiBB4ffq/XrZIJUzOQ
I13JAoGALGaQnXMpDoXe1kWJpjTuNSu6MBHHWq0K/WXvKRzvZMHKbwPMmIQMgubN
ncdzx7BIGUMazr46pF8X3KSQC7m73sob/hTGELCsdmnPwmR2DKg8LkkKUtKsQ9Tt
kaBKymZmFzjQc03Y7iWv3qYhmhkK4REQJ+oaT5nOI+0WoI/I+7o=
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,64 @@
-----BEGIN CERTIFICATE-----
MIIF/jCCBGagAwIBAgIQPzDAIg6pSB5ccHLQ+cAURjANBgkqhkiG9w0BAQwFADBZ
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEjMCEGA1UEAxMaVHJ1c3RBc2lhIFJTQSBEViBUTFMgQ0EgRzIwHhcNMjQw
ODA4MDAwMDAwWhcNMjQxMTA2MjM1OTU5WjAiMSAwHgYDVQQDExdncmFtbWFyLmVh
c3lwcm9tcHQ4LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANWI
TzHSQACaidHHUusXB+VUMgWQ6EuW2I7rWLAH+6js0Ojw0SWRa4gPb/52oQkdnSv1
MM4enEoIHb/tqGTM8TQW9mpQYbZgZ2gRd3yL0FRNQCFiPe5ORr/JwGpn5M+NFdL7
1xKmv3jHGHXaHdFOvurTqBQSkbbsFUYOJxa0BUBJ2KDH8IstRmoq+JreFYiTe4iB
QhZxVy5pP9XCIG7Vqxyk0jxdBiqmy76uIYE9m9z61u3LuL9ZAjy03jc7mMOuMgy7
kWfMFe10PfmH+7Uk94abpbamuT9pcGx9iODd226reXcwRIpiZ1O41WWgOj+F239r
6TiI7cJIG8ttmdwVoDsCAwEAAaOCAncwggJzMB8GA1UdIwQYMBaAFF86fBEQfgxn
cWHci6O1AANn9VccMB0GA1UdDgQWBBQutQNY7KIW0zBHb2cVPh86z0qzYDAOBgNV
HQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwSQYDVR0gBEIwQDA0BgsrBgEEAbIxAQICMTAlMCMGCCsGAQUFBwIB
FhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBAgEwfQYIKwYBBQUHAQEE
cTBvMEIGCCsGAQUFBzAChjZodHRwOi8vY3J0LnRydXN0LXByb3ZpZGVyLmNuL1Ry
dXN0QXNpYVJTQURWVExTQ0FHMi5jcnQwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3Nw
LnRydXN0LXByb3ZpZGVyLmNuMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHYAdv+I
Pwq2+5VRwmHM9Ye6NLSkzbsp3GhCCp/mZ0xaOnQAAAGRMaO99gAABAMARzBFAiEA
xvL9IBvnPR0t9VOW5MvsXtZFqnzZoZxdtlY59K4Mt68CIFMDDHYMtAJ0ZW0oQocV
APxmpX1XJ7lT/2Lqj52SBwwYAHYAPxdLT9ciR1iUHWUchL4NEu2QN38fhWrrwb8o
hez4ZG4AAAGRMaO91gAABAMARzBFAiEAhEgue88k4Jwsh4p01ERma+OXH9IKEtZk
qO1BdHQfTl4CIGLv/GemWq32okvweCQOjyWeYa7qEEuVRGvbxU5SkckfMCIGA1Ud
EQQbMBmCF2dyYW1tYXIuZWFzeXByb21wdDguY29tMA0GCSqGSIb3DQEBDAUAA4IB
gQBlNMvz1JbHLnqqdmScktOX9hEYNhQ4rCCVreLJgHECnRIOt1p/64LG7QzdZJov
+ptljkp61sFev1NdUep6C2p2MVedaDbxV7X70L3bZLdy3vDI0XU15buSiAgupfHJ
ciwY0P9Ep/gGHjUD2fOq7gNY4zziPuKnZ26dGE6rK0E3SltmV9x8h4h0ZOwyZ+59
31RAwBkInou82oJCylhGqIuJaJF1iFvI80rhCuNgxjjPpFajQT8h5+CRBHC+/mZj
JpPIN+im/kT1A4Ysd+2+CzeoedcQ1MeNsy/71dHHm7hugorT6SiE/wkgGrovoy7x
ilwMafkpmcPtsYhnGh8IPmGV9kI8VSvqZGkJfDyLxRvA76phmmBdG4xsfHz1mIZH
jMf7NODh+YeGTqzkIZBmSgLnQ9fWFffI5/IfbAdve7cWJrefSlUIHr71X1lH/oxn
BufF0IgkwLIXQjX7mWdGgbVyGW0Baw4Jnip64Komi2tgZw+wH3EVoFBcS8OxZOCD
Ys8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
-----END CERTIFICATE-----

View File

@ -0,0 +1,64 @@
-----BEGIN CERTIFICATE-----
MIIF/jCCBGagAwIBAgIQPzDAIg6pSB5ccHLQ+cAURjANBgkqhkiG9w0BAQwFADBZ
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEjMCEGA1UEAxMaVHJ1c3RBc2lhIFJTQSBEViBUTFMgQ0EgRzIwHhcNMjQw
ODA4MDAwMDAwWhcNMjQxMTA2MjM1OTU5WjAiMSAwHgYDVQQDExdncmFtbWFyLmVh
c3lwcm9tcHQ4LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANWI
TzHSQACaidHHUusXB+VUMgWQ6EuW2I7rWLAH+6js0Ojw0SWRa4gPb/52oQkdnSv1
MM4enEoIHb/tqGTM8TQW9mpQYbZgZ2gRd3yL0FRNQCFiPe5ORr/JwGpn5M+NFdL7
1xKmv3jHGHXaHdFOvurTqBQSkbbsFUYOJxa0BUBJ2KDH8IstRmoq+JreFYiTe4iB
QhZxVy5pP9XCIG7Vqxyk0jxdBiqmy76uIYE9m9z61u3LuL9ZAjy03jc7mMOuMgy7
kWfMFe10PfmH+7Uk94abpbamuT9pcGx9iODd226reXcwRIpiZ1O41WWgOj+F239r
6TiI7cJIG8ttmdwVoDsCAwEAAaOCAncwggJzMB8GA1UdIwQYMBaAFF86fBEQfgxn
cWHci6O1AANn9VccMB0GA1UdDgQWBBQutQNY7KIW0zBHb2cVPh86z0qzYDAOBgNV
HQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwSQYDVR0gBEIwQDA0BgsrBgEEAbIxAQICMTAlMCMGCCsGAQUFBwIB
FhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBAgEwfQYIKwYBBQUHAQEE
cTBvMEIGCCsGAQUFBzAChjZodHRwOi8vY3J0LnRydXN0LXByb3ZpZGVyLmNuL1Ry
dXN0QXNpYVJTQURWVExTQ0FHMi5jcnQwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3Nw
LnRydXN0LXByb3ZpZGVyLmNuMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHYAdv+I
Pwq2+5VRwmHM9Ye6NLSkzbsp3GhCCp/mZ0xaOnQAAAGRMaO99gAABAMARzBFAiEA
xvL9IBvnPR0t9VOW5MvsXtZFqnzZoZxdtlY59K4Mt68CIFMDDHYMtAJ0ZW0oQocV
APxmpX1XJ7lT/2Lqj52SBwwYAHYAPxdLT9ciR1iUHWUchL4NEu2QN38fhWrrwb8o
hez4ZG4AAAGRMaO91gAABAMARzBFAiEAhEgue88k4Jwsh4p01ERma+OXH9IKEtZk
qO1BdHQfTl4CIGLv/GemWq32okvweCQOjyWeYa7qEEuVRGvbxU5SkckfMCIGA1Ud
EQQbMBmCF2dyYW1tYXIuZWFzeXByb21wdDguY29tMA0GCSqGSIb3DQEBDAUAA4IB
gQBlNMvz1JbHLnqqdmScktOX9hEYNhQ4rCCVreLJgHECnRIOt1p/64LG7QzdZJov
+ptljkp61sFev1NdUep6C2p2MVedaDbxV7X70L3bZLdy3vDI0XU15buSiAgupfHJ
ciwY0P9Ep/gGHjUD2fOq7gNY4zziPuKnZ26dGE6rK0E3SltmV9x8h4h0ZOwyZ+59
31RAwBkInou82oJCylhGqIuJaJF1iFvI80rhCuNgxjjPpFajQT8h5+CRBHC+/mZj
JpPIN+im/kT1A4Ysd+2+CzeoedcQ1MeNsy/71dHHm7hugorT6SiE/wkgGrovoy7x
ilwMafkpmcPtsYhnGh8IPmGV9kI8VSvqZGkJfDyLxRvA76phmmBdG4xsfHz1mIZH
jMf7NODh+YeGTqzkIZBmSgLnQ9fWFffI5/IfbAdve7cWJrefSlUIHr71X1lH/oxn
BufF0IgkwLIXQjX7mWdGgbVyGW0Baw4Jnip64Komi2tgZw+wH3EVoFBcS8OxZOCD
Ys8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
-----END CERTIFICATE-----

BIN
wordpress/Raft.zip Normal file

Binary file not shown.

View File

@ -0,0 +1,8 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://www.wpcom.cn/
IDList=
IconFile=http://www.iztwp.com/favicon.ico
IconIndex=1
HotKey=0

Binary file not shown.

View File

@ -0,0 +1,8 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://www.iztwp.com/
IDList=
IconFile=http://www.iztwp.com/favicon.ico
IconIndex=1
HotKey=0

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@ -0,0 +1,66 @@
### 介绍
追格企业官网主题(开源版)由追格( [www.zhuige.com](https://www.zhuige.com) 开发的一款开源WordPress主题专为企业建站和追格企业官网小程序开源版PC配套而设计功能集新闻动态、留言反馈、产品与服务、公司简介、联系我们等模块遵循GPL V2.0开源协议发布。
![追格企业官网主题](https://www.zhuige.com/uploads/20211102/3378f552d2bf156df7960b6c37f92f2e.png)
**主题演示**https://ow.jiangqie.com/
**主题下载**https://gitee.com/zhuige_com/zhuige_theme_ow_free
### 联系交流
微信:**jianbing2011**(加微信,进微信群交流)
<img src="https://www.zhuige.com/ad/qrcode.png" alt="扫码加微信/关注公众号" width="600" height="370" />
### 追格(酱茄)开源产品
1. 追格资讯小程序Free[https://www.zhuige.com/product/zxfree.html](https://www.zhuige.com/product/zxfree.html)
2. 酱茄主题Free[https://www.zhuige.com/product/ztfree.html](https://www.zhuige.com/product/ztfree.html)
3. 追格企业官网小程序Free[https://www.zhuige.com/product/gwfree.html](https://www.zhuige.com/product/gwfree.html)
4. 追格企业官网主题:[https://www.zhuige.com/product/gwztfree.html](https://www.zhuige.com/product/gwztfree.html)
5. 追格积-分商城小程序:[https://www.zhuige.com/product/jf.html](https://www.zhuige.com/product/jf.html)
6. 追格商城小程序:[https://www.zhuige.com/product/sc.html](https://www.zhuige.com/product/sc.html)
### 主题预览
![追格企业官网主题预览1](https://www.zhuige.com/uploads/20211101/9f660e65f0684af357aff659aba0f0ff.png)
![追格企业官网主题预览2](https://www.zhuige.com/uploads/20211101/04c85d54e0e043baa1bc4c8bb6674819.png)
### 安装教程
就和其他wordpress主题一样把zhuige-ow-free上传到 wp-content\themes 主题目录,然后启用就可以了。
更详细的安装文档:[安装文档](https://www.zhuige.com/docs/gwztfree)
### 免责声明
用户在接受酱茄服务之前,请务必仔细阅读本声明( www.jiangqie.com/mzsm )并同意本声明。
### 特别声明
黑灰产请绕行!
如果发现有人使用本程序从事违法活动,将即可向公安机关举报,并协助破案!
### 特别感谢
我们借助了开源的力量才得以快速构建出酱茄Free主题在此特别感谢他们排名不分先后
WordPress、JQuery、Layer.js、Codestar Framework、Font Awesome
以及其他未标记的开源及创意…

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,9 @@
# Libarclite-Files
Xcode 14.3 and 14.3.1 has build issues with some Cocoa pods because of the absence of '.a' files in its XcodeDefaults toolchain contents.
Here are all the missing files in Xcode 14.3.
You can download and paste it into this path:
> /Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/
* Note: Create a folder called 'arc' in lib folder if it doesn't exist.