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. 35
      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*}
D:\1XYX\pro\hapi-demo\source\route\views对应路径:
/home/topuser/Code/@project/hapi-demo/source/route/views对应路径:
不需权限(提供无需验证): GET /404
不需权限(提供无需验证): GET /
不需权限(提供无需验证): GET /about

4
source/auth/index.ts

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

1
source/models/Constant.ts

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

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

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

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

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

2
source/plugins/index.ts

@ -101,7 +101,7 @@ export default [
// let user;
// if(isLogin){
// const { id } = request.auth.credentials;
// const User = request.getModel("User")
// const User = request.getModel("user")
// user = <any>await User.findOne({ where: { id: id } });
// user = user.toJSON();
// 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 {
let { username, password, email, } = request.payload as any
if (!username) username = email
const User = request.getModel("User")
const User = request.getModel("user")
logger.trace(username, email)
try {
const result = await User.findOne({ where: { username: username } })
@ -47,7 +47,7 @@ export default class {
@swagger("用户登录", "返回注册用户的信息", ["api"])
async login(request: Req, h: Res): ReturnValue {
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 } })
if (result == null) {
return gFail(null, "不存在该用户")
@ -71,7 +71,7 @@ export default class {
@swagger("删除用户", "删除用户账号", ["sum"])
async del(request: Req, h: Res): ReturnValue {
const { id } = request.auth.credentials
const User = request.getModel("User")
const User = request.getModel("user")
let result = await User.findOne({ where: { id: id } })
if (result == null) {
return gFail(null, "不存在该用户")
@ -84,7 +84,7 @@ export default class {
@swagger("获取用户信息", "返回注册用户的信息", ["用户操作", "api"])
async userinfo(request: Req, h: Res): ReturnValue {
const { id } = request.auth.credentials
const User = request.getModel("User")
const User = request.getModel("user")
let result = <any>await User.findOne({ where: { id: id } })
if (result == 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 User = request.getModel("User")
let res = await User.findOne({ where: { id: id } })
const UserInfoModel = request.getModel("user_info")
let res = await UserInfoModel.findOne({ where: { user_id: id } })
if (res == null) {
request.yar.flash("warning", "不存在此用户")
request.yar.flash("warning", "不存在此用户信息")
return h.redirect(`/`).takeover()
}
const userinfo = res.toJSON()
delete userinfo.password
const md = new MarkdownIt()
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 {
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 } })
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 { gFail, gSuccess } from "@/util"
import { auth, config, method, route, route_path, validate } from "@noderun/hapi-router"
import { sequelize } from "@sequelize"
import * as bcrypt from "bcrypt"
import sequelize from "sequelize"
/**
*
*/
@ -31,8 +32,8 @@ export default class {
@route_path("/register")
async register_POST(request: Req, h: Res): ReturnValue {
let { username, password } = request.payload as any
const User = request.getModel("User")
const UserInfoModel = request.getModel("UserInfo")
const User = request.getModel("user")
const UserInfoModel = request.getModel("user_info")
logger.trace("当前注册用户:" + username)
try {
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 { gFail, gSuccess } from "@/util"
import { auth, config, method, route, validate } from "@noderun/hapi-router"
import { sequelize } from "@sequelize"
import * as bcrypt from "bcrypt"
/**
*
@ -12,13 +13,12 @@ export default class {
async index(request: Req, h: Res): ReturnValue {
const isRenderHtmx = Reflect.has(request.query, "htmx")
const { id } = request.auth.credentials
const User = request.getModel("User")
let result = await User.findOne({ where: { id: id } })
const UserInfoModel = request.getModel("user_info")
let result = await UserInfoModel.findOne({ where: { user_id: id } })
if (result == null) {
return gFail(null, "不存在该用户")
}
const userinfo = result.toJSON()
delete userinfo.password
if (isRenderHtmx) {
return h.view("htmx/path/user.pug", { userinfo })
}
@ -38,8 +38,8 @@ export default class {
async del(request: Req, h: Res): ReturnValue {
const { id } = request.auth.credentials
try {
const User = request.getModel("User")
await User.destroy({ where: { id: id } })
const UserModel = request.getModel("user")
await UserModel.destroy({ where: { id: id } })
request.yar.flash("success", "用户已删除")
request.cookieAuth.clear()
} catch (error) {

2
tsconfig.json

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

8
types/global.d.ts

@ -1,9 +1,9 @@
import { Logger } from "log4js"
import { Server } 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 { TUserInfoModel } from "@/models/UserInfo"
import { TUserInfoModel } from "@/models/user_info"
declare global {
var server: Server
@ -13,8 +13,8 @@ declare global {
}
interface Models {
User: TUserModel
UserInfo: TUserInfoModel
user: TUserModel
user_info: TUserInfoModel
}
declare module "sequelize" {

Loading…
Cancel
Save