Просмотр исходного кода

토론 목록도 API로 변경 및 최근 토론 기능 추가

잉여개발기 2 лет назад
Родитель
Сommit
9782257401

+ 5 - 1
app.py

@@ -548,9 +548,11 @@ app.route('/revert/<int:num>/<everything:name>', methods = ['POST', 'GET'])(edit
 app.route('/move/<everything:name>', methods = ['POST', 'GET'])(edit_move)
 
 # Func-topic
+app.route('/topic/<everything:name>', methods = ['POST', 'GET'])(topic_list)
+app.route('/topic_page/<int:page>/<everything:name>', methods = ['POST', 'GET'])(topic_list)
+
 app.route('/thread/<int:topic_num>', methods = ['POST', 'GET'])(topic)
 app.route('/thread/0/<everything:doc_name>', defaults = { 'topic_num' : '0' }, methods = ['POST', 'GET'])(topic)
-app.route('/topic/<everything:name>', methods = ['POST', 'GET'])(topic_list)
 
 app.route('/thread/<int:topic_num>/tool')(topic_tool)
 app.route('/thread/<int:topic_num>/setting', methods = ['POST', 'GET'])(topic_tool_setting)
@@ -731,6 +733,8 @@ app.route('/api/v2/recent_discuss/<set_type>/<int:num>', defaults = { 'db_set' :
 app.route('/api/v2/list/document/old/<int:num>', defaults = { 'db_set' : db_set_str, 'set_type' : 'old' })(api_list_old_page)
 app.route('/api/v2/list/document/new/<int:num>', defaults = { 'db_set' : db_set_str, 'set_type' : 'new' })(api_list_old_page)
 
+app.route('/api/v2/topic/<int:num>/<set_type>/<everything:name>', defaults = { 'db_set' : db_set_str })(api_topic_list)
+
 # Func-main
 # 여기도 전반적인 조정 시행 예정
 app.route('/other')(main_tool_other)

+ 3 - 1
route/__init__.py

@@ -117,7 +117,6 @@ from route.topic_comment_blind import topic_comment_blind
 from route.topic_comment_delete import topic_comment_delete
 from route.topic_comment_notice import topic_comment_notice
 from route.topic_comment_tool import topic_comment_tool
-from route.topic_list import topic_list
 from route.topic_tool import topic_tool
 from route.topic_tool_acl import topic_tool_acl
 from route.topic_tool_change import topic_tool_change
@@ -169,6 +168,8 @@ from route.n_list_old_page import list_old_page
 
 from route.n_w_watch_list import w_watch_list
 
+from route.n_topic_list import topic_list
+
 from route.n_bbs_main import bbs_main
 
 from route.go_api_func_llm import api_func_llm
@@ -188,6 +189,7 @@ from route.go_api_bbs import api_bbs
 from route.go_api_bbs_list import api_bbs_list
 
 from route.go_api_topic import api_topic
+from route.go_api_topic_list import api_topic_list
 
 from route.go_api_w_raw import api_w_raw
 from route.go_api_w_random import api_w_random

+ 2 - 1
route/go_api_topic_list.py

@@ -1,8 +1,9 @@
 from .tool.func import *
 
-def api_topic_list(db_set, name = 'Test', num = 1):
+def api_topic_list(db_set, name = 'Test', set_type = 'normal', num = 1):
     other_set = {}
     other_set["name"] = str(name)
+    other_set["set_type"] = set_type
     other_set["num"] = str(num)
     other_set = json.dumps(other_set)
 

+ 13 - 0
route/n_topic_list.py

@@ -0,0 +1,13 @@
+from .tool.func import *
+
+def topic_list(page = 1, name = 'Test'):
+    with get_db_connect() as conn:
+        return easy_minify(conn, flask.render_template(skin_check(conn),
+            imp = [name, wiki_set(conn), wiki_custom(conn), wiki_css(['(' + get_lang(conn, 'discussion_list') + ')', 0])],
+            data = '' + \
+                '<div id="opennamu_topic_list"></div>' + \
+                '<script src="/views/main_css/js/route/topic_list.js' + cache_v() + '"></script>' + \
+                '<script>opennamu_topic_list();</script>' + \
+            '',
+            menu = [['w/' + url_pas(name), get_lang(conn, 'document')]]
+        ))

+ 1 - 1
route/tool/func.py

@@ -1069,7 +1069,7 @@ def skin_check(conn, set_n = 0):
         return skin
     
 def cache_v():
-    return '.cache_v237'
+    return '.cache_v238'
 
 def wiki_css(data):
     global global_wiki_set

BIN
route_go/bin/main.amd64.exe


+ 1 - 1
route_go/go.mod

@@ -5,6 +5,7 @@ go 1.21
 toolchain go1.22.0
 
 require (
+	github.com/dlclark/regexp2 v1.11.0
 	github.com/go-sql-driver/mysql v1.8.0
 	github.com/google/generative-ai-go v0.10.0
 	github.com/yuin/goldmark v1.7.0
@@ -19,7 +20,6 @@ require (
 	cloud.google.com/go/compute/metadata v0.2.3 // indirect
 	cloud.google.com/go/longrunning v0.5.2 // indirect
 	filippo.io/edwards25519 v1.1.0 // indirect
-	github.com/dlclark/regexp2 v1.11.0 // indirect
 	github.com/dustin/go-humanize v1.0.1 // indirect
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 	github.com/golang/protobuf v1.5.3 // indirect

+ 3 - 1
route_go/main.go

@@ -24,7 +24,7 @@ func main() {
 	} else if call_arg[0] == "api_search" {
 		route_data = route.Api_search(call_arg[1:])
 	} else if call_arg[0] == "api_topic" {
-		route_data = route.Api_thread(call_arg[1:])
+		route_data = route.Api_topic(call_arg[1:])
 	} else if call_arg[0] == "api_func_ip" {
 		route_data = route.Api_func_ip(call_arg[1:])
 	} else if call_arg[0] == "api_list_recent_change" {
@@ -53,6 +53,8 @@ func main() {
 		route_data = route.Api_bbs_list(call_arg[1:])
 	} else if call_arg[0] == "api_list_old_page" {
 		route_data = route.Api_list_old_page(call_arg[1:])
+	} else if call_arg[0] == "api_topic_list" {
+		route_data = route.Api_topic_list(call_arg[1:])
 	} else {
 		log.Fatal("404")
 	}

+ 13 - 9
route_go/route/api_list_recent_discuss.go

@@ -42,11 +42,11 @@ func Api_list_recent_discuss(call_arg []string) string {
 
 	set_type := other_set["set_type"]
 	if set_type == "normal" {
-		stmt, err = db.Prepare(tool.DB_change(db_set, "select title, sub, date, code, stop from rd order by date desc limit ?, ?"))
+		stmt, err = db.Prepare(tool.DB_change(db_set, "select title, sub, date, code, stop, agree from rd order by date desc limit ?, ?"))
 	} else if set_type == "close" {
-		stmt, err = db.Prepare(tool.DB_change(db_set, "select title, sub, date, code, stop from rd where stop = 'O' order by date desc limit ?, ?"))
+		stmt, err = db.Prepare(tool.DB_change(db_set, "select title, sub, date, code, stop, agree from rd where stop = 'O' order by date desc limit ?, ?"))
 	} else {
-		stmt, err = db.Prepare(tool.DB_change(db_set, "select title, sub, date, code, stop from rd where stop != 'O' order by date desc limit ?, ?"))
+		stmt, err = db.Prepare(tool.DB_change(db_set, "select title, sub, date, code, stop, agree from rd where stop != 'O' order by date desc limit ?, ?"))
 	}
 
 	if err != nil {
@@ -69,8 +69,9 @@ func Api_list_recent_discuss(call_arg []string) string {
 		var date string
 		var code string
 		var stop string
+		var agree string
 
-		err := rows.Scan(&title, &sub, &date, &code, &stop)
+		err := rows.Scan(&title, &sub, &date, &code, &stop, &agree)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -115,6 +116,7 @@ func Api_list_recent_discuss(call_arg []string) string {
 			ip_pre,
 			ip_render,
 			id,
+			agree,
 		})
 	}
 
@@ -131,11 +133,13 @@ func Api_list_recent_discuss(call_arg []string) string {
 
 		return_data := make(map[string]interface{})
 		return_data["language"] = map[string]string{
-			"tool":             tool.Get_language(db, db_set, "tool", false),
-			"normal":           tool.Get_language(db, db_set, "normal", false),
-			"close_discussion": tool.Get_language(db, db_set, "close_discussion", false),
-			"open_discussion":  tool.Get_language(db, db_set, "open_discussion", false),
-			"closed":           tool.Get_language(db, db_set, "closed", false),
+			"tool":              tool.Get_language(db, db_set, "tool", false),
+			"normal":            tool.Get_language(db, db_set, "normal", false),
+			"close_discussion":  tool.Get_language(db, db_set, "close_discussion", false),
+			"open_discussion":   tool.Get_language(db, db_set, "open_discussion", false),
+			"closed":            tool.Get_language(db, db_set, "closed", false),
+			"agreed_discussion": tool.Get_language(db, db_set, "agreed_discussion", false),
+			"stop":              tool.Get_language(db, db_set, "stop", false),
 		}
 		return_data["auth"] = auth_info
 

+ 1 - 1
route_go/route/api_thread.go → route_go/route/api_topic.go

@@ -8,7 +8,7 @@ import (
 	"opennamu/route/tool"
 )
 
-func Api_thread(call_arg []string) string {
+func Api_topic(call_arg []string) string {
 	db_set := map[string]string{}
 	json.Unmarshal([]byte(call_arg[0]), &db_set)
 

+ 52 - 4
route_go/route/api_topic_list.go

@@ -1,6 +1,7 @@
 package route
 
 import (
+	"database/sql"
 	"encoding/json"
 	"log"
 	"opennamu/route/tool"
@@ -28,7 +29,7 @@ func Api_topic_list(call_arg []string) string {
 		page_int = 0
 	}
 
-	stmt, err := db.Prepare(tool.DB_change(db_set, "select code, sub, stop, agree from rd where title = ? order by sub asc limit ?, 50"))
+	stmt, err := db.Prepare(tool.DB_change(db_set, "select code, sub, stop, agree, date from rd where title = ? order by sub asc limit ?, 50"))
 	if err != nil {
 		log.Fatal(err)
 	}
@@ -41,23 +42,70 @@ func Api_topic_list(call_arg []string) string {
 	defer rows.Close()
 
 	var data_list [][]string
+	ip_parser_temp := map[string][]string{}
 
 	for rows.Next() {
 		var code string
 		var sub string
 		var stop string
 		var agree string
+		var date string
 
-		err := rows.Scan(&code, &sub, &stop, &agree)
+		err := rows.Scan(&code, &sub, &stop, &agree, &date)
 		if err != nil {
 			log.Fatal(err)
 		}
 
-		data_list = append(data_list, []string{code, sub, stop, agree})
+		stmt, err := db.Prepare(tool.DB_change(db_set, "select ip, id from topic where code = ? order by id + 0 desc limit 1"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var ip string
+		var id string
+
+		err = stmt.QueryRow(code).Scan(&ip, &id)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				ip = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		var ip_pre string
+		var ip_render string
+
+		if _, ok := ip_parser_temp[ip]; ok {
+			ip_pre = ip_parser_temp[ip][0]
+			ip_render = ip_parser_temp[ip][1]
+		} else {
+			ip_pre = tool.IP_preprocess(db, db_set, ip, other_set["ip"])[0]
+			ip_render = tool.IP_parser(db, db_set, ip, other_set["ip"])
+
+			ip_parser_temp[ip] = []string{ip_pre, ip_render}
+		}
+
+		data_list = append(data_list, []string{
+			code,
+			sub,
+			stop,
+			agree,
+			ip_pre,
+			ip_render,
+			date,
+			id,
+		})
 	}
 
 	return_data := make(map[string]interface{})
-	return_data["language"] = map[string]string{}
+	return_data["language"] = map[string]string{
+		"closed":            tool.Get_language(db, db_set, "closed", false),
+		"agreed_discussion": tool.Get_language(db, db_set, "agreed_discussion", false),
+		"make_new_topic":    tool.Get_language(db, db_set, "make_new_topic", false),
+		"stop":              tool.Get_language(db, db_set, "stop", false),
+	}
 
 	if len(data_list) == 0 {
 		return_data["data"] = map[string]string{}

+ 1 - 1
views/main_css/js/route/list_old_page.js

@@ -2,7 +2,7 @@
 
 function opennamu_list_old_page() {
     const url = window.location.pathname;
-    const url_split = url.split('/')
+    const url_split = url.split('/');
     
     let set_type = '';
     let num = '';

+ 1 - 1
views/main_css/js/route/list_recent_change.js

@@ -12,7 +12,7 @@ function opennamu_list_recent_change() {
     }
 
     const url = window.location.pathname;
-    const url_split = url.split('/')
+    const url_split = url.split('/');
     
     let set_type = '';
     let num = '';

+ 7 - 1
views/main_css/js/route/list_recent_discuss.js

@@ -2,7 +2,7 @@
 
 function opennamu_list_recent_discuss() {
     const url = window.location.pathname;
-    const url_split = url.split('/')
+    const url_split = url.split('/');
     
     let set_type = '';
     let num = '';
@@ -42,6 +42,12 @@ function opennamu_list_recent_discuss() {
             let right = '';
             if(data[for_a][4] === 'O') {
                 right += lang['closed'] + ' | ';
+            } else if(data[for_a][4] === 'S') {
+                right += lang['stop'] + ' | ';
+            }
+
+            if(data[for_a][8] !== '') {
+                right += lang['agreed_discussion'] + ' | ';
             }
 
             right += '<a href="/thread/' + data[for_a][3] + '#' + data[for_a][7] + '">#' + data[for_a][7] + '</a> | ';

+ 59 - 0
views/main_css/js/route/topic_list.js

@@ -0,0 +1,59 @@
+function opennamu_topic_list() {
+    const url = window.location.pathname;
+    const url_split = url.split('/');
+
+    let num;
+    if(url_split[1] === 'topic') {
+        num = '1';
+    } else {
+        num = url_split[2];
+    }
+
+    
+    let doc_name;
+    if(url_split[1] === 'topic') {
+        doc_name = url_split.slice(2, undefined).join('/');
+    } else {
+        doc_name = url_split.slice(3, undefined).join('/');
+    }
+
+    fetch('/api/v2/topic/' + num + '/normal/' + doc_name).then(function(res) {
+        return res.json();
+    }).then(function(data) {
+        let lang = data['language'];
+        data = data['data'];
+
+        let data_html = '';
+
+        for(let for_a = 0; for_a < data.length; for_a++) {
+            let left = '<a href="/thread/' + data[for_a][0] + '">' + opennamu_xss_filter(data[for_a][1]) + '</a>';
+            
+            let right = '';
+            if(data[for_a][2] === 'O') {
+                right += lang['closed'] + ' | ';
+            } else if(data[for_a][2] === 'S') {
+                right += lang['stop'] + ' | ';
+            }
+
+            if(data[for_a][3] !== '') {
+                right += lang['agreed_discussion'] + ' | ';
+            }
+
+            right += '<a href="/thread/' + data[for_a][0] + '#' + data[for_a][7] + '">#' + data[for_a][7] + '</a> | ';
+            right += data[for_a][5] + ' | ';
+            right += data[for_a][6];
+
+            data_html += openamu_make_list(left, right);
+        }
+
+        if(data_html !== '') {
+            data_html += '<hr class="main_hr">';
+        }
+
+        data_html += '<a href="/thread/0/' + doc_name + '">(' + lang['make_new_topic'] + ')</a>';
+
+        data_html += opennamu_page_control('/topic_page/{}/normal/' + doc_name, Number(num), data.length);
+
+        document.getElementById('opennamu_topic_list').innerHTML = data_html;
+    });
+}