Skip to content

Commit 72670a3

Browse files
author
lucifer
committed
feat: 每日一题
1 parent b27e3c8 commit 72670a3

File tree

7 files changed

+72
-99
lines changed

7 files changed

+72
-99
lines changed

app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const logger = require("koa-logger");
1010
const passport = require("./middleware/passport");
1111
const index = require("./routes/index");
1212
const users = require("./routes/users");
13+
const dailyProblem = require("./routes/dailyProblem");
1314
const lectures = require("./routes/lectures");
1415
const mockUserInfo = require("./middleware/mockUserInfo");
1516

@@ -50,6 +51,7 @@ app.use(async (ctx, next) => {
5051
app.use(index.routes(), index.allowedMethods());
5152
app.use(users.routes(), users.allowedMethods());
5253
app.use(lectures.routes(), lectures.allowedMethods());
54+
app.use(dailyProblem.routes(), dailyProblem.allowedMethods());
5355

5456
// error-handling
5557
app.on("error", (err, ctx) => {

routes/dailyProblem.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
const router = require("koa-router")();
2+
const solutions = require("../static/solution/solutions.json");
3+
const { decrypt } = require("../utils/crypto");
4+
5+
const { success } = require("../utils/request");
6+
7+
router.get("/api/v1/daily-problem", async (ctx) => {
8+
// 1. 获取当前时间
9+
// 2. 根据当前时间和活动开始时间计算当前是 Day 几
10+
// 3. 根据 Day 几 计算出具体返回哪一个题目
11+
12+
ctx.body = success({
13+
day: 1,
14+
title: "66. 加一",
15+
link: "https://leetcode-cn.com/problems/plus-one",
16+
tags: ["基础篇", "数组"], // 目前所有 README 都是没有的。因此如果没有的话,你可以先不返回,有的话就返回。后面我慢慢补
17+
pres: ["数组的遍历(正向遍历和反向遍历)"],
18+
description: `
19+
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
20+
21+
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
22+
23+
你可以假设除了整数 0 之外,这个整数不会以零开头。
24+
25+
示例 1:
26+
27+
输入: [1,2,3]
28+
输出: [1,2,4]
29+
解释: 输入数组表示数字 123。
30+
示例 2:
31+
32+
输入: [4,3,2,1]
33+
输出: [4,3,2,2]
34+
解释: 输入数组表示数字 4321。
35+
`,
36+
});
37+
});
38+
39+
router.get("/api/v1/daily-problem/solution", async (ctx) => {
40+
// 逻辑和上面类似,只是返回值为 Markdown
41+
ctx.body = success({
42+
content: decrypt(solutions[1].content),
43+
});
44+
});
45+
46+
module.exports = router;

static/lectures/generate.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,11 @@ const lectures = {
257257
};
258258

259259
// 先导
260-
lectures.intro["-2"].content = encrypt(
260+
lectures.intro["-4"].content = encrypt(
261261
Buffer.from(fs.readFileSync("./-1.intro-01.md"), "utf8")
262262
);
263263

264-
lectures.intro["-1"].content = encrypt(
264+
lectures.intro["-3"].content = encrypt(
265265
Buffer.from(fs.readFileSync("./-2.intro-02.md"), "utf8")
266266
);
267267

static/lectures/lectures-by-category.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

static/lectures/lectures-by-id.json

Lines changed: 1 addition & 96 deletions
Large diffs are not rendered by default.

static/solution/generate.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const fs = require("fs");
2+
3+
const { encrypt } = require("../../utils/crypto.js");
4+
5+
const solutions = {
6+
1: {},
7+
};
8+
9+
[1].forEach((i) => {
10+
solutions[i].content = encrypt(
11+
Buffer.from(fs.readFileSync(`./d${i}.md`), "utf8")
12+
);
13+
});
14+
15+
fs.writeFileSync("./solutions.json", JSON.stringify(solutions));

static/solution/solutions.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"1": {
3+
"content": "0961e884611df7d4ac47a79a9e3b6f2a73993341aebd41ad6fc7d3caafc892fcc3222bedaf0b7fcdfb836cbe24eca71cb8280288853818d3b129f73dfffaf134e373656b9ebeabb04a634b67711aa6b1b10b920e4b7166f434b925a46078550897d84bd1813143e4aec5d6f95f054e48ae519fcdbda2034784033b768d6ed37af0a6122a666d4f5f7baa6cbb4fd837b55477069068281749ced7107bddb2fa0776760f0766e9ce2e50542c87ac1a675c4eefee9227377a0db75bb45432932999b7d16e9b014db50ef7f42d18d7213d02fc36b2356775ce9f47289b9f6a0c13cda1cfb81fe6a36a8af5372e30e7d3d192136b35f3c4a7640d4679826a532e43f9f00eee96e8d246c9216f1466fc3f057198aabc6db51ff922bf712a46b0cd08911b65f0cf09a486af0e98336807947640ebb92259ede3c5180516b5f31fc850f54966edcc376c0c6cd9de5f9ab8d003d0c2a188c6c8b3951fae788f8f505f56cc84caf19912df39db300350af81f70a7a729dda71c25895f7e5ed70e92473668f76bf26456a6f0563aa8568fae061b18fd6701198f98dcf7de177718652182e75a8eb1f7e1876a86697d1796992b09b766f715a6eae55d1ee222375b6546066353bff13afb639c70e5d24fab6fdafe4bddd58f4113d8c99f5f556d349e1d5ff10cf7785bb8c20634cc98d81021d9defc094c9e513feba15de9c158a31de8911da9b23353321821d698c51cc47b6edf0f4e546477f73e0ca39e7c80a48602a7c9c4fc594f9c8e583bffb0856a4f1fc827c746b382c078d068b8e122a7d19ca01056e1e3ac5fbc394b84b3978555c98485e379b599e1a34f542feb81760f9bd6450e7f47864ae584c17712fed0dc9b96417aaaefca58ddc5236a5b4d0011d3b2b74453222eca819d4bd95e8166ecb53f7dbd86f142fde67a7449f4faacc17a8cfc168e4521ededfe78471145fe006602133ddb89dcb69e8a6c5a37ff52ec8a16186c31d93343233a41ef2c81f38f063e492b817035358f3527dc8d91350fb8c2fa4c362d50866236cdef2090c222b2f8018b9aec571ca7d671f7dccdb55efc664b979140fb7d02cb665ab36d3b86383041c83e7acea38832d72cacdeb813076826829827a1b7d4ebb5b9a6c8e2bd73e917b20e6fbaf4a292b8296fcd12b7b4b05522e13050732d6d8f319361ebeaacc26b732185b6a2eadbc7ff02172de1dce46dcc880fce4e1ccde7ccc1c8ad996ed49b5988996a5e3fdb328976c9530df3d20e35ba68408f43603aba168e0acb85a207d81b2a28b724e4eeacd9fe8d287e98f84e81fa1e45352f1548a0c19b4bd219b9def48e53431a6f88cd09b71c52672d27db04127c971e4815c4b1ced9aac8db6a4e68a88773ea89bd0d4b277f62005b158bdbd90b9fd4afeccc2c76570feae1bc9906c1d3a35ebc284636da18e1f1d86a9796c0204c2bc7734b442ae12bd70a226f6fed8c84789b62816c1049f2956b0bf90730774861814a2b5180ff5e86bb5a9d04f5a3c1976779f7284074e2e69cfda22c14b1560b3cb45a0195eb3fee0188a12735156c746796f8e2d068ea3ec74b3bdbea9371d72f89b9f887e4fc39b787d9e19632efe303b9d5a03597af2cdb439f3051b363299475d7f589604176edbe0da4acc35a5347a2b14dfd03f761b9e670666646a11578dde75a9adb83913d47da68e06c8d91641245a2bbecb882dcfab027ca4bf03a907f9dcde8aa10dcd4b21f25ce3b4049862200769877ffd2ed3a2b05e1abf103987c18fedd4d46a00269b088c6b4c2b31d5d6a910f4f2f415a7510742abf33351eee74c52b96d2a7ffbc62be1d5a586d908047376dc8187a998b1a1bfaafc7e00e831994c0704428bd7bd030a2f2e16194139e9d2b2722009af26ff6fbf9fd6204678295e0916c169684ea24dba68c97ef0349bbd6d2a40012565c8cf03f43e6f11ff311673a53fbc1874ce48a82c49f4015aec309e97bb685ecc4c459bf5eec2e823bc2b805ddf3fc6f33537e592aabcda40318d8440cb10947cc3034e458f90e8431fb942e1fd971eb0e9e522809b04a6616b60c193d7c03f53f575582f2dfe70b59434b85f4f835b9e343771a60b17b09a898391871a6558a1d4ecebc12d34094a94fd11328b08aaf09bb204365a108557738cf68e55ce3854fca2b85e266fd03db370bc3219124af7d07f9f3605181fcead6af10717a239cbddbc9aa9561644ff598a7fc1832b6d54fe2e534f032e3458206f9b2dd186a73eee77df368746fcd41c33e0ef8a24635ac98169770bdb1a4372a0aa76829837e5b1899726861b94b447d1d40ab4fa3ddffd352e519ed2eee7afe56355cb786eb3916f2197cd42d562d0caf6efe1e96d8f6b08e1530d7047ea31a417f0db8907eb17f716b9699990098193a85f1160b17ae418487715f84eb21a19b5d88b769e67cefbf4f307aadb44118bba524c0113e762f37b1dfbf782b6850fda1b36b4c013c3a54b19e25c69c0fed5b9783f5ff356a4bf6c1d3bb8abb14640ccb3d723a64bc85b454a6fd9806bc43d9fb41133b6eb35c2442507d39b9e22c18475c385ba9864f8567f7d9a9efc72838e9cb1e5f4813ae16b70b09764dbfada2d988b4ae5792c9133118d67ddd9653e78533ea412165d6dff80534a469e101c378a6a64efb92fd21eccf03475dc84f12bca9136a627cd90a4f58382ab816bfe859ad43c6e9907545771376dae2f6a4ee6dbe32374abedd399e972a7526301a65624863d591eada1be02c5b00c405fb4fc8446b5d240eccc1c10b8b1c842edd135cf8fc7e6bce2b43547522bdd2dbc82554567cad9eedbe1dd994fb63aaa0178396b362eae58bfdd786e262285b3d5504475c7cf32487c969d72be292bbec378c2d2c1bf1a475c20bd6c83e6fe2eef4dd62ceb12af3aa5a1e7c8b150042f777cdc429c3e1ce03571af88ad9c7d7bc5cd936cdfc29a7bbb0fa92f8fda9c9ce0cf8d0858d9baa00b94406fb2d69ce63d761d084167dcc7a2c2af156aff4bc34a759dd6f2ac17ab74101f593d380b200e08e25ab64454e6c03e49d0c9995a15560f2d1544992807faddfab56f2dc41e191b88e030f97a943340c54c7e9960adee600665a4435929eb727c4eea17af4fc6a938906a8b28e7e96df9a073dd9cacd1e5fe89fdfe982fdcb212d39ae9e1f85fcece5f700ea27e602984917c83efd8ef4cec8345879c18447e31c866cd701e846e9e1f4e4e7e923d29b654576df1b01849e132a57062b890aa868a8441e692a188ae61a6456ad4889f9f891a85727a017f1d77a7eab7ea46fcf0ad497d8dd24b276d9d701b94d78c8bb1638c2cf0005af6f16a8b0e3e1475fb187172163bdda39207a6bf60467a385f144a9765fd9f21c20da88a14b26a29cd342bc9c56213230f3e23b6de59abcc0cad2a02125bdb679cc65d185909d23f77e1e5dbe23b1ba0b42502a705c7c7a508704049198043b73743d4b724c981512ed00ba915156c37da99341a7740fc47b3d039a0c2a9fc8e487fb12ab82c16c5ac2254642b0438308a5f3569171b43226473149fbd7a14cbeb5edfeedf4370ee5b080d5f6ea3ad49669ef81e87cc2bccf8023fd7bd2d8b9447036d3b1e8a9a80521cfc2fcfa48c2064c6729c1b2fdadca3f590f2d1f8651da7ef9e62b296adf6f199a9b6cfa2fba20e7ce875b49e33b973b2e69d7123ef27fad569f4abfb968b234975180c3a722fb4cff57e2b9e69ea5372fccb9623b78c9c118031a0275dd61401d8e1482370bb564ade14030add893402e329653a57b82dbb5a3d9321745888553fc3cfa888f6cbe1d2e726c11cff3404193b8072ba329e6e5a2c2714cddaaf7e448880053f6f70e744c15418b37e6c50edac0aa7fb92d7b69bfc98a269fd41031bf9795cb9df295487abc9b49e94caf355db333007cc4720b5d695f5ee8cebba873c54583a90747161294e8bbf2c4efdd8cb8c0afc0cf33b52854ca4261d99656ea7fd350eec898bf231fa60c4d6449c8d724c636f5db18acf568d150b141593a369894efb7d44826bfcd6b78f7e60f53f23bd2300aef1946ae5c5380985569cc98fab2fbf8183837890eb29594b7dfc34ed70d27390a7ea72716726c6db5e39ab11880f3109506acfaf85f4d19291f689bfe2c8683af83c4bcadc38974c386684997bdcb93831c05b9be96db15408c3cdf9ec9cd4811e787039cc323de65ada56ea6c23f82d54e0f8cdb1c41c315a106e77564ed5ef89a4b32f9779488903addcfb97b5553f3d273feb64bf18419f29b5d421a6ea6202597bda5291208e320e4e4910cf634aa1f7ebb2ef53849c1d5fbe7a5c6fa7f78e63952fe87ecf54a54affad7c18d90024c896b204b33292e22b1b137e4d78d4a34c89f1a9dbe9b6d8d4bc4961019137942ae8deaf21812242b1ade01a798b7f5543f140756d6f142f2f187d45b9cba19e8d212fabc62afd0173c4a84798954332c8b2ef80d6ccbd1b79f394b32a68356fdbf1a56a2b4922c0268591d763f8027da005b8f4352a792ccf2c98b6b234faf78d2f445f642f27846eba46c609b5088554af47110a380a302ab9dc9122ebf09d863d828e9b0b48420f8d15e41ffede8f50d886251d686528bc9cf728a6f6bf218452cbb5b6132f3e652df5ee70099b585c3b894aadb1056a8f8c90f36dd6b7538aab4fd6a7263dd79d076bda3fb2a3366fd05745284f9070407431511a9e0306f2f7207e8953c54af1c700e9eb40472edbbe655b5ef88771ee2a25397ef20968b9559940a71aed4f46ba0fc1e97d39f77a562de25d85439ac871875a05cfc9546424f51b6b6dcf32538b8ad9bba771e0d449f8518e71aca59e0385f786f29b33d15c6b503584b4f7122ce1c3de7d268758ec68637612204583158486d71f27b2c5eed1db0a4ebc29a6ea049fdbd8003142b34a67e51b869e6646b6c39db4e8ab08550ea83b31793afa76c7a128f1cb0ea22105167610fed12606bed6b7532e1fe0f1f57677530de8a10c2cb1a0168283c5924e0448777cb7681bb47c3bef9165041c979386ded5e6eb724fefd6b4f612c28ef41811e3afd5fb788d088117478373eebf39a28eb056c9a7dd047e5a7e843b14711130724946b77c07bc3c855f3c5347abe8dd9453380da3bb53feaddc5b5d963c12b41a52cfcf2f94b3f6eee68f9bccb1af5e6452d92bf603bbe31e947f02cf3b125f7c7055a3da5d7d407ab892c806671624bb85430ee2f53bc1e3961433ce4cb92de6c14f757ed47fbea88d73c13910ea2be05d5a8ef13515052242546adcf1ec298c550a524bc1f5f16023a0c057dc4ee3f8e5c9dbf5fa93dd6c84ed849d54e74f57fc12f8ea031fb81310b7478edfa7a2e04797979d2f33449401ea686fe8154bbcb0a6788bece4249824268ba8e44ec9d5dff93182db520ba9e7a7767c54e2bb8a3a3741b6a3274ede4c4563f9aa341e1803c7e141d22bde8347646dd59f3355d6346317b162acd4d6c80cf1542e550bc862dff9f05cfbd1f80ae09a81e50a2aac76f883b3716e522a163869a7c2fdaea44b861a1ba7e28e9823c6c999d70f48d252bd0d5ec584df5e61ca0b6f8c"
4+
}
5+
}

0 commit comments

Comments
 (0)