使用Spring安全表達式控制系統功能訪問權限

一、SPEL表達式權限控制

spring security 3.0開始已經可以使用spring Expression表達式來控制授權,允許在表達式中使用複雜的布爾邏輯來控制訪問的權限。Spring Security可用表達式對象的基類是SecurityExpressionRoot。

表達式函數 描述
hasRole([role]) 用戶擁有指定的角色時返回true (Spring security默認會帶有ROLE_前綴),去除前綴參考
hasAnyRole([role1,role2]) 用戶擁有任意一個指定的角色時返回true
hasAuthority([authority]) 擁有某資源的訪問權限時返回true
hasAnyAuthority([auth1,auth2]) 擁有某些資源其中部分資源的訪問權限時返回true
permitAll 永遠返回true
denyAll 永遠返回false
anonymous 當前用戶是anonymous時返回true
rememberMe 當前用戶是rememberMe用戶返回true
authentication 當前登錄用戶的authentication對象
fullAuthenticated 當前用戶既不是anonymous也不是rememberMe用戶時返回true
hasIpAddress('192.168.1.0/24')) 請求發送的IP匹配時返回true

部分朋友可能會對Authority和Role有些混淆。Authority作為資源訪問權限可大可小,可以是某按鈕的訪問權限(如資源ID:biz1),也可以是某類用戶角色的訪問權限(如資源ID:ADMIN)。當Authority作為角色資源權限時,hasAuthority(’ROLE_ADMIN’)與hasRole(’ADMIN’)是一樣的效果。

二、SPEL在全局配置中的使用

我們可以通過繼承WebSecurityConfigurerAdapter,實現相關的配置方法,進行全局的安全配置(之前的章節已經講過) 。下面就為大家介紹一些如何在全局配置中使用SPEL表達式。

2.1.URL安全表達式

config.antMatchers("/system/*").access("hasAuthority('ADMIN') or hasAuthority('USER')")
      .anyRequest().authenticated();

這裏我們定義了應用/person/*URL的範圍,只有擁有ADMIN或者USER權限的用戶才能訪問這些person資源。

2.2.安全表達式中引用bean

這種方式,比較適合有複雜權限驗證邏輯的情況,當Spring Security提供的默認表達式方法無法滿足我們的需求的時候。首先我們定義一個權限驗證的RbacService。

@Component("rbacService")
@Slf4j
public class RbacService {
    //返回true表示驗證通過
    public boolean hasPermission(HttpServletRequest request, Authentication authentication) {
        //驗證邏輯代碼
        return true;
    }
    public boolean checkUserId(Authentication authentication, int id) {
        //驗證邏輯代碼
        return true;
    }
}

對於”/person/{id}”對應的資源的訪問,調用rbacService的bean的方法checkUserId進行權限驗證,傳遞參數為authentication對象和person的id。該id為PathVariable,以#開頭表示。

config.antMatchers("/person/{id}").access("@rbacService.checkUserId(authentication,#id)")
      .anyRequest().access("@rbacService.hasPermission(request,authentication)");

三、 Method表達式安全控制

如果我們想實現方法級別的安全配置,Spring Security提供了四種註解,分別是@PreAuthorize , @PreFilter , @PostAuthorize 和 @PostFilter

3.1.開啟方法級別註解的配置

在Spring安全配置代碼中,加上EnableGlobalMethodSecurity註解,開啟方法級別安全配置功能。

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MySecurityConfig extends WebSecurityConfigurerAdapter {

3.2 使用PreAuthorize註解

@PreAuthorize 註解適合進入方法前的權限驗證。只有擁有ADMIN角色才能訪問findAll方法。

@PreAuthorize("hasRole('ADMIN')")
List<Person> findAll();

3.3 使用PostAuthorize註解

@PostAuthorize 在方法執行后再進行權限驗證,適合根據返回值結果進行權限驗證。Spring EL 提供返回對象能夠在表達式語言中獲取返回的對象returnObject。下文代碼只有返回值的name等於authentication對象的name才能正確返回,否則拋出異常。

@PostAuthorize("returnObject.name == authentication.name")
Person findOne(Integer id);

3.4 使用PreFilter註解

PreFilter 針對參數進行過濾,下文代碼錶示針對ids參數進行過濾,只有id為偶數才能訪問delete方法。

//當有多個對象是使用filterTarget進行標註
@PreFilter(filterTarget="ids", value="filterObject%2==0")
public void delete(List<Integer> ids, List<String> usernames) {

3.5 使用PostFilter 註解

PostFilter 針對返回結果進行過濾,特別適用於集合類返回值,過濾集合中不符合表達式的對象。

@PostFilter("filterObject.name == authentication.name")
List<Person> findAll();

期待您的關注

  • 博主最近新寫了一本書:
  • 本文轉載註明出處(必須帶連接,不能只轉文字):。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

台灣寄大陸海運貨物規則及重量限制?

大陸寄台灣海運費用試算一覽表

EFCore批量操作,你真的清楚嗎

背景

EntityFramework Core有許多新的特性,其中一個重要特性便是批量操作。

批量操作意味着不需要為每次Insert/Update/Delete操作發送單獨的命令,而是在一次SQL請求中發送批量組合指令。

EFCore批量操作實踐

批處理是期待已久的功能,社區多次提出要求。現在EFCore支持開箱即用確實很棒,可以提高應用程序的性能和速度。

P1 對比實踐

下面以常見的批量插入為例,使用SQL Server Profiler 觀察實際產生並執行的SQL語句。

 還有一種關注EFCore產生的sql語句的方式,添加Nlog支持,關注Microsoft.EntityFrameworkCore.Database.Command 日誌

<logger name=”Microsoft.EntityFrameworkCore.Database.Command” minlevel=”Debug” writeTo=”sql” />

定義插入模型Category, 插入4個實體,這裏為什麼強調4,請留意下文。

    public class Category
    {
        public int Id { get; set; }
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
    }

/*EFCore 查看模型屬性,有Id使用id作為主鍵,
沒有Id,搜索public "{TableName}Id"作為主鍵,默認為int形主鍵設置標記列自增;
*/ info: Microsoft.EntityFrameworkCore.Database.Command[20100]
      Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [Categories] (
          [Id] int NOT NULL IDENTITY,
          [CategoryID] int NOT NULL,
          [CategoryName] nvarchar(max) NULL,
          CONSTRAINT [PK_Categories] PRIMARY KEY ([Id])
      );

using (var db = new BloggingContext())
{
  db.Categories.Add(new Category() { CategoryID = 1, CategoryName = “Clothing” });
  db.Categories.Add(new Category() { CategoryID = 2, CategoryName = “Footwear” });
  db.Categories.Add(new Category() { CategoryID = 3, CategoryName = “Accessories” });
  db.Categories.Add(new Category() { CategoryID = 4, CategoryName = “Accessories” });
  db.SaveChanges();
} 

當執行SaveChanges(), 日誌显示:

info: Microsoft.EntityFrameworkCore.Database.Command[20100]
      Executing DbCommand [Parameters=[@p0='1', @p1='Clothing' (Size = 4000), @p2='2', @p3='Footwear' (Size = 4000), @p4='3', @p5='Accessories' (Size = 4000), @p6='4', @p7='Accessories' (Size = 4000)], CommandType='Text', CommandTimeout='30']
      SET NOCOUNT ON;
      DECLARE @inserted0 TABLE ([Id] int, [_Position] [int]);
      MERGE [Categories] USING (
      VALUES (@p0, @p1, 0),
      (@p2, @p3, 1),
      (@p4, @p5, 2),
      (@p6, @p7, 3)) AS i ([CategoryID], [CategoryName], _Position) ON 1=0
      WHEN NOT MATCHED THEN
      INSERT ([CategoryID], [CategoryName])
      VALUES (i.[CategoryID], i.[CategoryName])
      OUTPUT INSERTED.[Id], i._Position
      INTO @inserted0;

      SELECT [t].[Id] FROM [Categories] t
      INNER JOIN @inserted0 i ON ([t].[Id] = [i].[Id])
      ORDER BY [i].[_Position];

從SQL Profiler追溯到的SQL:

exec sp_executesql N’SET NOCOUNT ON;
DECLARE @inserted0 TABLE ([Id] int, [_Position] [int]);
MERGE [Categories] USING (
VALUES (@p0, @p1, 0),
(@p2, @p3, 1),
(@p4, @p5, 2),
(@p6, @p7, 3)) AS i ([CategoryID], [CategoryName], _Position) ON 1=0
WHEN NOT MATCHED THEN
INSERT ([CategoryID], [CategoryName])
VALUES (i.[CategoryID], i.[CategoryName])
OUTPUT INSERTED.[Id], i._Position
INTO @inserted0;

SELECT [t].[Id] FROM [Categories] t
INNER JOIN @inserted0 i ON ([t].[Id] = [i].[Id])
ORDER BY [i].[_Position];

‘,N’@p0 int,@p1 nvarchar(4000),@p2 int,@p3 nvarchar(4000),@p4 int,@p5 nvarchar(4000),@p6 int,@p7 nvarchar(4000)’,@p0=1,@p1=N’Clothing’,@p2=2,@p3=N’Footwear’,@p4=3,@p5=N’Accessories’,@p6=4,@p7=N’Accessories’

 如你所見,批量插入沒有產生4個獨立的語句,而是被組合為一個傳參存儲過程腳本(用列值作為參數);如果使用EF6執行相同的代碼,則在SQL Server Profiler中將看到4個獨立的插入語句 。

① 就性能和速度而言,EFCore批量插入更具優勢。 ② 若數據庫是針對雲部署,EF6運行這些查詢,還將產生額外的流量成本。

 經過驗證:EFCore批量更新、批量刪除功能,EFCore均發出了使用sp_executesql存儲過程+批量參數構建的SQL腳本。

 P2 深入分析

起關鍵作用的 sp_executesql存儲過程: 可以多次執行的語句或批處理 (可帶參)

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse  
  
sp_executesql [ @stmt = ] statement  
[   
  { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' }   
     { , [ @param1 = ] 'value1' [ ,...n ] }  
]  

注意官方限制: 

The amount of data that can be passed by using this method is limited by the number of parameters allowed. SQL Server procedures can have, at most, 2100 parameters. Server-side logic is required to assemble these individual values into a table variable or a temporary table for processing.       // SQL存儲過程最多可使用2100個參數

P3 豁然開朗

SqlServer  sp_executesql存儲過程最多支持2100個批量操作形成的列值參數,所以遇到很大數量的批量操作,EFCore SqlProvider會幫我們將批量操作分塊傳輸, 

實際上EFCore 對於少於4個的批量命令,不會使用sp_executesql 存儲過程,我這邊自己根據官方驗證確實如此:

估摸着EFCore使用sp_executesql 也是有點耗資源的,對於小批量(小於4條的批量操作)依舊是產生單條sql。

// 同時EFCore開放了【配置關係型數據庫批量操作大小】
protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder) { string sConnString
= @"Server=localhost;Database=EFSampleDB;Trusted_Connection=true;"; optionbuilder.UseSqlServer(sConnString , b => b.MaxBatchSize(1)); // 批量操作的SQL語句數量,也可設定為1禁用批量插入 }

總結

① EFCore 相比EF6,已經支持批量操作,能有效提高應用程序的性能

② EFCore的批量操作能力,由對應的DataBaseProvider支撐(Provider實現過程跟背後的存儲載體密切相關)

      –  對於小批量操作(當前EFCore默認MinBatchSize為4》),EFCore不會啟用sp_executesql

  - 大批量關注存儲過程sp_executesql ,存儲過程的列值參數最多2100 個,這個關鍵因素決定了在大批量操作的時候 依舊會被分塊傳輸。

③ 另外一個批量操作的方法,這裏也點一下:構造Rawsql【EFCore支持Rawsql】。

  sqlite不支持存儲過程,為完成批量插入提高性能,可採用此方案。

var insertStr = new StringBuilder();
insertStr.AppendLine("insert into ProfileUsageCounters (profileid,datetime,quota,usage,natureusage) values");
var txt = insertStr.AppendLine(string.Join(',', usgaeEntities.ToList().Select(x =>
{
       return $"({x.ProfileId},{x.DateTime},{x.Quota},{x.Usage},{x.NatureUsage})";
}).ToArray()));
await _context.Database.ExecuteSqlCommandAsync(txt.ToString());

+

+

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

前端小白在asp.net core mvc中使用ECharts

對於在瀏覽器中繪製圖形圖表,目前有較多的js類庫可以使用,如:ChartJS,Flot,canvasjs等,但是今天介紹的主角為國產圖表庫,並在apache孵化,就是大名鼎鼎的echarts。

前方高能【官方介紹】

特性 – Apache ECharts (incubating)

ECharts,一個使用 JavaScript 實現的開源可視化庫,可以流暢的運行在 PC 和移動設備上,兼容當前絕大部分瀏覽器(IE8/9/10/11,Chrome,Firefox,Safari等),底層依賴矢量圖形庫 ZRender,提供直觀,交互豐富,可高度個性化定製的數據可視化圖表。

豐富的可視化類型

ECharts 提供了常規的折線圖、柱狀圖、散點圖、餅圖、K線圖,用於統計的盒形圖,用於地理數據可視化的地圖、熱力圖、線圖,用於關係數據可視化的關係圖、treemap、旭日圖,多維數據可視化的平行坐標,還有用於 BI 的漏斗圖,儀錶盤,並且支持圖與圖之間的混搭。

除了已經內置的包含了豐富功能的圖表,ECharts 還提供了自定義系列,只需要傳入一個renderItem函數,就可以從數據映射到任何你想要的圖形,更棒的是這些都還能和已有的交互組件結合使用而不需要操心其它事情。

你可以在下載界面下載包含所有圖表的構建文件,如果只是需要其中一兩個圖表,又嫌包含所有圖表的構建文件太大,也可以在在線構建中選擇需要的圖表類型后自定義構建。

多種數據格式無需轉換直接使用

ECharts 內置的 dataset 屬性(4.0+)支持直接傳入包括二維表,key-value 等多種格式的數據源,通過簡單的設置 encode 屬性就可以完成從數據到圖形的映射,這種方式更符合可視化的直覺,省去了大部分場景下數據轉換的步驟,而且多個組件能夠共享一份數據而不用克隆。

為了配合大數據量的展現,ECharts 還支持輸入 TypedArray 格式的數據,TypedArray 在大數據量的存儲中可以佔用更少的內存,對 GC 友好等特性也可以大幅度提升可視化應用的性能。

實踐

1、 使用VS2019創建一個asp.net core web項目,選擇ASP.NET Core Web 應用程序,並使用Web應用程序(模型視圖控制器)模板

2、使用libman添加echarts庫

在解決方案資源管理器中選擇項目名稱->wwwroot->lib,在lib文件夾上右擊,選擇:添加->客戶端庫,彈出窗口輸入echarts,自動帶出最新的版本,由於使用了cdnjs,上面最新版為4.3.0,在其他的如:jsdelivr、unpkg上面最新版為4.5.0。不過使用jsdelivr、unpkg現在4.5.0版本失敗,所以選擇了cdnjs上面的4.3.0版本。

插曲:在彈出的客戶端庫輸入內容時,如果時中文輸入法,已輸入部分文字,切換為英文輸入法時,會導致vs2019重啟,所以在客戶端庫窗口輸入內容時一定要前切換到英文輸入法

3、添加一個action,名為Echarts,並添加相應的視圖

在視圖中添加如下代碼,idmychart的div用於放置echarts圖表

<div class="row">
<div class="col-md-12">
<div id="myechart" style="width: 100%; height: 500px;">

</div>
</div>
</div>

添加相關js的引用

<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/echarts/echarts.js"></script>

4、使用Echarts

準備的json數據存放到了上面:
在引用的的js庫的下方編寫js代碼使用echarts显示圖表。
首先定義了一個結構,用於存放數據。

function Series(type, xdata, seriesData) {
        this.typeName = type;//相當於title
        this.xdata = xdata;//X軸數據
        this.seriesData = seriesData;//Y軸數據
    }

聲明一個charts實例。
> echartInstance.clear
清空當前實例,會移除實例中所有的組件和圖表。清空后調用 getOption 方法返回一個{}空對象。在多次查詢時需要用到清除上次添加的內容

var myEChart = echarts.init(document.getElementById('myechart'));
myEChart.clear();//用於清除已存在的內容

定義option

    var options = {
        title: {
            text: '數據曲線:',
            x: 'center'
        },
        
        legend: {
            data: [],
            x: 'left'
        },
        
        xAxis: {
            type: 'category'//必須
        },
        yAxis: {
            type: 'value',
            max: 90,
            min: -10
        },
        series: []
    }

設置myEChart的option

myEChart.setOption(options);

獲取json數據,經過處理后並將數據显示到myEChart

    $.get('/data.json').done(function (data) {

        //var aa = JSON.parse(data);
        var x = [];
        $.each(data.List,
            function (n, value) {
                var xd = [], sd = [];
                $.each(value.Data,
                    function (m, mValue) {
                        xd.push(mValue.SaveTime);
                        sd.push(mValue.WorkStationData);
                    });
                var s = new Series(value.TypeTitleName, xd, sd);
                x.push(s);
            });

        var xStart = data.Start;
        var xEnd = data.End;
        options.xAxis.data = x[0].xdata;
        options.xAxis.start = xStart;
        options.xAxis.end = xEnd;

        $.each(x,
            function (i, value) {
                options.title.text += value.typeName + " ";
                options.legend.data.push(value.typeName);
                options.series.push({
                    name: value.typeName,
                    type: 'line',
                    smooth: true,
                    data: value.seriesData
                });
            });
        myEChart.setOption(options);

    });
說明1

此段代碼是將json數據處理后,將x,y軸的數據分開存到到數組x中

        var x = [];
        $.each(data.List,
            function (n, value) {
                var xd = [], sd = [];
                $.each(value.Data,
                    function (m, mValue) {
                        xd.push(mValue.SaveTime);
                        sd.push(mValue.WorkStationData);
                    });
                var s = new Series(value.TypeTitleName, xd, sd);
                x.push(s);
            });
說明2

對option的xAxis軸的內容進行處理

var xStart = data.Start;
var xEnd = data.End;
options.xAxis.data = x[0].xdata;
options.xAxis.start = xStart;
options.xAxis.end = xEnd;
說明3

對option的titlelegendseries軸的內容進行處理

        $.each(x,
            function (i, value) {
                options.title.text += value.typeName + " ";
                options.legend.data.push(value.typeName);
                options.series.push({
                    name: value.typeName,
                    type: 'line',
                    smooth: true,
                    data: value.seriesData
                });
            });
###### 說明4
設置`myEChart`的option

myEChart.setOption(options);


### 5、運行程序
點擊“CTRL+F5”運行程序,切換到相應的action,可以看到圖表显示如下內容,所有的數據都正確的显示了。
![](https://img2018.cnblogs.com/blog/1746998/201911/1746998-20191121084936137-183805478.png)


到目前為止,貼出上面完整的代碼,到目前為止,你已經可以使用echarts處理圖表問題了:

### 6、功能擴展

###### 6.1 圖表左右空白較多
為了解決圖表中左右空白較多的問題,可以在options中添加如下內容:
    grid: {
        show: true,
        borderColor: '#19507c',
        x: 50,
        x2: 50,
        y: 40
    },
![](https://img2018.cnblogs.com/blog/1746998/201911/1746998-20191121084959477-981010092.png)

###### 6.2 鼠標滑過圖表显示當前時間的各項數據內容
上面的截圖,我們使用數據劃過圖表時,不能現在當前時間上各項數據,在options中添加如下代碼可以實現鼠標滑過显示各項數據的功能。
    tooltip: {
        trigger: 'axis',
        axisPointer: {
            type: 'cross',
            animation: false,
            label: {
                backgroundColor: '#505765'
            }
        }
    },
![](https://img2018.cnblogs.com/blog/1746998/201911/1746998-20191121085018478-908000477.png)


###### 6.3 添加相關功能按鈕
使用如下設置,添加了3個按鈕,分別為:區域縮放,區域縮放還原和還原。
區域縮放:可以在圖標上按住鼠標左鍵,用鼠標滑定一段區域,显示滑定區域的數據,相當於區域放大
區域縮放還原:還原到初始狀態
還原:就是還原功能
    toolbox: {
        feature: {
            dataZoom: {
                yAxisIndex: 'none'
            },
            restore: {},
            saveasImage: {}
        }
    },
![](https://img2018.cnblogs.com/blog/1746998/201911/1746998-20191121085036835-316142579.png)


###### 6.4 區域縮放
dataZoom 組件 用於區域縮放,從而能自由關注細節的數據信息,或者概覽數據整體,或者去除離群點的影響。
    dataZoom: [
        {
            show: true,
            realtime: true,
            start: 80,
            end: 100
        },
        {
            type: 'inside',
            realtime: true,
            start: 65,
            end: 100
        }
    ],
![](https://img2018.cnblogs.com/blog/1746998/201911/1746998-20191121085050551-185052507.png)


添加完4項擴展后,完整代碼如下:

“`
給個關注:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

宋妍霏現身機場,一套時髦的造型更是成了人群的焦點

大家對於宋妍霏的印象一定是時髦的穿搭,她也是女明星中的“帶貨女王”。她私下的穿搭以及優越的身材讓她頻頻登上熱搜。雖然宋妍霏沒有耳熟能詳的影視作品,也談不上流量,但是氣場與氣質都很在線。近日,宋妍霏現身機場,一套時髦的造型更是成了人群的焦點。

我們一起來看一下宋妍霏的這套時髦的造型吧。一件淺藍色的條紋襯衫疊加搭配了一件淺米色的針織毛衣馬甲,視覺上增強了整體造型的層次感。冬天也可以穿出自己的小巧思,大家快點學起來,告別冬日的枯燥時尚!宋妍霏下半身搭配了一條深藍與淺藍拼接的牛仔褲,保暖又時尚。

宋妍霏算不上長相精緻的大眾美女,但是確實是很有個性,穿衣服也特別時髦。作為時尚達人怎麼能少得了漁夫帽的搭配呢?宋妍霏這次選擇了一頂黑色的皮質漁夫帽,既顯臉小更是凹造型的神器。她還配了衣服金屬的耳飾,修飾了臉型,還給整體造型增加了復古的味道。

宋妍霏搭配的這一條拼接色的牛仔褲並不是修身的版型,闊腿又寬鬆的款式,顯得時髦又休閑。藍色的牛仔褲與上身淺藍色的牛仔褲相呼應,輕鬆穿出時尚感。宋妍霏在機場被粉絲準備的禮物驚喜到了,本人也是親和力十足呢,也沒有女明星的架子。

宋妍霏的這一套造型也是非常適合我們日常來學習搭配,秋天可以作為單穿來搭配,到了冬天也可以作為內搭來穿,外面再套一件厚一點的外套來疊穿,時尚感up!像她這樣外面搭配一件黃色的羊羔毛外套,時尚又減齡。

黃色的配色與內搭的藍色形成撞色,太時尚了,滿屏的青春與活力。明度比較高的黃色給寒冷的冬日增添了溫暖,引起了視覺上的極度舒適感。不愧是“帶貨女王”,是不是看她穿的這套造型也很想這樣來搭配。

宋妍霏這次走機場還換了一件黑色的大衣外套,這讓機場秒變成了秀場。黑色的長款大衣盡顯氣場,非常高級。黑色是最經典的顏色,雖然沒有黃色外套那樣的活力感,但是確實非常高級,有質感。

黃色的羊羔毛外套穿出青春活力氣息,黑色的長款大衣穿出了高級的氣場!宋妍霏教大家的疊穿搭配,大家學會了嗎?冬天不露腿也能擁有時尚的造型。

本站聲明:網站內容來源於http://www.shelive.net/,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

※聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

※新手該如何選擇電子菸口味及濃度呢?

※你應該要知道的電子煙懶人包!

電子煙有爭議?真相解密

※全台最大電子煙交易平台?

典雅女人風的圓潤半裙,很適合與短款外套搭配

夏天的裙子是不是被各位都收疊起來了呢?好像冬日的職場需要大氣莊重,於是也一併把夏天的雀躍心情裝了起來,今天只分享一個單品,就是半裙,在各種組合穿搭下,一定能在你的冬日裡帶出有滿足又愉悅的穿衣感受。

想要保暖一定要選皮質裙,或許皮褲挑腿型,但保持職業風的裹裙則能夠滿足職業場合,用有型的外套,或是基礎風毛衣,就能足夠擁有氣勢和女性感。用靴子打底是保證溫暖的基礎。

擁有典雅女人風的圓潤半裙,很適合與短款外套搭配, 不比西褲差的職業知性感,會讓冬天職場穿衣有變化還優雅。

除了靴子作為必備,配色其實依然要遵循不超過三個色彩的原則,這樣才能將職業半裙的幹練感保持統一,並且在寒冷天氣里也顯得大氣利落。

冬天時可以嘗試一些看似老氣的裙子搭配,因為厚重的色彩質感會營造更有濃度的品質,孔雀綠的絨質面料,能夠顯得你成熟大氣,內搭毛衣的顏色呼應是亮點。

駝色系的重呢傘裙,在格紋元素下有了英倫女性的優雅,讓半裙保持立體剪裁,會更適合冬天有型厚重的職場氛圍。

更喜歡輕盈飄揚的感覺,就別放棄春夏時的裙子,波點或碎花,黑白色系的永恆,在輕盈里構成平衡又端莊的風格。

不同面料的碰撞,最適合在冬天讓半裙煥發生機的穿法,比如針織毛衫與綢緞感的波點裙組合,穿出輕快的少女感。

發現波點元素真的很適合少女心又想保有成熟風的女孩,換作宮廷風的襯衫,搭配不規則半裙,作為秋冬上班時的內搭,自帶古典的貴氣感覺,但又很成熟大女人的味道。

有本身就適合冬天的裙子,自然要拿來在冬日里亮相,又輕又暖的針織裙,作內搭淑女又溫暖。

很難組合的絨質面料,本來很容易被穿出老氣,不過作為半裙搭配酷感的夾克外套,就更多些冬天專屬的質感,厚重面料卻被輕盈裙裝演繹,要強烈推薦給成熟的職業女性,自成一派的大氣。

南國的冬天其實很好過,但也選喲一些柔軟溫暖的元素,所以在基礎高領毛衣制外,就來搭一款絨毛邊半裙吧,有了柔軟而暖意的冬日元素,也讓傳統職場裙多出趣味,適合追求小巧精緻的女生。

本站聲明:網站內容來源於http://www.shelive.net/,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

※聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

※新手該如何選擇電子菸口味及濃度呢?

※你應該要知道的電子煙懶人包!

電子煙有爭議?真相解密

※全台最大電子煙交易平台?

溫暖有氣質六套冬季穿搭

北方的小仙女們在嘛,這幾天沒有被凍壞吧。北方的溫度降得不要太厲害了,多虧了十一月已經開始供暖了,室內都很暖和了。大家唯一要保暖的就是上班路上、上學路上、約會路上了吧,今天小編就給大家整理了六套冬季穿搭,保證你穿上氣質倍增!

第一套:裏面一定要穿保暖塑形的秋衣、秋褲,外面穿一件深紅色的韓版圓領毛衣,記得要選擇不透風的。下身穿一條條絨的黑色短裙,把毛衣前邊掖到短褲里一點,裏面穿一條加厚的黑色打底褲,保暖還顯腿長。搭配一雙黑色的漆皮長靴,非常顯氣質,當然啦外套可以隨意選擇一件呢子大衣即可。

第二套:內搭穿一件緊身的黑色針織衫,或者是圓領的薄款。下身穿一條黑色緊身褲,搭配一雙黑色的長靴。或者是裏面可以穿一件長款的黑色毛衣,整體顏色一致比較顯瘦。外套穿一件黑色的翻領呢子大衣,為了防止凍脖子,記得戴一條格紋或者是撞色的流蘇圍巾。

第三套:內搭穿一件緊身的針織衫,或者是一件低領的緊身毛衣,下身穿一條緊身的九分牛仔褲。搭配一雙平底的高幫休閑鞋,減齡又時尚的感覺。上身穿一件黑色的帶帽短款羽絨服,這樣的短款外套一定要注意,下身和內搭一定要緊身,這樣才不會讓你的視覺體重增重20斤!

第四套:內搭穿一件長款的灰色毛衣,裏面穿一件加厚的肉色打底襪,穿一雙高腰的長襪,搭配一雙平底小白鞋。外套穿一件短款的翻領羽絨服,內搭的長度最好是沒過膝蓋還要多,這樣會比較顯的整個人都很高。

第五套:內搭穿一件襯衣領的緊身針織衫,下身穿一件條絨的長裙,最好是選擇系腰帶的,這樣顯身材。或者是直接入手一個套裝,這樣也很方便利索。裏面穿一條加厚的肉色打底襪,搭配一雙小白鞋,十分減齡。上身穿一件羊羔絨的短款外套。

第六套:內搭穿一件保暖低領內衣,外面穿一件收腰的緊身V領針織衫。下身穿一條高腰的緊身牛仔褲,搭配一雙黑色漆皮的平底長靴,也是非常有氣質。

大家應該也都發現了,這些搭配裏面出場率最高的就是這雙漆皮的長靴,還有一個黑色的小手包。其實這樣元素簡單的單品才更加百搭,不管穿什麼風格的衣服,都可以搭配。

本站聲明:網站內容來源於http://www.shelive.net/,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

※聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

※新手該如何選擇電子菸口味及濃度呢?

※你應該要知道的電子煙懶人包!

電子煙有爭議?真相解密

※全台最大電子煙交易平台?

宋祖兒運動寬鬆的服裝現身機場

時尚的單品有很多,不同服裝的形式能帶給人不同的視覺效果,比如說緊身形式的服裝會給人一種性感誘惑的味道,那麼運動寬鬆的服裝就會很有活力,同時還能讓自己變得十分的減齡,但是要說最能讓人感覺到一種舒適的服裝是什麼的話,那就應該是慵懶的日系服裝了,這種類型的服裝能讓自己變得非常的舒適,身心也放鬆了,這樣就能讓自己時時刻刻都是很輕鬆的,或者說這種服裝更加的像是居家服一樣的效果,想想就知道是多麼舒適的一種服裝形式了

這種類型的服裝也有很多,其中比較常見的就是休閑服或者是寬鬆的闊腿褲,從不同的服裝單品當中,讓自己變得更加的順心一點,這也是娛樂圈中很多的明星喜歡的一種服裝形式,因為明星們在平時的活動或者是拍攝作品當中,都是身穿的服裝很精緻,或者說是很拘謹,這樣終究是會讓自己變得不是很舒適,所以在私下的服裝風格就一定是寬鬆的服裝會更加的適合自己需要放鬆的身體

近日女星宋祖兒現身機場的時候就選擇的是慵懶裝,本身宋祖兒在現在的這個年紀當中,就應該是活潑快樂的,或者應該是充滿着動力的,所以宋祖兒和慵懶的日系服裝也是很相配的,同時宋祖兒還有嗲嬰兒肥,所以當這樣的一身慵懶的造型和宋祖兒相配的時候,會增加宋祖兒的可愛感覺

這次在機場的宋祖兒還是將自己的黑色短髮散落着,因為顏值上的優勢,所以宋祖兒也沒有將自己的短髮進行搭理,散落又帶着一點凌亂的髮型,讓宋祖兒多了一點灑脫的味道,宋祖兒這次還是上着淡妝的,這樣的宋祖兒顯得還是很真實的,帶着框架眼鏡感覺上更加的文藝了一點,宋祖兒的臉雖然是有點肉感的,不過還是精緻的瓜子臉的,看到宋祖兒的小肉臉,感覺就算是不減肥,這樣肉肉的也是很好看的

宋祖兒身穿的服裝也是運動的味道,並且很是簡單,看着宋祖兒的造型還是很少女的,宋祖兒身穿着黑白拼接的條紋V領毛衫,寬鬆的符篆形式顯得宋祖兒也是很嬌小的,在毛衫之內宋祖兒內搭着一件白色的圓領T恤,這樣的搭配是很保暖的,並且也讓自己的造型更加的有層次感了

不過黑白條紋的服裝還是會有點單調的,所以宋祖兒在自己的胸前加上了藍紅色的包帶,胸包的形式很容易將自己的時尚段位提升,這也是宋祖兒的一種心機時尚吧,從小地方着手讓自己看着就是以為小潮人

在條紋毛衫之下,宋祖兒的下身搭配着一條更加寬鬆的淺色長褲,褲裝是直筒褲的形式,雖然沒有線條感,但是卻也能感覺出來宋祖兒的顯瘦感覺,加上一雙白色的平底鞋,會讓自己的造型變得更加的舒適一點,同時也是很方便運動的

本站聲明:網站內容來源於http://www.shelive.net/,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

※聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

※新手該如何選擇電子菸口味及濃度呢?

※你應該要知道的電子煙懶人包!

電子煙有爭議?真相解密

※全台最大電子煙交易平台?

這4款穿搭示範,時髦又有范

過臀收腰的外套,收腰設計提高腰線位置,顯高,寬鬆的版型,外套更顯瘦。搭配毛呢短褲還能彰顯大長腿,再配上一雙黑色靴子+打底褲,保暖,時尚范。

冬天,拼接羊羔絨外套,時尚又顯瘦。很保暖。肉色打底襪搭配毛呢短褲,腳一雙過膝靴,這麼搭配就又美又暖了。

冬天,毛茸茸的領子,時尚又保暖。收腰設計提高腰線位置,顯高。搭配短褲,打造下半身消失裝。搭配一雙靴子,高挑顯瘦,時尚又氣質。

少女心的加絨衛衣,減齡又保暖。配一條黑色短褲,大秀好身材。腳黑色靴子+打底褲,保暖。日常約會很哦。

本站聲明:網站內容來源於http://www.shelive.net/,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

※聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

※新手該如何選擇電子菸口味及濃度呢?

※你應該要知道的電子煙懶人包!

電子煙有爭議?真相解密

※全台最大電子煙交易平台?

樓高31層卻賣出33層房產

原標題:樓高31層卻賣出33層房產

  雲南昆明的高女士遇到鬧心事,她2017年在龍湖半山樓盤內部認購了一套位於33層的房屋,但發現近期封頂的樓房只有31層。她為這套不存在的“空氣房”維權至今,房款和房屋都無着落。目前,這個樓盤共有190餘套違規預售房產生糾紛。

  儘管國家三令五申禁止未取得預售許可證提前賣房,但未批先售行為屢禁不絕,消費者維權困難,深陷錢房兩空的境地。

  簽認購協議買到“空氣房”

  位於雲南昆明經濟技術開發區的龍湖半山樓盤6棟高層樓房近期封頂。據了解,這個項目今年3月才拿到預售許可證,但早在2016年,就以內部團購的名義在銷售。

  高女士稱,2017年1月,在銷售人員申某的推銷下,她簽訂了“團體認購協議”,以每平方米3200元的“內部價”購買了3棟33層A1號住房,房款35萬餘元,首付30%,交房時間為2018年6月30日前。

  早已過了交房時間,樓房遲遲未能完工。近期高女士聽說封頂了,趕忙來確認。“沒想到我買的3棟總共只有31層,根本就沒有33層!”她氣憤地說。

  該項目開發商――雲南天駿房地產開發有限公司回應稱,賣房給高女士的銷售公司沒有獲得授權,使用的公章是假章,購房款也沒有進入天駿公司賬戶,“此前的認購協議無效,與天駿公司無關,請走司法程序。”

  記者調查發現,就在高女士等業主交付認購金后不久,天駿公司資金鏈斷裂導致項目停工。2018年,債權人重組了公司,更換了法定代表人和管理層,項目重新開工。在這場房企內部債務糾紛中,196套違規預售房變成了“空中樓閣”,購房款也不知去向。

  違規預售是國家多年來三令五申的治理重點,但一些房地產公司通過內部認購等說法依然我行我素。西安的李女士2016年4月內部認購了紫杉莊園一處房產,並支付了全部房款。後來因房價大幅上漲,開發商以程序違規為由提出認購協議無效。

  看似合規的認購協議為何“一推就倒”?接受了多起商品房銷售糾紛諮詢和代理的雲南冰鑒律師事務所執行主任陳澤表示,內部認購不受法律保護,雖然簽訂了協議,但由於無法進行網簽備案,房屋可以被再次出售,甚至用於抵押。

  違規預售成為行業“慣例”

  2018年6月,住建部聯合六部委在全國30個城市開展治理房地產市場亂象專項行動。記者從雲南省住房和城鄉建設廳房地產市場監管處了解到,雲南省共檢查了2166個項目,處理637起,違規銷售不在少數。

  2019年6月,雲南省住建廳下發《關於持續開展房地產市場亂象整治工作的通知》,查處亂象144件,其中涉及不按期交房、違規銷售等佔67%。

  開發商為何頂風違規預售?多位業內人士表示,開發商都希望能加快資金回籠速度,多年來,種種原因導致預售許可規定停留在紙上,違規預售反而成了行業“慣例”,只要不出問題,一般也就無人過問。

  出售“空氣房”的龍湖半山樓盤曾在長達數月的時間里,堂而皇之地在售樓部公開未批先售為何沒人管?

  昆明市經開區住建局回應稱,經開區商品房預售管理及許可證發放工作由昆明市住建局負責,未辦理預售許可的違法違規行為查處由昆明市城市管理綜合行政執法局負責,該局沒有對違法預售行為的調查處理權限。而昆明市住建局局長陳漢表示,房屋預售按照要求確實由市局審批,但監管則由市區兩級住建局一起進行。

  對於違規預售如何處罰?雲南省住建廳房地產市場監管處副處長張靈介紹,根據《城市房地產開發經營管理條例》規定,“擅自預售商品房,沒收違法所得,可以並處已收取的預付款1%以下的罰款。”她認為,違法所得難以界定,沒收也難以執行,“購房款都是老百姓的錢”。

  受訪住建部門相關負責人表示,內部認購通常發生在資金運轉困難或爛尾重組的樓盤,在執法中如果處罰過重、罰款過多,容易導致企業資金鏈再次斷裂,更加損害購房者的權益。

  違法成本低需加大監管處罰

  早在2010年,住建部就明確規定:未取得商品房預售許可,以內部認購等名義向購房者收取誠意金或房款,屬於違規銷售。

  記者近日了解到,昆明市住建局已將龍湖半山樓盤780套房源全部鎖定,停止網簽備案,並要求企業妥善處理196戶涉及的問題。該樓盤開發商承諾,不逃避應承擔的責任,並制定提交了對應的初步處置方案:要求退款的客戶予以退款,要房的客戶結合目前房價予以優惠,“空氣房”可更換同戶型房源,不能達成一致的建議走司法程序。

  國家明確要求,各地要切實履行房地產市場監管的主體責任,根據本地區實際情況,制定工作方案,細化工作任務,全面排查、精準打擊。

  “監管與處罰應該監管前置,處罰只是一種手段而不是目的,房地產企業違規違法行為應及早制止,這需要各級主管部門積極研究管理辦法,創新管理手段。”中國人民大學法學院教授劉俊海說,住建部門不應“坐堂執法”,要走進市場,深入問題最突出、消費者利益受侵害最嚴重的一些領域,精準監管和執法。

  雲南省房地產業協會監事周大研認為,違法成本太低,懲罰力度不夠,難以對房企起到震懾作用。“現行的違規懲處力度並未成為房企的‘高壓線’,如果僅靠行業自律,企業難免會鋌而走險。”

  雲南凌雲律師事務所副主任孫文傑律師說,如存在銷售“空氣房”、非法佔有款項等情況,涉嫌構成偽造合同詐騙罪等,應協同公安機關介入,嚴厲打擊違法犯罪行為。

  專家提醒,各級住建部門在門戶網站上公布了樓盤預售許可信息,消費者購房時,應查看樓盤《商品房預售許可證》,對未取得該證的項目,不要購買或支付定金。

  據新華社

(責編:孫紅麗、畢磊)

【其他文章推薦】

實木地板、海島型地板、耐磨地板怎麼挑? 木地板三倍價差的秘密!!

※新屋購入,尋找台中室內設計師?是否可先免費估價丈量?

※挑好磚一點都不難!馬賽克磚挑選眉角小撇步!

※想知道北部最多平價、庫存出清的家具工廠推薦在哪裡?

※分享木質地板DIY自行施工教學影片

泰山家具工廠種類樣式多,平價優惠好選擇!

會所被賣 功能能改嗎?

原標題:會所被賣 功能能改嗎?

  裝修豪華設備齊全的高大上會所成為樓盤“賣點”。

  買房時,裝修豪華設備齊全的高大上會所吸引了業主們的眼球,也成為開發商着重宣傳的賣點。可入住小區多年後,會所突然停止對外開放,原來是被出售了。事實上,近年來關於會所變賣的糾紛不少,近日,珠江新城一小區業主就因小區會所被出售,要求發展商恢復會所功能而提起了訴訟。

  文/圖:廣州日報全媒體記者 劉麗琴

  【案例】

  入住七年 珠江新城豪華會所被出售

  “當年我們小區的會所也算珠江新城最豪華的會所之一了,不少人是看到高大上的會所,覺得小區配套不錯,而下定購買決心的。”珠江新城星匯雲錦業主林先生告訴記者,業主購買開發商的房子,其中一個因素就是因為具有會所服務。在購房時的各種宣傳單上可以看到,1~4號樓第四層是6000平方米集運動、休閑、娛樂於一體的豪華會所,包括天幕恆溫泳池、宴會房、健身房等,收樓時的《住戶手冊》《前期物業管理合同》上也明確显示小區配有會所,剛入住時還贈送給業主一些會所設施使用費用,對於喜歡運動休閑的業主而言非常受用,但沒想到入住七年後,會所卻被對外出售了。據悉,目前,新的私人業主將位於第四層會所的2500平方米租給了健身公司,3000平方米已租給了餐廳,健身公司旁的500平方米的原棋牌室位置待租中。

  對於當年作為買樓“賣點”的會所就這樣沒有了,業主們當然是不樂意的,在和發展商溝通過程中了解到,會所產權屬於發展商,對外出售後新業主會保留會所的部分功能。而面對目前會所租賃情況,業主擔心會所的功能還會發生變化,因此要求發展商恢復會所功能,在溝通無效后,只好走上訴訟的道路。近日,小區業委會以個人業主的名義將發展商告上法庭。

  【分析】入住後會所紛紛“消失”為哪般?

  業內人士表示,會所實際上最早是在香港興起,由於所建樓盤的戶型面積普遍偏小,業主非常需要一個能夠健身、娛樂、休閑以及招待親朋好友、舉行家庭活動的場所,於是會所應運而生。會所進入內地后逐漸演變成一種賣房的“門面”,甚至成為豪宅的標配。售樓時不少樓盤大肆渲染會所的功能和檔次,將其作為樓盤的賣點。對於不少業主而言,會所展示和代表了一種體面的生活方式。不過,在樓盤完成銷售之後,會所該如何經營成為不小的問題。由於小區會所相對封閉,經營模式及後期的維護成本讓大部分會所處於虧本狀態,開發商選擇將這一賠本的買賣出售或出租的不少。

  可以看到,近年來有關會所的糾紛不少。不只是廣州,北京、上海等各地都有不少類似案例:買樓時承諾並展現的美輪美奐的“會所”使用幾年後消失,或是交樓后發展商改變用途不兌現承諾的比比皆是。更讓業主介意的是,不僅會所沒有了,還因為場地出租或出售變成了各種共享辦公空間、公寓、培訓機構、洗浴中心、餐廳等,給居住生活帶來影響。

  業內人士表示,根據物業服務標準,多大面積的小區要配備多少個門崗是有要求的,但沒有規定過多大面積的小區配套多大的會所。小區是否配置會所,會所是什麼檔次,基本是開發商根據自身品牌的要求來規劃設置。房屋在辦理產證時包括住宅、商業或其他等類型,還有配套用房等,比如,物業的辦公場所就屬於配套用房性質,但小區會所卻並未做過過多規定,也不屬於強制要求的配套用房之列。因此,不少發展商將小區商業裙樓部分規劃為會所,產權屬於發展商。近年來,關於小區會所產生的糾紛,有些是屬於公建配套部分,而更多的是產權屬於發展商的。業主們拿着開發商當年的樓書、宣傳廣告進行維權時發現並不容易。

  【觀察】會所問題應由誰來監管?

  林先生告訴記者,目前小區狀告發展商要求恢復會所的官司已經開庭。由於會所物業性質是商業,產權是發展商的,從法律上來講發展商有權變賣。業主們的訴求是要求其功能不能改變,一定要是文體用房,因為最初跟發展商簽的售住宅合約里有列明,6000平方米的4樓是國土局規劃為文體用房。

  業內人士表示,各地都出現小區會所被變賣消失的情況,或許與相關監管措施模糊,業主們難以維權相關。單個業主可以拿着當年的樓書、宣傳冊去法院告開發商虛假宣傳,可能會判賠一些違約金。如果以小區業委會去法院起訴開發商不管理會所,可能根本不會受理,因為產權都不是你的。目前適用於會所糾紛的主要是《人民法院關於審理商品房買賣合同糾紛案件適用法律若干問題的解釋》第三條規定:商品房的銷售廣告和宣傳資料為要約邀請,但是出賣人就商品房開發規劃範圍內的房屋及相關設施所作的說明和允諾具體確定,並對商品房買賣合同的訂立以及房屋價格的確定有重大影響的,應當視為要約。該說明和允諾即使未載入商品房買賣合同,亦應當視為合同內容,當事人違反的,應當承擔違約責任。

  從已經判決的一些類似案例來看,如果會所房屋為開發商所有,開發商享有處分權,因此開發商轉讓會所房屋的行為是合法的。在售樓期間以及合同中承諾有會所的,在轉讓時一般是存在前提條件的,即“不影響會所使用”。如果轉讓會所后,業主與開發商簽訂房屋買賣合同時約定的會所功能完全喪失,雖然涉案房屋物權發生了轉移,但《合同》中所約定的權利義務並未發生轉移,開發商應當承擔違約責任,給予業主適當補償。北京就有小區因會所被賣,法院判決,根據業主的房屋面積不同,發展商分別補償20多位業主1萬~3萬元不等的經濟損失。

  有業主對記者表示,無論從生活舒適度、小區品質的提升,還是從對房價的影響上來講,其實更希望恢復會所的功能,而不是類似一些判例中的業主一樣獲得一兩萬元的賠償。開發商以會所做售樓宣傳,最終卻因經營問題或經濟利益等原因令會所服務無法實現,致使合同約定的義務和政府批準的規劃內容成為虛設,業主們的權益如何得到保障,這樣的問題需要有更清晰的指引和監管措施。

(責編:孫紅麗、畢磊)

【其他文章推薦】

※居家隱形鐵窗安裝施作經驗分享

※分享木質地板DIY自行施工教學影片

※想要打造簡約、淡雅兼且收納空間的小資房,台中室內設計推薦哪一家?

※各項辦公家具採購清單,一次搞定!

※2020辦公家具購買網路推薦平台

※超質感設計!台中系統傢俱推薦