2024-10-30 23:59:59 +08:00
|
|
|
#include "Hello.h"
|
|
|
|
#include "BoostLog.h"
|
2024-10-31 23:30:34 +08:00
|
|
|
#include "Dialog.h"
|
2024-10-31 19:40:29 +08:00
|
|
|
#include "Session.h"
|
2024-11-11 19:21:48 +08:00
|
|
|
#include "WebApplication.h"
|
2024-10-31 19:40:29 +08:00
|
|
|
#include <Wt/Auth/AuthService.h>
|
|
|
|
#include <Wt/Auth/AuthWidget.h>
|
|
|
|
#include <Wt/Auth/Identity.h>
|
|
|
|
#include <Wt/Auth/PasswordService.h>
|
|
|
|
#include <Wt/WBootstrap2Theme.h>
|
2024-10-30 23:59:59 +08:00
|
|
|
#include <Wt/WContainerWidget.h>
|
|
|
|
#include <Wt/WEnvironment.h>
|
|
|
|
#include <Wt/WLineEdit.h>
|
|
|
|
#include <Wt/WPushButton.h>
|
|
|
|
#include <Wt/WText.h>
|
|
|
|
|
|
|
|
Hello::Hello(const Wt::WEnvironment &env, bool embedded) : Wt::WApplication(env) {
|
2024-10-31 19:40:29 +08:00
|
|
|
LOG(info) << "app root: " << appRoot();
|
|
|
|
m_session = std::make_unique<Session>(appRoot() + "auth.db");
|
|
|
|
m_session->login().changed().connect(this, &Hello::authEvent);
|
2024-10-30 23:59:59 +08:00
|
|
|
setTitle("Hello world");
|
2024-10-31 19:40:29 +08:00
|
|
|
setTheme(std::make_shared<Wt::WBootstrap2Theme>());
|
2024-10-30 23:59:59 +08:00
|
|
|
Wt::WContainerWidget *top = nullptr;
|
|
|
|
if (!embedded) {
|
|
|
|
top = root();
|
|
|
|
} else {
|
|
|
|
std::unique_ptr<Wt::WContainerWidget> topPtr = std::make_unique<Wt::WContainerWidget>();
|
|
|
|
top = topPtr.get();
|
|
|
|
const std::string *div = env.getParameter("div");
|
|
|
|
if (div) {
|
|
|
|
setJavaScriptClass(*div);
|
|
|
|
bindWidget(std::move(topPtr), *div);
|
|
|
|
} else {
|
|
|
|
LOG(error) << "Missing: parameter: 'div'";
|
|
|
|
}
|
|
|
|
LOG(info) << "url: " << url();
|
|
|
|
LOG(info) << "relative resources url: " << relativeResourcesUrl();
|
|
|
|
LOG(info) << "resources url: " << resourcesUrl();
|
|
|
|
url();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!embedded) {
|
|
|
|
root()->addWidget(std::make_unique<Wt::WText>("<p><emph>Note: you can also run this application "
|
|
|
|
"from within <a href=\"hello.html\">a web page</a>.</emph></p>"));
|
|
|
|
}
|
|
|
|
|
|
|
|
top->addWidget(std::make_unique<Wt::WText>("Your name, please ? "));
|
|
|
|
m_nameEdit = top->addWidget(std::make_unique<Wt::WLineEdit>());
|
|
|
|
m_nameEdit->setFocus();
|
|
|
|
|
|
|
|
auto b = top->addWidget(std::make_unique<Wt::WPushButton>("点击我!"));
|
|
|
|
b->setMargin(5, Wt::Side::Left);
|
|
|
|
|
|
|
|
top->addWidget(std::make_unique<Wt::WBreak>());
|
|
|
|
|
|
|
|
m_greeting = top->addWidget(std::make_unique<Wt::WText>());
|
|
|
|
|
|
|
|
b->clicked().connect(this, &Hello::greet);
|
|
|
|
m_nameEdit->enterPressed().connect(this, &Hello::greet);
|
2024-10-31 19:40:29 +08:00
|
|
|
|
2024-11-11 19:21:48 +08:00
|
|
|
auto app = Amass::Singleton<WebApplication>::instance();
|
|
|
|
auto authWidget = std::make_unique<Wt::Auth::AuthWidget>(app->authService(), m_session->users(), m_session->login());
|
|
|
|
authWidget->model()->addPasswordAuth(&app->passwordService());
|
2024-10-31 19:40:29 +08:00
|
|
|
authWidget->setRegistrationEnabled(true);
|
|
|
|
authWidget->processEnvironment();
|
|
|
|
top->addWidget(std::move(authWidget));
|
2024-10-31 23:30:34 +08:00
|
|
|
|
|
|
|
top->addWidget(std::make_unique<Dialog>());
|
2024-10-31 19:40:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
Hello::~Hello() {
|
2024-10-30 23:59:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void Hello::greet() {
|
|
|
|
m_greeting->setText("Hello there, " + m_nameEdit->text());
|
|
|
|
}
|
2024-10-31 19:40:29 +08:00
|
|
|
|
|
|
|
void Hello::authEvent() {
|
|
|
|
if (m_session->login().loggedIn()) {
|
|
|
|
const Wt::Auth::User &u = m_session->login().user();
|
|
|
|
LOG(info) << "User " << u.id() << " (" << u.identity(Wt::Auth::Identity::LoginName) << ")"
|
|
|
|
<< " logged in.";
|
|
|
|
} else {
|
|
|
|
LOG(info) << "User logged out.";
|
|
|
|
}
|
|
|
|
}
|