The full picture
What nineteen domains add up to
Grouped by how students use it, not by how the code is organised. Everything here works today; what doesn't is listed at the bottom.
02
Campus life
The handful of high-frequency offline things, moved in.
Events
One event can have several sessions; sign-ups attach to a session.
Hosts set a location (map picker), a time, sessions and a capacity
The roster is readable; "hosting" and "attending" are separate views
A timeline tracks progress, and comments use the shared component
Events go through the same review and unpublish flow as posts
Marketplace
Second-hand goods on campus; the transaction itself happens in person.
Listings carry images and a price and are searchable
One tap to message the seller — no friend request first
Comments for the follow-up questions, shared with the feed
Unpublish and soft-delete with restore
Course reviews
Grading and teaching rated separately.
Find courses by teacher, faculty, campus or school
Two scores: how they grade, and how they teach
Reviews are anonymous — only the score and the text are shown
Trending search terms are maintained server-side
Weekly match
Questionnaire, human pairing, contacts exchanged. Deliberately not an algorithm.
The sign-up form is edited visually in the console: question types, options and order all change, and edits attach to question ids so existing answers never shift
An operator opens two questionnaires side by side and confirms the pair — or unpairs and sends both back to the pool
Matched pairs can see each other's contact details
Why no algorithm: one round a week over a small pool, human pairing produces better results and, more importantly, explainable ones
03
Identity and trust
This is what decides whether you dare open any of the above.
Student verification
Three routes; each school picks which ones it opens.
Email: a code to the school address, resolved on the spot
Student card photo: an AI pre-screen first, anything doubtful goes to a human — who sees the reason the AI gave
Campus quiz: each school's own question bank, single and multiple choice, with a configurable pass mark (leave it blank to require a perfect score)
The rejection reason is required free text and is forwarded verbatim; resubmission opens at the same time
If a school has fewer live questions than one quiz needs, that route reports itself unavailable rather than padding with another school's questions
Capabilities and penalties
"What can I do right now" is one server call, not client-side reasoning.
Five capability names: post, comment, message, join, match
A full ban shows a site-wide banner with the expiry; when waiting it out is the only option, no button is offered — false hope is worse than none
Clients never derive the rules themselves, because derived rules fork across four surfaces
Clubs and unions
A club is an entity, not a tag.
Clubs get a page and a cover; a member's title travels with their posts — the author line reads "club · role", no profile visit needed
Students browse clubs and apply to join; applications are reviewed, and "clubs I'm in" is on their profile
Applications are reviewed by a club admin in the console — they manage exactly the one club they were granted, and other clubs at the same school don't exist as far as they're concerned; campus and platform admins can remove a member as a backstop
Membership and club title coexist: club admins review title applications and supporting material in the console; approval makes the applicant a member automatically, but not the other way round
Good for handing recruitment and event publishing back to the clubs themselves
Schools and campuses
One deployment can carry several schools.
School / faculty / campus / place, four levels — and geography hangs off the campus, not the school, because one school's two campuses are routinely in two different districts
The school field is a product of verification and users can't edit it; the campus they choose themselves
The three nearest browsing ranges resolve directly against this structure
04
Operations and governance
The console is for operators, not for developers.
Reports and review
Reports have structure; resolutions leave a trace.
Four target types (user, post, comment, message) × five reasons, with up to six pieces of evidence (image or video)
One queue handles eight content types; posts, listings and events can also be unpublished
Deletes are always soft — you can look back, and you can restore
If someone already resolved an item, it says so instead of letting two people judge it twice
Homepage configuration
Everything is configurable, and misconfiguration won't save.
Carousels belong to a named slot, and the slot list is an enum — so you can't publish into a position nothing renders
Placements, the daily poem, the shortcut grid, homepage tabs, topics and broadcast notices are all managed here
Six targeting levels: everywhere / a province / a city / one school / several schools / one campus. The same carousel can run for one school only, or one campus only
A campus admin can only target their own school and campuses — the wider levels never appear for them, rather than being refused after they pick one
Deep links are validated against the mini program's page registry; a wrong path is caught at submit time
New entries start unpublished, with a "publish now" switch on the form
Admins and permissions
Effective rights = what the role allows ∩ what the scope allows.
Five roles: super admin, operator, moderator, campus admin, club admin
A campus admin can create operators and moderators for their own school — but not peers, and not accounts at another school
Out-of-scope access returns "not found" rather than "forbidden", so nothing leaks by probing
Suspending or deleting an admin drops their sessions immediately; their history stays attributed
Points and orders
In-app points, on an order system that was not written only for points.
Earned by checking in, with streaks paying more
WeChat Pay top-ups: JSAPI in the mini program and Native QR payment on the web; tiers are configured in the console
Every movement is itemised; orders filter by type and status, and can be refunded
Orders are generic, not "top-up orders": the kind of purchase is a field, so memberships, gifts or paid features later need no second table — hard-coding "payment" as "points tier" is a debt you repay
Metrics and events
A dashboard and behavioural logging.
The dashboard narrows by scope: a campus admin sees their own school's numbers
Launch events and behavioural logging are their own domain
The AI provider is swappable — it speaks the OpenAI-compatible protocol, so switching means a URL, a key and a model name
What still needs work
Better written down than buried. If one of these blocks you, you should know now.
A small number of personalised endpoints still require a session: recent searches are unavailable to visitors, and the web app hides that block rather than erroring.
Front-end tests still lean toward rules and pure functions; component rendering, browser integration and cross-surface payment regression coverage need more work.
01
Social
The foundation. Things get posted, seen and talked about.
Feed and topics
The campus feed, with topic hubs and six browsing ranges.
Six browsing ranges, nearest outward: campus, school, district, city, province, everywhere — it decides how far *you* look, not who a given post is shown to
Topic hubs sort by newest or hottest; hot posts get their own stream
Likes, saves, shares and threaded comments; list counts are batched into a fixed number of queries per page
Image grids with full-screen preview; images upload straight to object storage, never through the app server
Anonymous tree hole
Anonymous to other users, not to the system.
Authors appear as a persona they can reshuffle; the client never receives a real author id, which is why tree-hole comments have no "report this person" path
A "hug" replaces the like — it fits the register of the place
Anonymous comments; the body field differs from a normal post, and the differences across the four commentable types are collapsed into one adapter table
Content still passes safety screening, still gets reported and removed, and penalties land on the real account
Direct messages
Live, and defensive by default.
WebSocket delivery, falling back to polling when the socket can't connect, so the list is never empty for the wrong reason
Unanswered quota: until they reply, you get three messages
Three privacy levels: open, three-until-reply, or closed
Blocking and recall; a marketplace listing opens a chat with the seller in one tap
Search and discovery
Three target types, searched separately; a discovery page for "what's happening today".
Search splits into posts, people and events
Trending queries are computed server-side, not hardcoded
The discovery page carries the carousel, the shortcut grid, a daily poem, hot topics and hot posts