Browse Source

fixed some thing

theme
npmrun 2 years ago
parent
commit
49136ec3d1
  1. 1633
      pnpm-lock.yaml
  2. 4
      route.txt
  3. 4
      source/auth/index.ts
  4. BIN
      source/db/data.db
  5. 1
      source/models/Color.ts
  6. 1
      source/models/Constant.ts
  7. 37
      source/models/user.ts
  8. 34
      source/models/user_info.ts
  9. 2
      source/plugins/index.ts
  10. 8
      source/route/api/v1/user/index.ts
  11. 7
      source/route/views/index/index.ts
  12. 2
      source/route/views/login.ts
  13. 7
      source/route/views/register.ts
  14. 10
      source/route/views/user.ts
  15. 2
      tsconfig.json
  16. 8
      types/global.d.ts

1633
pnpm-lock.yaml

File diff suppressed because it is too large

4
route.txt

@ -1,6 +1,6 @@
D:\1XYX\pro\hapi-demo\source\route\htmx对应路径: /home/topuser/Code/@project/hapi-demo/source/route/htmx对应路径:
不需权限 : GET /htmx/path/{path*} 不需权限 : GET /htmx/path/{path*}
D:\1XYX\pro\hapi-demo\source\route\views对应路径: /home/topuser/Code/@project/hapi-demo/source/route/views对应路径:
不需权限(提供无需验证): GET /404 不需权限(提供无需验证): GET /404
不需权限(提供无需验证): GET / 不需权限(提供无需验证): GET /
不需权限(提供无需验证): GET /about 不需权限(提供无需验证): GET /about

4
source/auth/index.ts

@ -2,7 +2,7 @@ import { Req } from "#/global"
export async function validateJwt(decoded, request: Req, h) { export async function validateJwt(decoded, request: Req, h) {
if (decoded.id) { if (decoded.id) {
const User = request.getModel("User") const User = request.getModel("user")
const result = await User.findOne({ where: { id: decoded.id } }) const result = await User.findOne({ where: { id: decoded.id } })
if (result == null) { if (result == null) {
return { isValid: false } return { isValid: false }
@ -14,7 +14,7 @@ export async function validateJwt(decoded, request: Req, h) {
} }
export async function validateSession(request: Req, session) { export async function validateSession(request: Req, session) {
const User = request.getModel("User") const User = request.getModel("user")
loggerSite.debug(`请求路径:${request.path}, 请求方法:${request.method}`) loggerSite.debug(`请求路径:${request.path}, 请求方法:${request.method}`)
if (session.id) { if (session.id) {
const result = await User.findOne({ where: { id: session.id } }) const result = await User.findOne({ where: { id: session.id } })

BIN
source/db/data.db

Binary file not shown.

1
source/models/Color.ts

@ -16,6 +16,7 @@ module.exports = function (sequelize, DataTypes) {
}, },
}, },
{ {
underscored: true,
timestamps: false, timestamps: false,
}, },
) )

1
source/models/Constant.ts

@ -17,6 +17,7 @@ module.exports = function (sequelize, DataTypes) {
}, },
}, },
{ {
underscored: true,
timestamps: false, timestamps: false,
}, },
) )

37
source/models/User.ts → source/models/user.ts

@ -5,26 +5,26 @@ interface UserAttributes {
username: string username: string
password: string password: string
createdAt?: Date created_at?: Date
updatedAt?: Date updated_at?: Date
deletedAt?: Date deleted_at?: Date
} }
export interface UserInput extends Optional<UserAttributes, "id"> {} export interface UserInput extends Optional<UserAttributes, "id"> {}
export interface UserOuput extends Required<UserAttributes> {} export interface UserOutput extends Required<UserAttributes> {}
export type TUserModel = ReturnType<typeof UserModel> export type TUserModel = ReturnType<typeof UserModel>
type DT = typeof DataTypes type DT = typeof DataTypes
export default function UserModel(sequelize: Sequelize, DataTypes: DT) { export default function UserModel(sequelize: Sequelize, DataTypes: DT) {
class User extends Model<UserAttributes, UserInput> implements UserAttributes { class User extends Model<UserAttributes, UserInput> implements UserAttributes {
public id: number public id!: number
public username: string public username!: string
public password: string public password!: string
// timestamps! // timestamps!
public readonly createdAt!: Date public readonly created_at!: Date
public readonly updatedAt!: Date public readonly updated_at!: Date
public readonly deletedAt!: Date public readonly deleted_at!: Date
} }
User.init( User.init(
{ {
@ -40,21 +40,26 @@ export default function UserModel(sequelize: Sequelize, DataTypes: DT) {
password: { password: {
type: DataTypes.STRING, type: DataTypes.STRING,
allowNull: false, allowNull: false,
} },
}, },
{ {
modelName: "User", modelName: "user",
sequelize, sequelize,
underscored: true,
deletedAt: true,
timestamps: true, timestamps: true,
paranoid: true, // 对模型施加了一个软删除 paranoid: true, // 对模型施加了一个软删除
}, },
) )
// 覆盖User的toJSON方法 // 覆盖User的toJSON方法
interface User { User.prototype.toJSON = function () {
toJSON: () => UserOuput const values = Object.assign({}, this.get()) as UserAttributes
delete values.password
delete values.deleted_at
return values
} }
User.associate = function (models) { User.associate = function (models) {
models["User"].hasOne(models["UserInfo"]) User.hasOne(models["user_info"])
} }
return User return User
} }

34
source/models/UserInfo.ts → source/models/user_info.ts

@ -8,13 +8,13 @@ interface UserInfoAttributes {
avatar: string avatar: string
tel: string tel: string
createdAt?: Date created_at?: Date
updatedAt?: Date updated_at?: Date
deletedAt?: Date deleted_at?: Date
} }
export interface UserInfoInput extends Optional<UserInfoAttributes, "id" | "email" | "nickname" | "avatar" | "tel"> {} export interface UserInfoInput extends Optional<UserInfoAttributes, "id" | "email" | "nickname" | "avatar" | "tel"> { }
export interface UserInfoOuput extends Required<UserInfoAttributes> {} export interface UserInfoOuput extends Required<UserInfoAttributes> { }
export type TUserInfoModel = ReturnType<typeof UserInfoModel> export type TUserInfoModel = ReturnType<typeof UserInfoModel>
type DT = typeof DataTypes type DT = typeof DataTypes
@ -28,9 +28,9 @@ export default function UserInfoModel(sequelize: Sequelize, DataTypes: DT) {
public tel: string public tel: string
// timestamps! // timestamps!
public readonly createdAt!: Date public readonly created_at!: Date
public readonly updatedAt!: Date public readonly updated_at!: Date
public readonly deletedAt!: Date public readonly deleted_at!: Date
} }
UserInfo.init( UserInfo.init(
{ {
@ -42,6 +42,11 @@ export default function UserInfoModel(sequelize: Sequelize, DataTypes: DT) {
user_id: { user_id: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
allowNull: false, allowNull: false,
onDelete: "CASCADE",
references: {
model: "user",
key: 'id',
},
}, },
nickname: { nickname: {
type: DataTypes.STRING, type: DataTypes.STRING,
@ -58,18 +63,23 @@ export default function UserInfoModel(sequelize: Sequelize, DataTypes: DT) {
}, },
}, },
{ {
modelName: "UserInfo", modelName: "user_info",
sequelize, sequelize,
underscored: true,
deletedAt: true,
timestamps: true, timestamps: true,
paranoid: true, // 对模型施加了一个软删除 paranoid: true, // 对模型施加了一个软删除
}, },
) )
// 覆盖User的toJSON方法 // 覆盖User的toJSON方法
interface UserInfo { UserInfo.prototype.toJSON = function () {
toJSON: () => UserInfoOuput const values = Object.assign({}, this.get()) as UserInfoOuput
delete values.deleted_at
return values
} }
UserInfo.associate = function (models) { UserInfo.associate = function (models) {
models["UserInfo"].belongsTo(models["User"], { foreignKey: "user_id" }) // User删除时对应的UserInfo同步删除
models["user_info"].belongsTo(models["user"], { foreignKey: "user_id" })
} }
return UserInfo return UserInfo
} }

2
source/plugins/index.ts

@ -101,7 +101,7 @@ export default [
// let user; // let user;
// if(isLogin){ // if(isLogin){
// const { id } = request.auth.credentials; // const { id } = request.auth.credentials;
// const User = request.getModel("User") // const User = request.getModel("user")
// user = <any>await User.findOne({ where: { id: id } }); // user = <any>await User.findOne({ where: { id: id } });
// user = user.toJSON(); // user = user.toJSON();
// delete user.password; // delete user.password;

8
source/route/api/v1/user/index.ts

@ -16,7 +16,7 @@ export default class {
async register(request: Req, h: Res): ReturnValue { async register(request: Req, h: Res): ReturnValue {
let { username, password, email, } = request.payload as any let { username, password, email, } = request.payload as any
if (!username) username = email if (!username) username = email
const User = request.getModel("User") const User = request.getModel("user")
logger.trace(username, email) logger.trace(username, email)
try { try {
const result = await User.findOne({ where: { username: username } }) const result = await User.findOne({ where: { username: username } })
@ -47,7 +47,7 @@ export default class {
@swagger("用户登录", "返回注册用户的信息", ["api"]) @swagger("用户登录", "返回注册用户的信息", ["api"])
async login(request: Req, h: Res): ReturnValue { async login(request: Req, h: Res): ReturnValue {
let { username, password } = request.payload as any let { username, password } = request.payload as any
const User = request.getModel("User") const User = request.getModel("user")
const result = <any>await User.findOne({ where: { username: username } }) const result = <any>await User.findOne({ where: { username: username } })
if (result == null) { if (result == null) {
return gFail(null, "不存在该用户") return gFail(null, "不存在该用户")
@ -71,7 +71,7 @@ export default class {
@swagger("删除用户", "删除用户账号", ["sum"]) @swagger("删除用户", "删除用户账号", ["sum"])
async del(request: Req, h: Res): ReturnValue { async del(request: Req, h: Res): ReturnValue {
const { id } = request.auth.credentials const { id } = request.auth.credentials
const User = request.getModel("User") const User = request.getModel("user")
let result = await User.findOne({ where: { id: id } }) let result = await User.findOne({ where: { id: id } })
if (result == null) { if (result == null) {
return gFail(null, "不存在该用户") return gFail(null, "不存在该用户")
@ -84,7 +84,7 @@ export default class {
@swagger("获取用户信息", "返回注册用户的信息", ["用户操作", "api"]) @swagger("获取用户信息", "返回注册用户的信息", ["用户操作", "api"])
async userinfo(request: Req, h: Res): ReturnValue { async userinfo(request: Req, h: Res): ReturnValue {
const { id } = request.auth.credentials const { id } = request.auth.credentials
const User = request.getModel("User") const User = request.getModel("user")
let result = <any>await User.findOne({ where: { id: id } }) let result = <any>await User.findOne({ where: { id: id } })
if (result == null) { if (result == null) {
return gFail(null, "不存在该用户") return gFail(null, "不存在该用户")

7
source/route/views/index/index.ts

@ -30,14 +30,13 @@ export default class Index {
} }
const { id } = request.auth.credentials const { id } = request.auth.credentials
const User = request.getModel("User") const UserInfoModel = request.getModel("user_info")
let res = await User.findOne({ where: { id: id } }) let res = await UserInfoModel.findOne({ where: { user_id: id } })
if (res == null) { if (res == null) {
request.yar.flash("warning", "不存在此用户") request.yar.flash("warning", "不存在此用户信息")
return h.redirect(`/`).takeover() return h.redirect(`/`).takeover()
} }
const userinfo = res.toJSON() const userinfo = res.toJSON()
delete userinfo.password
const md = new MarkdownIt() const md = new MarkdownIt()
var result = md.render("# markdown-it rulezz!") var result = md.render("# markdown-it rulezz!")

2
source/route/views/login.ts

@ -32,7 +32,7 @@ export default class {
async login_POST(request: Req, h: Res): ReturnValue { async login_POST(request: Req, h: Res): ReturnValue {
const { username, password, referrer } = request.payload as any const { username, password, referrer } = request.payload as any
const User = request.getModel("User") const User = request.getModel("user")
const account = <any>await User.findOne({ where: { username: username } }) const account = <any>await User.findOne({ where: { username: username } })
if (!account || !(await bcrypt.compare(password, account.password))) { if (!account || !(await bcrypt.compare(password, account.password))) {

7
source/route/views/register.ts

@ -2,8 +2,9 @@ import { Req, Res, ReturnValue } from "#/global"
import { LoginUserSchema, RegisterUserSchema, UserSchema } from "@/schema" import { LoginUserSchema, RegisterUserSchema, UserSchema } from "@/schema"
import { gFail, gSuccess } from "@/util" import { gFail, gSuccess } from "@/util"
import { auth, config, method, route, route_path, validate } from "@noderun/hapi-router" import { auth, config, method, route, route_path, validate } from "@noderun/hapi-router"
import { sequelize } from "@sequelize"
import * as bcrypt from "bcrypt" import * as bcrypt from "bcrypt"
import sequelize from "sequelize"
/** /**
* *
*/ */
@ -31,8 +32,8 @@ export default class {
@route_path("/register") @route_path("/register")
async register_POST(request: Req, h: Res): ReturnValue { async register_POST(request: Req, h: Res): ReturnValue {
let { username, password } = request.payload as any let { username, password } = request.payload as any
const User = request.getModel("User") const User = request.getModel("user")
const UserInfoModel = request.getModel("UserInfo") const UserInfoModel = request.getModel("user_info")
logger.trace("当前注册用户:" + username) logger.trace("当前注册用户:" + username)
try { try {
const result = await User.findOne({ where: { username: username } }) const result = await User.findOne({ where: { username: username } })

10
source/route/views/user.ts

@ -2,6 +2,7 @@ import { Req, Res, ReturnValue } from "#/global"
import { UserSchema } from "@/schema" import { UserSchema } from "@/schema"
import { gFail, gSuccess } from "@/util" import { gFail, gSuccess } from "@/util"
import { auth, config, method, route, validate } from "@noderun/hapi-router" import { auth, config, method, route, validate } from "@noderun/hapi-router"
import { sequelize } from "@sequelize"
import * as bcrypt from "bcrypt" import * as bcrypt from "bcrypt"
/** /**
* *
@ -12,13 +13,12 @@ export default class {
async index(request: Req, h: Res): ReturnValue { async index(request: Req, h: Res): ReturnValue {
const isRenderHtmx = Reflect.has(request.query, "htmx") const isRenderHtmx = Reflect.has(request.query, "htmx")
const { id } = request.auth.credentials const { id } = request.auth.credentials
const User = request.getModel("User") const UserInfoModel = request.getModel("user_info")
let result = await User.findOne({ where: { id: id } }) let result = await UserInfoModel.findOne({ where: { user_id: id } })
if (result == null) { if (result == null) {
return gFail(null, "不存在该用户") return gFail(null, "不存在该用户")
} }
const userinfo = result.toJSON() const userinfo = result.toJSON()
delete userinfo.password
if (isRenderHtmx) { if (isRenderHtmx) {
return h.view("htmx/path/user.pug", { userinfo }) return h.view("htmx/path/user.pug", { userinfo })
} }
@ -38,8 +38,8 @@ export default class {
async del(request: Req, h: Res): ReturnValue { async del(request: Req, h: Res): ReturnValue {
const { id } = request.auth.credentials const { id } = request.auth.credentials
try { try {
const User = request.getModel("User") const UserModel = request.getModel("user")
await User.destroy({ where: { id: id } }) await UserModel.destroy({ where: { id: id } })
request.yar.flash("success", "用户已删除") request.yar.flash("success", "用户已删除")
request.cookieAuth.clear() request.cookieAuth.clear()
} catch (error) { } catch (error) {

2
tsconfig.json

@ -20,6 +20,6 @@
"#/*": ["types/*"] "#/*": ["types/*"]
} }
}, },
"include": ["source", "types", "test", "log/ha"], "include": ["source", "types", "test"],
"exclude": ["node_modules"] "exclude": ["node_modules"]
} }

8
types/global.d.ts

@ -1,9 +1,9 @@
import { Logger } from "log4js" import { Logger } from "log4js"
import { Server } from "@hapi/hapi" import { Server } from "@hapi/hapi"
import { Request, ResponseToolkit, Lifecycle } from "@hapi/hapi" import { Request, ResponseToolkit, Lifecycle } from "@hapi/hapi"
import { TUserModel } from "@/models/User" import { TUserModel } from "@/models/user"
import yar from "@hapi/yar" import yar from "@hapi/yar"
import { TUserInfoModel } from "@/models/UserInfo" import { TUserInfoModel } from "@/models/user_info"
declare global { declare global {
var server: Server var server: Server
@ -13,8 +13,8 @@ declare global {
} }
interface Models { interface Models {
User: TUserModel user: TUserModel
UserInfo: TUserInfoModel user_info: TUserInfoModel
} }
declare module "sequelize" { declare module "sequelize" {

Loading…
Cancel
Save