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;

  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

-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'),
    );
  }
}
// public 폴더를 static으로 오픈
app.use('/public', static(path.join(__dirname, 'public')));

 

서버 파일 경로(__dirname)에 public 폴더를 붙혀  

 

localhost:3000/public/*.html에 접근

-모듈만들기-

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 사용을 권장한다.

◎멀티파트포맷 : 음악이나 이미지 파일 등을 일반 데이터와 함께 웹 서버로 보내려고 만든 표준

 

-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>

+ Recent posts