SELECT * FROM(SELECT c.*,a.nickName FROM comment c JOIN account a ON c.userId = a._id AND c.contentId = 30) a order BY commentGroup ASC,root asc,_id asc;
For developer
- (마리아DB)댓글 추출 2021.04.12
- 자바 시간차이 문자열 변환 2021.03.31
- (Flutter)bottomNavigationBar 기본뼈대 2020.09.16
- (Node.js)기록용 -> 경로설정 2020.09.10
- (Node.js)모듈화 2020.09.09
- (Node.js)파일 업로드 기능 2020.09.08
(마리아DB)댓글 추출
2021. 4. 12. 13:06
자바 시간차이 문자열 변환
2021. 3. 31. 15:32
public String getDifferenceTime(String uploadTime){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = sdf.parse(uploadTime);
} catch (ParseException e) {
e.printStackTrace();
}
long uploadMills = date.getTime();
long nowMills = System.currentTimeMillis();
long difference = (long) ((nowMills - uploadMills)/1000.0);
String returnValue;
if(difference <=60){
returnValue = difference+"초전";
}else if(difference <= 60*60){
returnValue = (difference/60)+"분전";
}else if(difference <= 60*60*24){
returnValue = (difference/(60*60))+"시간전";
}else if(difference <= 60*60*24*7){
returnValue = (difference/(60*60*24))+"일전";
}else if(difference <= 60*60*24*7*52){
returnValue = (difference/(60*60*24*7))+"주전";
}else{
returnValue = (difference/(60*60*24*7*52))+"년전";
}
return returnValue;
}
'For developer > JAVA' 카테고리의 다른 글
(JAVA)문자열클래스 (0) | 2020.05.12 |
---|---|
JDBC 한눈에 보기 (0) | 2020.04.26 |
JDBC 작업순서 (0) | 2020.04.24 |
JDBC ORACLE 연결 오류 뜰 시 설정하는 법 (0) | 2020.04.23 |
자바 환경구축 (0) | 2020.04.23 |
(Flutter)bottomNavigationBar 기본뼈대
2020. 9. 16. 00:56
-test.dart(메인)-
import 'package:flutter/material.dart';
import 'first.dart';
import 'home.dart';
import 'second.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
int _currentIndex = 0;
final List<Widget> _children = [Home(), First(), Second()];
//홈 화면 증가값
void _incrementCounter() {
setState(() {
_counter++;
});
}
//bottomNavigation 창 전환
void _onTap(int index) {
setState(() {
_currentIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: _children[_currentIndex],
/* body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),*/
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
// 추가된 bottomNavigationBar
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
onTap: (index) => _onTap(index),
currentIndex: 0,
items: [
new BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text('Home'),
),
new BottomNavigationBarItem(
icon: Icon(Icons.mail),
title: Text('First'),
),
new BottomNavigationBarItem(
icon: Icon(Icons.person),
title: Text('Second'),
)
]));
}
}
-home.dart-
import 'package:flutter/material.dart';
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
);
}
}
-first.dart-
import 'package:flutter/cupertino.dart';
class First extends StatefulWidget {
@override
_FirstState createState() => _FirstState();
}
class _FirstState extends State<First> {
@override
Widget build(BuildContext context) {
return Container(
child: Text('first'),
);
}
}
-second.dart-
import 'package:flutter/cupertino.dart';
class Second extends StatefulWidget {
@override
_SecondState createState() => _SecondState();
}
class _SecondState extends State<Second> {
@override
Widget build(BuildContext context) {
return Container(
child: Text('Second'),
);
}
}
(Node.js)기록용 -> 경로설정
2020. 9. 10. 13:29
// public 폴더를 static으로 오픈
app.use('/public', static(path.join(__dirname, 'public')));
서버 파일 경로(__dirname)에 public 폴더를 붙혀
localhost:3000/public/*.html에 접근
'For developer > Node.js' 카테고리의 다른 글
(Node.js)모듈화 (0) | 2020.09.09 |
---|---|
(Node.js)파일 업로드 기능 (0) | 2020.09.08 |
(Node.js)쿠키와 세션 (0) | 2020.09.08 |
(Node.js)익스프레스로 웹 서버 만들기(2) (0) | 2020.09.08 |
(Node.js)익스프레스로 웹 서버 만들기(1) (0) | 2020.09.07 |
(Node.js)모듈화
2020. 9. 9. 19:02
-모듈만들기-
user1.js
//exports 객체 속성으로 함수 추가
exports.getUser = function(){
return {id:'test01',name:'소녀시대'};
}
//exports 객체 속성으로 객체 추가
exports.group={id:'group',name:'친구'};
module_test1.js
//require() 메소드는 exports 객체를 반환함
var user1 = require('./user1');
function showUser(){
return user1.getUser().name + ', '+user1.group.name;
}
console.log('사용자 정보:%s',showUser);
-출력결과-

-module.exports를 사용해서 객체를 그대로 할당하기-
노드는 모듈을 처리할 때 exports를 속성으로 인식 , 그래서 exports에 객체를 할당하면 require한 부분에서 사용 할 수 없음 => 이 부분을 해결하기 위하여 exports 가 아닌 module.exports 를 사용
user3.js
//module.exports에는 객체를 그대로 할당할 수 있음
var user = {
getUser : function(){
return {id:'test01',name:'소녀시대'};
},
group:{id:'group01',name:'친구'}
}
module.exports = user;
module_test3.js
//require() 메소드는 객체를 반환함.
var user = require('./user3');
function showUser(){
return user.getUser().name + ', '+user.group.name;
}
console.log('사용자 정보 : %s',showUser());
-출력결과-

-exports와 module.exports를 함께 사용하기-
두 개를 동시에 사용하면 module.exports가 우선으로 적용된다. 따라서 module.exports 사용을 권장한다.
'For developer > Node.js' 카테고리의 다른 글
(Node.js)기록용 -> 경로설정 (0) | 2020.09.10 |
---|---|
(Node.js)파일 업로드 기능 (0) | 2020.09.08 |
(Node.js)쿠키와 세션 (0) | 2020.09.08 |
(Node.js)익스프레스로 웹 서버 만들기(2) (0) | 2020.09.08 |
(Node.js)익스프레스로 웹 서버 만들기(1) (0) | 2020.09.07 |
(Node.js)파일 업로드 기능
2020. 9. 8. 18:59
◎멀티파트포맷 : 음악이나 이미지 파일 등을 일반 데이터와 함께 웹 서버로 보내려고 만든 표준
-multer 미들웨어 설치-
% npm install multer --save
속성/메소드 이름 | 설명 |
destination | 업로드한 파일이 저장될 폴더를 지정합니다. |
filename | 업로드한 파일의 이름을 바꿉니다. |
limits | 파일 크기나 파일 개수 등의 제한 속성을 설정하는 객체입니다. |
app13.js
/**
* 파일 업로드하기
*
* 웹브라우저에서 아래 주소의 페이지를 열고 웹페이지에서 요청
* http://localhost:3000/public/photo.html
*
* 파일업로드를 위해 클라이언트에서 지정한 이름은 photo 입니다.
*
* @date 2016-10-25
* @author Mike
*/
// Express 기본 모듈 불러오기
var express = require('express')
, http = require('http')
, path = require('path');
// Express의 미들웨어 불러오기
var bodyParser = require('body-parser')
, cookieParser = require('cookie-parser')
, static = require('serve-static')
, errorHandler = require('errorhandler');
// 에러 핸들러 모듈 사용
var expressErrorHandler = require('express-error-handler');
// Session 미들웨어 불러오기
var expressSession = require('express-session');
// 파일 업로드용 미들웨어
var multer = require('multer');
var fs = require('fs');
//클라이언트에서 ajax로 요청 시 CORS(다중 서버 접속) 지원
var cors = require('cors');
// 익스프레스 객체 생성
var app = express();
// 기본 속성 설정
app.set('port', process.env.PORT || 3000);
// body-parser를 이용해 application/x-www-form-urlencoded 파싱
app.use(bodyParser.urlencoded({ extended: false }))
// body-parser를 이용해 application/json 파싱
app.use(bodyParser.json())
// public 폴더와 uploads 폴더 오픈
app.use('/public', static(path.join(__dirname, 'public')));
app.use('/uploads', static(path.join(__dirname, 'uploads')));
// cookie-parser 설정
app.use(cookieParser());
// 세션 설정
app.use(expressSession({
secret:'my key',
resave:true,
saveUninitialized:true
}));
//클라이언트에서 ajax로 요청 시 CORS(다중 서버 접속) 지원
app.use(cors());
//multer 미들웨어 사용 : 미들웨어 사용 순서 중요 body-parser -> multer -> router
// 파일 제한 : 10개, 1G
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, 'uploads')
},
filename: function (req, file, callback) {
callback(null, file.originalname + Date.now())
}
});
var upload = multer({
storage: storage,
limits: {
files: 10,
fileSize: 1024 * 1024 * 1024
}
});
// 라우터 사용하여 라우팅 함수 등록
var router = express.Router();
// 파일 업로드 라우팅 함수 - 로그인 후 세션 저장함
router.route('/process/photo').post(upload.array('photo', 1), function(req, res) {
console.log('/process/photo 호출됨.');
try {
var files = req.files;
console.dir('#===== 업로드된 첫번째 파일 정보 =====#')
console.dir(req.files[0]);
console.dir('#=====#')
// 현재의 파일 정보를 저장할 변수 선언
var originalname = '',
filename = '',
mimetype = '',
size = 0;
if (Array.isArray(files)) { // 배열에 들어가 있는 경우 (설정에서 1개의 파일도 배열에 넣게 했음)
console.log("배열에 들어있는 파일 갯수 : %d", files.length);
for (var index = 0; index < files.length; index++) {
originalname = files[index].originalname;
filename = files[index].filename;
mimetype = files[index].mimetype;
size = files[index].size;
}
} else { // 배열에 들어가 있지 않은 경우 (현재 설정에서는 해당 없음)
console.log("파일 갯수 : 1 ");
originalname = files[index].originalname;
filename = files[index].name;
mimetype = files[index].mimetype;
size = files[index].size;
}
console.log('현재 파일 정보 : ' + originalname + ', ' + filename + ', '
+ mimetype + ', ' + size);
// 클라이언트에 응답 전송
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
res.write('<h3>파일 업로드 성공</h3>');
res.write('<hr/>');
res.write('<p>원본 파일명 : ' + originalname + ' -> 저장 파일명 : ' + filename + '</p>');
res.write('<p>MIME TYPE : ' + mimetype + '</p>');
res.write('<p>파일 크기 : ' + size + '</p>');
res.end();
} catch(err) {
console.dir(err.stack);
}
});
app.use('/', router);
// 404 에러 페이지 처리
var errorHandler = expressErrorHandler({
static: {
'404': './public/404.html'
}
});
app.use( expressErrorHandler.httpError(404) );
app.use( errorHandler );
// Express 서버 시작
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
photo.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일업로드 테스트</title>
</head>
<body>
<h1>파일업로드</h1>
<br>
<form method="post" enctype="multipart/form-data" action="/process/photo">
<table>
<tr>
<td><label>파일</label></td>
<td><input type="file" name="photo" /></td>
</tr>
</table>
<input type="submit" value="업로드" name="submit"/>
</form>
</body>
</html>

'For developer > Node.js' 카테고리의 다른 글
(Node.js)기록용 -> 경로설정 (0) | 2020.09.10 |
---|---|
(Node.js)모듈화 (0) | 2020.09.09 |
(Node.js)쿠키와 세션 (0) | 2020.09.08 |
(Node.js)익스프레스로 웹 서버 만들기(2) (0) | 2020.09.08 |
(Node.js)익스프레스로 웹 서버 만들기(1) (0) | 2020.09.07 |