diff --git a/app/controllers/admins/system_notifications_controller.rb b/app/controllers/admins/system_notifications_controller.rb
index 0dc7dd2a..e2081f1a 100644
--- a/app/controllers/admins/system_notifications_controller.rb
+++ b/app/controllers/admins/system_notifications_controller.rb
@@ -10,6 +10,10 @@ class Admins::SystemNotificationsController < Admins::BaseController
@notifications = paginate(notifications)
end
+ def history
+ @users = @notification.users
+ end
+
def new
@notification = SystemNotification.new
end
diff --git a/app/controllers/users/system_notification_histories_controller.rb b/app/controllers/users/system_notification_histories_controller.rb
new file mode 100644
index 00000000..70e91fbb
--- /dev/null
+++ b/app/controllers/users/system_notification_histories_controller.rb
@@ -0,0 +1,15 @@
+class Users::SystemNotificationHistoriesController < Users::BaseController
+ before_action :private_user_resources!, only: [:create]
+ def create
+ @history = observed_user.system_notification_histories.new(system_notification_id: params[:system_notification_id])
+ if @history.save
+ render_ok
+ else
+ Rails.logger.info @history.errors.as_json
+ render_error(@history.errors.full_messages.join(","))
+ end
+ rescue Exception => e
+ uid_logger_error(e.message)
+ tip_exception(e.message)
+ end
+end
\ No newline at end of file
diff --git a/app/docs/slate/source/includes/_users.md b/app/docs/slate/source/includes/_users.md
index be2728d0..218a1a4b 100644
--- a/app/docs/slate/source/includes/_users.md
+++ b/app/docs/slate/source/includes/_users.md
@@ -199,6 +199,36 @@ await octokit.request('GET /api/users/:login/messages.json')
Success Data.
+## 用户阅读系统通知
+用户阅读系统通知
+
+> 示例:
+
+```shell
+curl -X POST http://localhost:3000/api/users/yystopf/system_notification_histories.json
+```
+
+```javascript
+await octokit.request('GET /api/users/:login/system_notification_histories.json')
+```
+
+### HTTP 请求
+`POST /api/users/:login/system_notification_histories.json`
+
+### 请求字段说明:
+参数 | 类型 | 字段说明
+--------- | ----------- | -----------
+|system_notification_id |integer |阅读的系统通知id |
+
+> 返回的JSON示例:
+
+```json
+{
+ "status": 0,
+ "message": "success"
+}
+```
+
## 发送消息
发送消息, 目前只支持atme
diff --git a/app/models/system_notification.rb b/app/models/system_notification.rb
index f05a66fc..d2b99ecf 100644
--- a/app/models/system_notification.rb
+++ b/app/models/system_notification.rb
@@ -15,6 +15,9 @@ class SystemNotification < ApplicationRecord
default_scope { order(created_at: :desc)}
+ has_many :system_notification_histories
+ has_many :users, through: :system_notification_histories
+
scope :is_top, lambda { where(is_top: true) }
def read_member?(user_id)
diff --git a/app/models/system_notification_history.rb b/app/models/system_notification_history.rb
new file mode 100644
index 00000000..b629babd
--- /dev/null
+++ b/app/models/system_notification_history.rb
@@ -0,0 +1,23 @@
+# == Schema Information
+#
+# Table name: system_notification_histories
+#
+# id :integer not null, primary key
+# system_message_id :integer
+# user_id :integer
+# created_at :datetime not null
+# updated_at :datetime not null
+#
+# Indexes
+#
+# index_system_notification_histories_on_system_message_id (system_message_id)
+# index_system_notification_histories_on_user_id (user_id)
+#
+
+class SystemNotificationHistory < ApplicationRecord
+
+ belongs_to :system_notification
+ belongs_to :user
+
+ validates :system_notification_id, uniqueness: { scope: :user_id, message: '只能阅读一次'}
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index ae20b83d..8bdb8bfa 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -173,6 +173,9 @@ class User < Owner
has_one :user_template_message_setting, dependent: :destroy
+ has_many :system_notification_histories
+ has_many :system_notifications, through: :system_notification_histories
+
# Groups and active users
scope :active, lambda { where(status: STATUS_ACTIVE) }
scope :like, lambda { |keywords|
diff --git a/config/locales/system_notification_histories/zh-CN.yml b/config/locales/system_notification_histories/zh-CN.yml
new file mode 100644
index 00000000..8dd7b49d
--- /dev/null
+++ b/config/locales/system_notification_histories/zh-CN.yml
@@ -0,0 +1,6 @@
+zh-CN:
+ activerecord:
+ attributes:
+ system_notification_history:
+ system_notification: "系统通知"
+ system_notification_id: "系统通知"
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index 37f6a7e6..42942291 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -273,6 +273,7 @@ Rails.application.routes.draw do
scope module: :users do
get 'template_message_settings', to: 'template_message_settings#current_setting'
post 'template_message_settings/update_setting', to: 'template_message_settings#update_setting'
+ resources :system_notification_histories, only: [:create]
resources :applied_messages, only: [:index]
resources :applied_transfer_projects, only: [:index] do
member do
@@ -680,7 +681,11 @@ Rails.application.routes.draw do
resources :project_licenses
resources :project_ignores
resources :reversed_keywords
- resources :system_notifications
+ resources :system_notifications do
+ member do
+ get :history
+ end
+ end
resources :message_templates, only: [:index, :edit, :update] do
collection do
get :init_data
diff --git a/db/migrate/20211012060837_create_system_notification_histories.rb b/db/migrate/20211012060837_create_system_notification_histories.rb
new file mode 100644
index 00000000..9110f3ce
--- /dev/null
+++ b/db/migrate/20211012060837_create_system_notification_histories.rb
@@ -0,0 +1,10 @@
+class CreateSystemNotificationHistories < ActiveRecord::Migration[5.2]
+ def change
+ create_table :system_notification_histories do |t|
+ t.references :system_notification
+ t.references :user
+
+ t.timestamps
+ end
+ end
+end
diff --git a/public/docs/api.html b/public/docs/api.html
index 5df230a2..fe1050fd 100644
--- a/public/docs/api.html
+++ b/public/docs/api.html
@@ -348,6 +348,9 @@
用户消息列表
+
+ 用户阅读系统通知
+
发送消息
@@ -1337,7 +1340,39 @@ Success — a happy kitten is an authenticated kitten!
-发送消息
+用户阅读系统通知
+用户阅读系统通知
+
+
+示例:
+
+curl -X POST http://localhost:3000/api/users/yystopf/system_notification_histories.json
+
await octokit.request('GET /api/users/:login/system_notification_histories.json')
+
HTTP 请求
+POST /api/users/:login/system_notification_histories.json
+请求字段说明:
+
+
+参数 |
+类型 |
+字段说明 |
+
+
+
+system_notification_id |
+integer |
+阅读的系统通知id |
+
+
+
+
+返回的JSON示例:
+
+{
+ "status": 0,
+ "message": "success"
+}
+
发送消息
发送消息, 目前只支持atme
@@ -1345,9 +1380,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X POST http://localhost:3000/api/users/:login/messages.json
await octokit.request('POST /api/users/:login/messages.json')
-
HTTP 请求
+HTTP 请求
POST api/users/yystopf/messages.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -1406,9 +1441,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X POST http://localhost:3000/api/users/:login/messages/read.json
await octokit.request('POST /api/users/:login/messages/read.json')
-
HTTP 请求
+HTTP 请求
POST api/users/yystopf/messages/read.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -1447,9 +1482,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X DELETE http://localhost:3000/api/users/:login/messages.json
await octokit.request('DELETE /api/users/:login/messages.json')
-
HTTP 请求
+HTTP 请求
DELETE api/users/yystopf/messages.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -1488,9 +1523,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X PATCH/PUT http://localhost:3000/api/users/yystopf.json
await octokit.request('PATCH/PUT /api/users/:login.json')
-
HTTP 请求
+HTTP 请求
PATCH/PUT /api/users/:login.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -1586,7 +1621,7 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/template_message_settings.json
await octokit.request('GET /api/template_message_settings.json')
-
HTTP 请求
+HTTP 请求
GET /api/template_message_settings.json
返回字段说明:
@@ -1729,7 +1764,7 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/template_message_settings.json
await octokit.request('GET /api/uses/yystopf/template_message_settings.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:user_id/template_message_settings.json
返回字段说明:
@@ -1799,9 +1834,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X POST http://localhost:3000/api/users/yystopf/template_message_settings/update_setting.json
await octokit.request('POST /api/uses/yystopf/template_message_settings/update_setting.json')
-
HTTP 请求
+HTTP 请求
POST /api/users/:user_id/template_message_settings/update_setting.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -1918,7 +1953,7 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/is_pinned_projects.json
await octokit.request('GET /api/users/:login/is_pinned_projects.json')
-
HTTP 请求
+HTTP 请求
GET api/users/:login/is_pinned_projects.json
返回字段说明:
@@ -2105,9 +2140,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X POST http://localhost:3000/api/users/yystopf/is_pinned_projects/pin.json
await octokit.request('GET /api/users/:login/is_pinned_projects/pin.json')
-
HTTP 请求
+HTTP 请求
POST /api/users/:login/is_pinned_projects/pin.json
-请求字段说明:
同时设定多个星标项目
+请求字段说明:
同时设定多个星标项目
参数 |
@@ -2151,9 +2186,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X PATCH http://localhost:3000/api/users/yystopf/is_pinned_projects/11.json
await octokit.request('PATCH/PUT /api/users/:login/is_pinned_projects/:id.json')
-
HTTP 请求
+HTTP 请求
PATCH/PUT /api/users/:login/is_pinned_projects/:id.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -2192,7 +2227,7 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/statistics/activity.json
await octokit.request('GET /api/users/:login/statistics/activity.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/statistics/activity.json
返回字段说明:
@@ -2281,9 +2316,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/headmaps.json
await octokit.request('GET /api/users/:login/headmaps.json')
-
HTTP 请求
+HTTP 请求
GET api/users/:login/headmaps.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -2426,9 +2461,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/project_trends.json
await octokit.request('GET /api/users/:login/project_trends.json')
-
HTTP 请求
+HTTP 请求
GET api/users/:login/project_trends.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -2743,9 +2778,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/statistics/develop.json
await octokit.request('GET /api/users/:login/statistics/develop.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/statistics/develop.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -2886,9 +2921,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/statistics/role.json
await octokit.request('GET /api/users/:login/statistics/role.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/statistics/role.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -2968,9 +3003,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/statistics/major.json
await octokit.request('GET /api/users/:login/statistics/major.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/statistics/major.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -3029,9 +3064,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/applied_messages.json
await octokit.request('GET /api/users/:login/applied_messages.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/applied_messages.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -3308,9 +3343,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/applied_transfer_projects.json
await octokit.request('GET /api/users/:login/applied_transfer_projects.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/applied_transfer_projects.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -3500,9 +3535,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X POST http://localhost:3000/api/users/yystopf/applied_transfer_projects/2/accept.json
await octokit.request('GET /api/users/:login/applied_transfer_projects/:id/accept.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/applied_transfer_projects/:id/accept.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -3691,9 +3726,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X POST http://localhost:3000/api/users/yystopf/applied_transfer_projects/2/refuse.json
await octokit.request('GET /api/users/:login/applied_transfer_projects/:id/refuse.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/applied_transfer_projects/:id/refuse.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -3882,9 +3917,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X GET http://localhost:3000/api/users/yystopf/applied_projects.json
await octokit.request('GET /api/users/:login/applied_projects.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/applied_projects.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -4042,9 +4077,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X POST http://localhost:3000/api/users/yystopf/applied_projects/2/accept.json
await octokit.request('GET /api/users/:login/applied_projects/:id/accept.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/applied_projects/:id/accept.json
-请求字段说明:
+请求字段说明:
参数 |
@@ -4201,9 +4236,9 @@ Success — a happy kitten is an authenticated kitten!
curl -X POST http://localhost:3000/api/users/yystopf/applied_projects/2/refuse.json
await octokit.request('GET /api/users/:login/applied_projects/:id/refuse.json')
-
HTTP 请求
+HTTP 请求
GET /api/users/:login/applied_projects/:id/refuse.json
-请求字段说明:
+请求字段说明: