+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ id ? '立即修改' : '立即创建' }}
+
+
+
+
+
+
+
+
+
diff --git a/admin/src/views/user/index.vue b/admin/src/views/user/index.vue
new file mode 100644
index 00000000..e466eb80
--- /dev/null
+++ b/admin/src/views/user/index.vue
@@ -0,0 +1,250 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php
new file mode 100644
index 00000000..aaccff93
--- /dev/null
+++ b/app/Http/Controllers/UserController.php
@@ -0,0 +1,97 @@
+user = $user;
+ }
+
+ /**
+ * Display a listing of the resource.
+ *
+ * @param Request $request
+ * @return array
+ */
+ public function index(Request $request)
+ {
+ $result = $this->user->getList($request->all());
+ $resource = UserResource::collection($result);
+ return success('user list', $resource);
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return array
+ */
+ public function store(Request $request)
+ {
+ $rules = [
+ 'username' => 'required|string',
+ 'email' => 'required|email|unique:users',
+ 'password' => 'required|string|min:6|max:40',
+ 'password_confirmation' => 'required|string|same:password'
+ ];
+ $request->validate($rules);
+ $result = $this->user->store($request->all());
+ $resource = new UserResource($result);
+ return success('user store', $resource);
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function show($id)
+ {
+ //
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function update(Request $request, $id)
+ {
+ //
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function destroy($id)
+ {
+ //
+ }
+
+ public function resetPassword(Request $request)
+ {
+ $rules = [
+ 'username' => 'required|string|exists:users',
+ 'password' => 'required|string|min:6|max:40',
+ 'password_confirmation' => 'required|same:password',
+ ];
+ $request->validate($rules);
+ $result = $this->user->resetPassword($request->username, $request->password, $request->password_confirmation);
+ $resource = new UserResource($result);
+ return success('user reset password', $resource);
+ }
+}
diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/UserResource.php
new file mode 100644
index 00000000..f8baf1f7
--- /dev/null
+++ b/app/Http/Resources/UserResource.php
@@ -0,0 +1,31 @@
+ $this->id,
+ 'email' => $this->email,
+ 'username' => $this->username,
+ 'status' => $this->status,
+ 'added' => $this->added,
+ 'class' => $this->class,
+ 'avatar' => $this->avatar,
+ 'uploaded' => $this->uploaded,
+ 'downloaded' => $this->downloaded,
+ 'seedtime' => $this->seedtime,
+ 'leechtime' => $this->leechtime,
+ ];
+ }
+}
diff --git a/app/Models/NexusModel.php b/app/Models/NexusModel.php
index b788b338..7ba9649c 100644
--- a/app/Models/NexusModel.php
+++ b/app/Models/NexusModel.php
@@ -11,5 +11,15 @@ class NexusModel extends Model
public $timestamps = false;
+ /**
+ * 为数组 / JSON 序列化准备日期。
+ *
+ * @param \DateTimeInterface $date
+ * @return string
+ */
+ protected function serializeDate(\DateTimeInterface $date)
+ {
+ return $date->format($this->dateFormat ?: 'Y-m-d H:i:s');
+ }
}
diff --git a/app/Models/Setting.php b/app/Models/Setting.php
new file mode 100644
index 00000000..a183122d
--- /dev/null
+++ b/app/Models/Setting.php
@@ -0,0 +1,33 @@
+get(['name', 'value']);
+ foreach ($rows as $row) {
+ $value = $row->value;
+ $arr = json_decode($value, true);
+ if (is_array($arr)) {
+ $value = $arr;
+ }
+ Arr::set($settings, $row->name, $value);
+ }
+ }
+ if (is_null($name)) {
+ return $settings;
+ }
+ return Arr::get($settings, $name);
+ }
+}
diff --git a/app/Models/User.php b/app/Models/User.php
index 804799ba..81ac04f8 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -11,16 +11,29 @@ class User extends Authenticatable
{
use HasFactory, Notifiable;
+ public $timestamps = false;
+
+ const STATUS_CONFIRMED = 'confirmed';
+ const STATUS_PENDING = 'pending';
+
+
+ /**
+ * 为数组 / JSON 序列化准备日期。
+ *
+ * @param \DateTimeInterface $date
+ * @return string
+ */
+ protected function serializeDate(\DateTimeInterface $date)
+ {
+ return $date->format($this->dateFormat ?: 'Y-m-d H:i:s');
+ }
+
/**
* The attributes that are mass assignable.
*
* @var array
*/
- protected $fillable = [
- 'name',
- 'email',
- 'password',
- ];
+ protected $fillable = ['username', 'email', 'password', 'secret', 'editsecret', 'added'];
/**
* The attributes that should be hidden for arrays.
diff --git a/app/Repositories/BaseRepository.php b/app/Repositories/BaseRepository.php
new file mode 100644
index 00000000..976a843f
--- /dev/null
+++ b/app/Repositories/BaseRepository.php
@@ -0,0 +1,18 @@
+getSortFieldAndType($params);
+ $query->orderBy($sortField, $sortType);
+ return $query->paginate();
+ }
+
+ public function store(array $params)
+ {
+ $password = $params['password'];
+ if ($password != $params['password_confirmation']) {
+ throw new \InvalidArgumentException("password confirmation != password");
+ }
+
+ $setting = Setting::get('main');
+ $secret = mksecret();
+ $passhash = md5($secret . $password . $secret);
+ $data = [
+ 'username' => $params['username'],
+ 'email' => $params['email'],
+ 'secret' => $secret,
+ 'editsecret' => '',
+ 'passhash' => $passhash,
+ 'stylesheet' => $setting['defstylesheet'],
+ 'added' => now()->toDateTimeString(),
+ 'status' => User::STATUS_CONFIRMED,
+ ];
+ $user = User::query()->create($data);
+ return $user;
+ }
+
+ public function resetPassword($username, $password, $passwordConfirmation)
+ {
+ if ($password != $passwordConfirmation) {
+ throw new \InvalidArgumentException("password confirmation != password");
+ }
+ $user = User::query()->where('username', $username)->firstOrFail();
+ $secret = mksecret();
+ $passhash = md5($secret . $password . $secret);
+ $update = [
+ 'secret' => $secret,
+ 'passhash' => $passhash,
+ ];
+ $user->update($update);
+ return $user;
+ }
+}